]> www.infradead.org Git - users/willy/linux.git/commitdiff
mm/slub: Convert on_freelist() to struct slab
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 2 Oct 2021 02:11:42 +0000 (22:11 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 4 Oct 2021 13:18:00 +0000 (09:18 -0400)
Improves type safety as well as pushing down calls to slab_page().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
mm/slub.c

index fd11ca47bce89c48f2b47d4d2b1f5d3b447860d6..10db0ce7fe2a05f6edc2b3ec46763856af8377cf 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1111,29 +1111,29 @@ static int check_slab(struct kmem_cache *s, struct page *page)
 }
 
 /*
- * Determine if a certain object on a page is on the freelist. Must hold the
+ * Determine if a certain object in a slab is on the freelist. Must hold the
  * slab lock to guarantee that the chains are in a consistent state.
  */
-static int on_freelist(struct kmem_cache *s, struct page *page, void *search)
+static int on_freelist(struct kmem_cache *s, struct slab *slab, void *search)
 {
        int nr = 0;
        void *fp;
        void *object = NULL;
        int max_objects;
 
-       fp = page->freelist;
-       while (fp && nr <= page->objects) {
+       fp = slab->freelist;
+       while (fp && nr <= slab->objects) {
                if (fp == search)
                        return 1;
-               if (!check_valid_pointer(s, page, fp)) {
+               if (!check_valid_pointer(s, slab_page(slab), fp)) {
                        if (object) {
-                               object_err(s, page, object,
+                               object_err(s, slab_page(slab), object,
                                        "Freechain corrupt");
                                set_freepointer(s, object, NULL);
                        } else {
-                               slab_err(s, page, "Freepointer corrupt");
-                               page->freelist = NULL;
-                               page->inuse = page->objects;
+                               slab_err(s, slab_page(slab), "Freepointer corrupt");
+                               slab->freelist = NULL;
+                               slab->inuse = slab->objects;
                                slab_fix(s, "Freelist cleared");
                                return 0;
                        }
@@ -1144,20 +1144,20 @@ static int on_freelist(struct kmem_cache *s, struct page *page, void *search)
                nr++;
        }
 
-       max_objects = order_objects(compound_order(page), s->size);
+       max_objects = order_objects(slab_order(slab), s->size);
        if (max_objects > MAX_OBJS_PER_PAGE)
                max_objects = MAX_OBJS_PER_PAGE;
 
-       if (page->objects != max_objects) {
-               slab_err(s, page, "Wrong number of objects. Found %d but should be %d",
-                        page->objects, max_objects);
-               page->objects = max_objects;
+       if (slab->objects != max_objects) {
+               slab_err(s, slab_page(slab), "Wrong number of objects. Found %d but should be %d",
+                        slab->objects, max_objects);
+               slab->objects = max_objects;
                slab_fix(s, "Number of objects adjusted");
        }
-       if (page->inuse != page->objects - nr) {
-               slab_err(s, page, "Wrong object count. Counter is %d but counted were %d",
-                        page->inuse, page->objects - nr);
-               page->inuse = page->objects - nr;
+       if (slab->inuse != slab->objects - nr) {
+               slab_err(s, slab_page(slab), "Wrong object count. Counter is %d but counted were %d",
+                        slab->inuse, slab->objects - nr);
+               slab->inuse = slab->objects - nr;
                slab_fix(s, "Object count adjusted");
        }
        return search == NULL;
@@ -1315,7 +1315,7 @@ static inline int free_consistency_checks(struct kmem_cache *s,
                return 0;
        }
 
-       if (on_freelist(s, slab_page(slab), object)) {
+       if (on_freelist(s, slab, object)) {
                object_err(s, slab_page(slab), object, "Object already free");
                return 0;
        }
@@ -4959,7 +4959,7 @@ static void validate_slab(struct kmem_cache *s, struct slab *slab,
 
        slab_lock(slab_page(slab), &flags);
 
-       if (!check_slab(s, slab_page(slab)) || !on_freelist(s, slab_page(slab), NULL))
+       if (!check_slab(s, slab_page(slab)) || !on_freelist(s, slab, NULL))
                goto unlock;
 
        /* Now we know that a valid freelist exists */