Rev 765 | Rev 767 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 765 | Rev 766 | ||
|---|---|---|---|
| Line 86... | Line 86... | ||
| 86 | slab = data + fsize - sizeof(*slab); |
86 | slab = data + fsize - sizeof(*slab); |
| 87 | } |
87 | } |
| 88 | 88 | ||
| 89 | /* Fill in slab structures */ |
89 | /* Fill in slab structures */ |
| 90 | /* TODO: some better way of accessing the frame */ |
90 | /* TODO: some better way of accessing the frame */ |
| 91 | for (i=0; i< (1<<cache->order); i++) { |
91 | for (i=0; i < (1 << cache->order); i++) { |
| 92 | frame = ADDR2FRAME(zone, KA2PA((__address)(data+i*PAGE_SIZE))); |
92 | frame = ADDR2FRAME(zone, KA2PA((__address)(data+i*PAGE_SIZE))); |
| 93 | frame->parent = slab; |
93 | frame->parent = slab; |
| 94 | } |
94 | } |
| 95 | 95 | ||
| 96 | slab->start = data; |
96 | slab->start = data; |
| Line 104... | Line 104... | ||
| 104 | 104 | ||
| 105 | return slab; |
105 | return slab; |
| 106 | } |
106 | } |
| 107 | 107 | ||
| 108 | /** |
108 | /** |
| 109 | * Free space associated with SLAB |
109 | * Deallocate space associated with SLAB |
| 110 | * |
110 | * |
| 111 | * @return number of freed frames |
111 | * @return number of freed frames |
| 112 | */ |
112 | */ |
| 113 | static count_t slab_space_free(slab_cache_t *cache, slab_t *slab) |
113 | static count_t slab_space_free(slab_cache_t *cache, slab_t *slab) |
| 114 | { |
114 | { |
| Line 149... | Line 149... | ||
| 149 | count_t frames = 0; |
149 | count_t frames = 0; |
| 150 | 150 | ||
| 151 | if (!slab) |
151 | if (!slab) |
| 152 | slab = obj2slab(obj); |
152 | slab = obj2slab(obj); |
| 153 | 153 | ||
| 154 | spinlock_lock(&cache->lock); |
- | |
| 155 | - | ||
| 156 | *((int *)obj) = slab->nextavail; |
154 | *((int *)obj) = slab->nextavail; |
| 157 | slab->nextavail = (obj - slab->start)/cache->size; |
155 | slab->nextavail = (obj - slab->start)/cache->size; |
| 158 | slab->available++; |
156 | slab->available++; |
| 159 | 157 | ||
| 160 | /* Move it to correct list */ |
158 | /* Move it to correct list */ |
| Line 170... | Line 168... | ||
| 170 | spinlock_unlock(&cache->lock); |
168 | spinlock_unlock(&cache->lock); |
| 171 | frames = slab_space_free(cache, slab); |
169 | frames = slab_space_free(cache, slab); |
| 172 | spinlock_lock(&cache->lock); |
170 | spinlock_lock(&cache->lock); |
| 173 | } |
171 | } |
| 174 | 172 | ||
| 175 | spinlock_unlock(&cache->lock); |
- | |
| 176 | - | ||
| 177 | return frames; |
173 | return frames; |
| 178 | } |
174 | } |
| 179 | 175 | ||
| 180 | /** |
176 | /** |
| 181 | * Take new object from slab or create new if needed |
177 | * Take new object from slab or create new if needed |
| Line 386... | Line 382... | ||
| 386 | int i; |
382 | int i; |
| 387 | 383 | ||
| 388 | memsetb((__address)cache, sizeof(*cache), 0); |
384 | memsetb((__address)cache, sizeof(*cache), 0); |
| 389 | cache->name = name; |
385 | cache->name = name; |
| 390 | 386 | ||
| 391 | if (align) |
387 | if (align < sizeof(__native)) |
| - | 388 | align = sizeof(__native); |
|
| 392 | size = ALIGN_UP(size, align); |
389 | size = ALIGN_UP(size, align); |
| - | 390 | ||
| 393 | cache->size = size; |
391 | cache->size = size; |
| 394 | 392 | ||
| 395 | cache->constructor = constructor; |
393 | cache->constructor = constructor; |
| 396 | cache->destructor = destructor; |
394 | cache->destructor = destructor; |
| 397 | cache->flags = flags; |
395 | cache->flags = flags; |
| Line 409... | Line 407... | ||
| 409 | /* Compute slab sizes, object counts in slabs etc. */ |
407 | /* Compute slab sizes, object counts in slabs etc. */ |
| 410 | if (cache->size < SLAB_INSIDE_SIZE) |
408 | if (cache->size < SLAB_INSIDE_SIZE) |
| 411 | cache->flags |= SLAB_CACHE_SLINSIDE; |
409 | cache->flags |= SLAB_CACHE_SLINSIDE; |
| 412 | 410 | ||
| 413 | /* Minimum slab order */ |
411 | /* Minimum slab order */ |
| 414 | cache->order = (cache->size >> PAGE_WIDTH) + 1; |
412 | cache->order = (cache->size-1) >> PAGE_WIDTH; |
| 415 | 413 | ||
| 416 | while (badness(cache) > SLAB_MAX_BADNESS(cache)) { |
414 | while (badness(cache) > SLAB_MAX_BADNESS(cache)) { |
| 417 | cache->order += 1; |
415 | cache->order += 1; |
| 418 | } |
416 | } |
| 419 | - | ||
| 420 | cache->objects = comp_objects(cache); |
417 | cache->objects = comp_objects(cache); |
| - | 418 | /* If info fits in, put it inside */ |
|
| - | 419 | if (badness(cache) > sizeof(slab_t)) |
|
| - | 420 | cache->flags |= SLAB_CACHE_SLINSIDE; |
|
| 421 | 421 | ||
| 422 | spinlock_lock(&slab_cache_lock); |
422 | spinlock_lock(&slab_cache_lock); |
| 423 | 423 | ||
| 424 | list_append(&cache->link, &slab_cache_list); |
424 | list_append(&cache->link, &slab_cache_list); |
| 425 | 425 | ||
| Line 594... | Line 594... | ||
| 594 | { |
594 | { |
| 595 | slab_cache_t *cache; |
595 | slab_cache_t *cache; |
| 596 | link_t *cur; |
596 | link_t *cur; |
| 597 | 597 | ||
| 598 | spinlock_lock(&slab_cache_lock); |
598 | spinlock_lock(&slab_cache_lock); |
| 599 | printf("SLAB name\tOsize\tOrder\tOcnt\tSlabs\tAllocobjs\n"); |
599 | printf("SLAB name\tOsize\tPages\tOcnt\tSlabs\tAllocobjs\tCtl\n"); |
| 600 | for (cur = slab_cache_list.next;cur!=&slab_cache_list; cur=cur->next) { |
600 | for (cur = slab_cache_list.next;cur!=&slab_cache_list; cur=cur->next) { |
| 601 | cache = list_get_instance(cur, slab_cache_t, link); |
601 | cache = list_get_instance(cur, slab_cache_t, link); |
| 602 | printf("%s\t%d\t%d\t%d\t%d\t%d\n", cache->name, cache->size, |
602 | printf("%s\t%d\t%d\t%d\t%d\t%d\t\t%s\n", cache->name, cache->size, |
| 603 | cache->order, cache->objects, |
603 | (1 << cache->order), cache->objects, |
| 604 | atomic_get(&cache->allocated_slabs), |
604 | atomic_get(&cache->allocated_slabs), |
| 605 | atomic_get(&cache->allocated_objs)); |
605 | atomic_get(&cache->allocated_objs), |
| - | 606 | cache->flags & SLAB_CACHE_SLINSIDE ? "In" : "Out"); |
|
| 606 | } |
607 | } |
| 607 | spinlock_unlock(&slab_cache_lock); |
608 | spinlock_unlock(&slab_cache_lock); |
| 608 | } |
609 | } |
| 609 | 610 | ||
| 610 | void slab_cache_init(void) |
611 | void slab_cache_init(void) |