--- mm/slub.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) Index: slub/mm/slub.c =================================================================== --- slub.orig/mm/slub.c 2007-05-14 13:47:58.000000000 -0700 +++ slub/mm/slub.c 2007-05-14 16:47:12.000000000 -0700 @@ -2289,6 +2289,39 @@ size_t ksize(const void *object) } EXPORT_SYMBOL(ksize); +/* + * Order the freelist so that optimal allocation behavior is + * possible. + */ +void resequence_freelist(struct kmem_cache *s, struct page *page) +{ + void *p; + void *last; + void *addr = page_address(page); + DECLARE_BITMAP(map, s->objects); + + bitmap_zero(map, s->objects); + + /* Figure out which objects are on the freelist */ + for_each_free_object(p, s, page->freelist) + set_bit(slab_index(p, s, addr), map); + + last = NULL; + for_each_object(p, s, addr) + if (test_bit(slab_index(p, s, addr), map)) { + if (last) + set_freepointer(last, p); + else + page->freelist = last; + last = p; + } + + if (last) + set_freepointer(last, NULL); + else + page->freelist = NULL; +} + void kfree(const void *x) { struct kmem_cache *s;