I think you meanOf course.
static inline struct kmem_cache *slab_get_cache(const void *obj)
{
struct kmem_cache **p = (void *)((unsigned long) obj & ~(PAGE_SIZE-1));
return *p;
}
On Tue, 9 May 2006, Manfred Spraul wrote:No - it would only make sense if it could be used for all slabs. Otherwise: How should kfree figure out if it's called for a slab with embedded pointers or not?
The result would be a few small restrictions: all objects must start in the
first page of a slab (there are no exceptions on my 2.6.16 system), and
PAGE_SIZE'd caches are very expensive. Replacing the names_cache with
get_free_page is trivial. That leaves the pgd cache.
Your plan makes sense for slabs that have slab management structures embedded within.
We already have enough free space there for one pointer due toHow many kmalloc(PAGE_SIZE*n) users are there?
colour_off += cachep->slab_size;
in the alloc_slabmgmt() function, I think. Are you planning to kill external slab management allocation completely by switching to get_free_pages() for those cases? I'd much rather make the switch to page allocator under the hood so kmalloc(PAGE_SIZE*n) would still work because it's much nicer API.