Re: [PATCH] fs: fcntl_setlease defies lease_init assumptions

From: Pekka J Enberg
Date: Tue May 09 2006 - 06:25:56 EST


On Tue, 9 May 2006, Manfred Spraul wrote:
> Probably the allocator should be rewritten, without relying on virt_to_page().
> Any proposals how kfree and kmem_cache_free could locate the cachep pointer?
> That's the performance critical part.
>
> Right's now it's
> <<<
> page = vir_to_page(objp)
> if (unlikely(PageCompound(page)))
> page = (struct page *)page_private(page);
> cachep = (struct kmem_cache *)page->lru.next;
> >>>
>
> What about:
> - switch from power of two kmalloc caches to slighly smaller caches.
> - change the kmalloc(PAGE_SIZE) users to get_free_page(). get_free_page() is
> now fast, too.
> - use cachep= *((struct kmem_cache **)(objp & 0xfff))

I think you mean

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:
> 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 to

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.

Pekka
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/