--- mm/slub.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) Index: linux-2.6/mm/slub.c =================================================================== --- linux-2.6.orig/mm/slub.c 2007-09-13 19:10:08.000000000 -0700 +++ linux-2.6/mm/slub.c 2007-09-13 19:12:22.000000000 -0700 @@ -285,7 +285,7 @@ static inline int check_valid_pointer(st if (!object) return 1; - base = page_address(page); + base = compound_address(page); if (object < base || object >= base + s->objects * s->size || (object - base) % s->size) { return 0; @@ -470,7 +470,7 @@ static void slab_fix(struct kmem_cache * static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p) { unsigned int off; /* Offset of last byte */ - u8 *addr = page_address(page); + u8 *addr = compound_address(page); print_tracking(s, p); @@ -648,7 +648,7 @@ static int slab_pad_check(struct kmem_ca if (!(s->flags & SLAB_POISON)) return 1; - start = page_address(page); + start = compound_address(page); end = start + (PAGE_SIZE << s->order); length = s->objects * s->size; remainder = end - (start + length); @@ -1050,7 +1050,7 @@ static struct page *allocate_slab(struct int pages = 1 << s->order; if (s->order) - flags |= __GFP_COMP; + flags |= __GFP_COMP | __GFP_VMALLOC; if (s->flags & SLAB_CACHE_DMA) flags |= SLUB_DMA; @@ -1107,7 +1107,7 @@ static struct page *new_slab(struct kmem SLAB_STORE_USER | SLAB_TRACE)) SetSlabDebug(page); - start = page_address(page); + start = compound_address(page); end = start + s->objects * s->size; if (unlikely(s->flags & SLAB_POISON)) @@ -1139,7 +1139,7 @@ static void __free_slab(struct kmem_cach void *p; slab_pad_check(s, page); - for_each_object(p, s, page_address(page)) + for_each_object(p, s, compound_address(page)) check_object(s, page, p, 0); ClearSlabDebug(page); } @@ -2814,7 +2814,7 @@ static int validate_slab(struct kmem_cac unsigned long *map) { void *p; - void *addr = page_address(page); + void *addr = compound_address(page); if (!check_slab(s, page) || !on_freelist(s, page, NULL)) @@ -3094,7 +3094,7 @@ static int add_location(struct loc_track static void process_slab(struct loc_track *t, struct kmem_cache *s, struct page *page, enum track_item alloc) { - void *addr = page_address(page); + void *addr = compound_address(page); DECLARE_BITMAP(map, s->objects); void *p;