[PATCH] slab: page mapping cleanup
authorPekka Enberg <penberg@cs.helsinki.fi>
Fri, 23 Jun 2006 09:03:07 +0000 (02:03 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 23 Jun 2006 14:42:46 +0000 (07:42 -0700)
Clean up slab allocator page mapping a bit.  The memory allocated for a
slab is physically contiguous so it is okay to assume struct pages are too
so kill the long-standing comment.  Furthermore, rename set_slab_attr to
slab_map_pages and add a comment explaining why its needed.

Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
mm/slab.c

index bf05ea900ce87f5e41be6d3103d7a6f746c609dc..a94cf0fea8a2deffab0eabe95ad051e3d9b5b306 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2499,23 +2499,28 @@ static void slab_put_obj(struct kmem_cache *cachep, struct slab *slabp,
        slabp->inuse--;
 }
 
-static void set_slab_attr(struct kmem_cache *cachep, struct slab *slabp,
-                       void *objp)
+/*
+ * Map pages beginning at addr to the given cache and slab. This is required
+ * for the slab allocator to be able to lookup the cache and slab of a
+ * virtual address for kfree, ksize, kmem_ptr_validate, and slab debugging.
+ */
+static void slab_map_pages(struct kmem_cache *cache, struct slab *slab,
+                          void *addr)
 {
-       int i;
+       int nr_pages;
        struct page *page;
 
-       /* Nasty!!!!!! I hope this is OK. */
-       page = virt_to_page(objp);
+       page = virt_to_page(addr);
 
-       i = 1;
+       nr_pages = 1;
        if (likely(!PageCompound(page)))
-               i <<= cachep->gfporder;
+               nr_pages <<= cache->gfporder;
+
        do {
-               page_set_cache(page, cachep);
-               page_set_slab(page, slabp);
+               page_set_cache(page, cache);
+               page_set_slab(page, slab);
                page++;
-       } while (--i);
+       } while (--nr_pages);
 }
 
 /*
@@ -2587,7 +2592,7 @@ static int cache_grow(struct kmem_cache *cachep, gfp_t flags, int nodeid)
                goto opps1;
 
        slabp->nodeid = nodeid;
-       set_slab_attr(cachep, slabp, objp);
+       slab_map_pages(cachep, slabp, objp);
 
        cache_init_objs(cachep, slabp, ctor_flags);