mm: Use struct slab in kmem_obj_info()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 2 Oct 2021 18:03:44 +0000 (14:03 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 4 Oct 2021 03:22:29 +0000 (23:22 -0400)
All three implementations of slab support kmem_obj_info() which reports
details of an object allocated from the slab allocator.  By using the
slab type instead of the page type, we make it obvious that this can
only be called for slabs.

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

index d0f725637663000ce14259df2e16b7f08cb7e504..4a6bdbdcf0dbda7afed5a91c1960927a38d9d5f8 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3657,21 +3657,21 @@ EXPORT_SYMBOL(__kmalloc_node_track_caller);
 #endif /* CONFIG_NUMA */
 
 #ifdef CONFIG_PRINTK
-void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
+void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab)
 {
        struct kmem_cache *cachep;
        unsigned int objnr;
        void *objp;
 
        kpp->kp_ptr = object;
-       kpp->kp_page = page;
-       cachep = page->slab_cache;
+       kpp->kp_slab = slab;
+       cachep = slab->slab_cache;
        kpp->kp_slab_cache = cachep;
        objp = object - obj_offset(cachep);
        kpp->kp_data_offset = obj_offset(cachep);
-       page = virt_to_head_page(objp);
-       objnr = obj_to_index(cachep, page, objp);
-       objp = index_to_obj(cachep, page, objnr);
+       slab = virt_to_slab(objp);
+       objnr = obj_to_index(cachep, slab_page(slab), objp);
+       objp = index_to_obj(cachep, slab_page(slab), objnr);
        kpp->kp_objp = objp;
        if (DEBUG && cachep->flags & SLAB_STORE_USER)
                kpp->kp_ret = *dbg_userword(cachep, objp);
index ac89b656de6737353f5ef64e42adc8edbbf76696..29a0bf827a8278341fdde47641c99668909ad7fe 100644 (file)
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -720,7 +720,7 @@ static inline void debugfs_slab_release(struct kmem_cache *s) { }
 #define KS_ADDRS_COUNT 16
 struct kmem_obj_info {
        void *kp_ptr;
-       struct page *kp_page;
+       struct slab *kp_slab;
        void *kp_objp;
        unsigned long kp_data_offset;
        struct kmem_cache *kp_slab_cache;
@@ -728,7 +728,7 @@ struct kmem_obj_info {
        void *kp_stack[KS_ADDRS_COUNT];
        void *kp_free_stack[KS_ADDRS_COUNT];
 };
-void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page);
+void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab);
 #endif
 
 #endif /* MM_SLAB_H */
index ec2bb0beed757cf2b143920b07b43fafeb9169f5..c2605c77920beace1ce7daadf7b97a1b9a6f99b5 100644 (file)
@@ -587,18 +587,18 @@ void kmem_dump_obj(void *object)
 {
        char *cp = IS_ENABLED(CONFIG_MMU) ? "" : "/vmalloc";
        int i;
-       struct page *page;
+       struct slab *slab;
        unsigned long ptroffset;
        struct kmem_obj_info kp = { };
 
        if (WARN_ON_ONCE(!virt_addr_valid(object)))
                return;
-       page = virt_to_head_page(object);
-       if (WARN_ON_ONCE(!PageSlab(page))) {
+       slab = virt_to_slab(object);
+       if (WARN_ON_ONCE(!slab_test_cache(slab))) {
                pr_cont(" non-slab memory.\n");
                return;
        }
-       kmem_obj_info(&kp, object, page);
+       kmem_obj_info(&kp, object, slab);
        if (kp.kp_slab_cache)
                pr_cont(" slab%s %s", cp, kp.kp_slab_cache->name);
        else
index 90996e8f7337233665df04f5d1ac2e4899776c70..8cede39054fcd6923345f7cf86bf9f3b528dfcd1 100644 (file)
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -462,10 +462,10 @@ out:
 }
 
 #ifdef CONFIG_PRINTK
-void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
+void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab)
 {
        kpp->kp_ptr = object;
-       kpp->kp_page = page;
+       kpp->kp_slab = slab;
 }
 #endif
 
index 2780342395dc672a65484d0fd8c774e21b0f470b..51745056184054878891eff27d1ae255fd8f4646 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4290,31 +4290,31 @@ int __kmem_cache_shutdown(struct kmem_cache *s)
 }
 
 #ifdef CONFIG_PRINTK
-void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
+void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab)
 {
        void *base;
        int __maybe_unused i;
        unsigned int objnr;
        void *objp;
        void *objp0;
-       struct kmem_cache *s = page->slab_cache;
+       struct kmem_cache *s = slab->slab_cache;
        struct track __maybe_unused *trackp;
 
        kpp->kp_ptr = object;
-       kpp->kp_page = page;
+       kpp->kp_slab = slab;
        kpp->kp_slab_cache = s;
-       base = page_address(page);
+       base = slab_address(slab);
        objp0 = kasan_reset_tag(object);
 #ifdef CONFIG_SLUB_DEBUG
        objp = restore_red_left(s, objp0);
 #else
        objp = objp0;
 #endif
-       objnr = obj_to_index(s, page, objp);
+       objnr = obj_to_index(s, slab_page(slab), objp);
        kpp->kp_data_offset = (unsigned long)((char *)objp0 - (char *)objp);
        objp = base + s->size * objnr;
        kpp->kp_objp = objp;
-       if (WARN_ON_ONCE(objp < base || objp >= base + page->objects * s->size || (objp - base) % s->size) ||
+       if (WARN_ON_ONCE(objp < base || objp >= base + slab->objects * s->size || (objp - base) % s->size) ||
            !(s->flags & SLAB_STORE_USER))
                return;
 #ifdef CONFIG_SLUB_DEBUG