Rev 4420 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4420 | Rev 4537 | ||
---|---|---|---|
Line 154... | Line 154... | ||
154 | /** Slab descriptor */ |
154 | /** Slab descriptor */ |
155 | typedef struct { |
155 | typedef struct { |
156 | slab_cache_t *cache; /**< Pointer to parent cache. */ |
156 | slab_cache_t *cache; /**< Pointer to parent cache. */ |
157 | link_t link; /**< List of full/partial slabs. */ |
157 | link_t link; /**< List of full/partial slabs. */ |
158 | void *start; /**< Start address of first available item. */ |
158 | void *start; /**< Start address of first available item. */ |
159 | count_t available; /**< Count of available items in this slab. */ |
159 | size_t available; /**< Count of available items in this slab. */ |
160 | index_t nextavail; /**< The index of next available item. */ |
160 | size_t nextavail; /**< The index of next available item. */ |
161 | } slab_t; |
161 | } slab_t; |
162 | 162 | ||
163 | #ifdef CONFIG_DEBUG |
163 | #ifdef CONFIG_DEBUG |
164 | static int _slab_initialized = 0; |
164 | static int _slab_initialized = 0; |
165 | #endif |
165 | #endif |
Line 175... | Line 175... | ||
175 | { |
175 | { |
176 | void *data; |
176 | void *data; |
177 | slab_t *slab; |
177 | slab_t *slab; |
178 | size_t fsize; |
178 | size_t fsize; |
179 | unsigned int i; |
179 | unsigned int i; |
180 | count_t zone = 0; |
180 | size_t zone = 0; |
181 | 181 | ||
182 | data = frame_alloc_generic(cache->order, FRAME_KA | flags, &zone); |
182 | data = frame_alloc_generic(cache->order, FRAME_KA | flags, &zone); |
183 | if (!data) { |
183 | if (!data) { |
184 | return NULL; |
184 | return NULL; |
185 | } |
185 | } |
Line 213... | Line 213... | ||
213 | /** |
213 | /** |
214 | * Deallocate space associated with slab |
214 | * Deallocate space associated with slab |
215 | * |
215 | * |
216 | * @return number of freed frames |
216 | * @return number of freed frames |
217 | */ |
217 | */ |
218 | static count_t slab_space_free(slab_cache_t *cache, slab_t *slab) |
218 | static size_t slab_space_free(slab_cache_t *cache, slab_t *slab) |
219 | { |
219 | { |
220 | frame_free(KA2PA(slab->start)); |
220 | frame_free(KA2PA(slab->start)); |
221 | if (! (cache->flags & SLAB_CACHE_SLINSIDE)) |
221 | if (! (cache->flags & SLAB_CACHE_SLINSIDE)) |
222 | slab_free(slab_extern_cache, slab); |
222 | slab_free(slab_extern_cache, slab); |
223 | 223 | ||
Line 241... | Line 241... | ||
241 | * |
241 | * |
242 | * @param slab If the caller knows directly slab of the object, otherwise NULL |
242 | * @param slab If the caller knows directly slab of the object, otherwise NULL |
243 | * |
243 | * |
244 | * @return Number of freed pages |
244 | * @return Number of freed pages |
245 | */ |
245 | */ |
246 | static count_t slab_obj_destroy(slab_cache_t *cache, void *obj, slab_t *slab) |
246 | static size_t slab_obj_destroy(slab_cache_t *cache, void *obj, slab_t *slab) |
247 | { |
247 | { |
248 | int freed = 0; |
248 | int freed = 0; |
249 | 249 | ||
250 | if (!slab) |
250 | if (!slab) |
251 | slab = obj2slab(obj); |
251 | slab = obj2slab(obj); |
Line 369... | Line 369... | ||
369 | /** |
369 | /** |
370 | * Free all objects in magazine and free memory associated with magazine |
370 | * Free all objects in magazine and free memory associated with magazine |
371 | * |
371 | * |
372 | * @return Number of freed pages |
372 | * @return Number of freed pages |
373 | */ |
373 | */ |
374 | static count_t magazine_destroy(slab_cache_t *cache, slab_magazine_t *mag) |
374 | static size_t magazine_destroy(slab_cache_t *cache, slab_magazine_t *mag) |
375 | { |
375 | { |
376 | unsigned int i; |
376 | unsigned int i; |
377 | count_t frames = 0; |
377 | size_t frames = 0; |
378 | 378 | ||
379 | for (i = 0; i < mag->busy; i++) { |
379 | for (i = 0; i < mag->busy; i++) { |
380 | frames += slab_obj_destroy(cache, mag->objs[i], NULL); |
380 | frames += slab_obj_destroy(cache, mag->objs[i], NULL); |
381 | atomic_dec(&cache->cached_objs); |
381 | atomic_dec(&cache->cached_objs); |
382 | } |
382 | } |
Line 647... | Line 647... | ||
647 | * Reclaim space occupied by objects that are already free |
647 | * Reclaim space occupied by objects that are already free |
648 | * |
648 | * |
649 | * @param flags If contains SLAB_RECLAIM_ALL, do aggressive freeing |
649 | * @param flags If contains SLAB_RECLAIM_ALL, do aggressive freeing |
650 | * @return Number of freed pages |
650 | * @return Number of freed pages |
651 | */ |
651 | */ |
652 | static count_t _slab_reclaim(slab_cache_t *cache, int flags) |
652 | static size_t _slab_reclaim(slab_cache_t *cache, int flags) |
653 | { |
653 | { |
654 | unsigned int i; |
654 | unsigned int i; |
655 | slab_magazine_t *mag; |
655 | slab_magazine_t *mag; |
656 | count_t frames = 0; |
656 | size_t frames = 0; |
657 | int magcount; |
657 | int magcount; |
658 | 658 | ||
659 | if (cache->flags & SLAB_CACHE_NOMAGAZINE) |
659 | if (cache->flags & SLAB_CACHE_NOMAGAZINE) |
660 | return 0; /* Nothing to do */ |
660 | return 0; /* Nothing to do */ |
661 | 661 | ||
Line 769... | Line 769... | ||
769 | { |
769 | { |
770 | _slab_free(cache, obj, NULL); |
770 | _slab_free(cache, obj, NULL); |
771 | } |
771 | } |
772 | 772 | ||
773 | /* Go through all caches and reclaim what is possible */ |
773 | /* Go through all caches and reclaim what is possible */ |
774 | count_t slab_reclaim(int flags) |
774 | size_t slab_reclaim(int flags) |
775 | { |
775 | { |
776 | slab_cache_t *cache; |
776 | slab_cache_t *cache; |
777 | link_t *cur; |
777 | link_t *cur; |
778 | count_t frames = 0; |
778 | size_t frames = 0; |
779 | 779 | ||
780 | spinlock_lock(&slab_cache_lock); |
780 | spinlock_lock(&slab_cache_lock); |
781 | 781 | ||
782 | /* TODO: Add assert, that interrupts are disabled, otherwise |
782 | /* TODO: Add assert, that interrupts are disabled, otherwise |
783 | * memory allocation from interrupts can deadlock. |
783 | * memory allocation from interrupts can deadlock. |