* [PATCH tip/core/rcu 0/2] mm_dump_obj() updates for v5.13
@ 2021-03-04 0:16 Paul E. McKenney
2021-03-04 0:17 ` [PATCH tip/core/rcu 1/2] mm: Don't build mm_dump_obj() on CONFIG_PRINTK=n kernels paulmck
2021-03-04 0:17 ` [PATCH tip/core/rcu 2/2] rcutorture: Add crude tests for mem_dump_obj() paulmck
0 siblings, 2 replies; 3+ messages in thread
From: Paul E. McKenney @ 2021-03-04 0:16 UTC (permalink / raw)
To: linux-mm
Cc: cl, penberg, rientjes, iamjoonsoo.kim, akpm, kernel-team, mingo, rcu
Hello!
This series contains the following:
1. Don't build mm_dump_obj() on CONFIG_PRINTK=n kernels.
2. Add crude tests for mem_dump_obj().
Thanx, Paul
------------------------------------------------------------------------
include/linux/mm.h | 4 ++++
include/linux/slab.h | 2 ++
include/linux/vmalloc.h | 2 +-
kernel/rcu/rcutorture.c | 39 +++++++++++++++++++++++++++++++++++++++
mm/slab.c | 2 ++
mm/slab.h | 2 ++
mm/slab_common.c | 4 ++++
mm/slob.c | 2 ++
mm/slub.c | 2 ++
mm/util.c | 3 +++
mm/vmalloc.c | 2 ++
11 files changed, 63 insertions(+), 1 deletion(-)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH tip/core/rcu 1/2] mm: Don't build mm_dump_obj() on CONFIG_PRINTK=n kernels
2021-03-04 0:16 [PATCH tip/core/rcu 0/2] mm_dump_obj() updates for v5.13 Paul E. McKenney
@ 2021-03-04 0:17 ` paulmck
2021-03-04 0:17 ` [PATCH tip/core/rcu 2/2] rcutorture: Add crude tests for mem_dump_obj() paulmck
1 sibling, 0 replies; 3+ messages in thread
From: paulmck @ 2021-03-04 0:17 UTC (permalink / raw)
To: linux-mm
Cc: cl, penberg, rientjes, iamjoonsoo.kim, akpm, kernel-team, mingo,
rcu, Paul E. McKenney
From: "Paul E. McKenney" <paulmck@kernel.org>
The mem_dump_obj() functionality adds a few hundred bytes, which is a
small price to pay. Except on kernels built with CONFIG_PRINTK=n, in
which mem_dump_obj() messages will be suppressed. This commit therefore
makes mem_dump_obj() be a static inline empty function on kernels built
with CONFIG_PRINTK=n and excludes all of its support functions as well.
This avoids kernel bloat on systems that cannot use mem_dump_obj().
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: <linux-mm@kvack.org>
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
include/linux/mm.h | 4 ++++
include/linux/slab.h | 2 ++
include/linux/vmalloc.h | 2 +-
mm/slab.c | 2 ++
mm/slab.h | 2 ++
mm/slab_common.c | 2 ++
mm/slob.c | 2 ++
mm/slub.c | 2 ++
mm/util.c | 2 ++
mm/vmalloc.c | 2 ++
10 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 77e64e3..89fca44 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3135,7 +3135,11 @@ unsigned long wp_shared_mapping_range(struct address_space *mapping,
extern int sysctl_nr_trim_pages;
+#ifdef CONFIG_PRINTK
void mem_dump_obj(void *object);
+#else
+static inline void mem_dump_obj(void *object) {}
+#endif
#endif /* __KERNEL__ */
#endif /* _LINUX_MM_H */
diff --git a/include/linux/slab.h b/include/linux/slab.h
index 7ae6040..0c97d78 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -186,8 +186,10 @@ void kfree(const void *);
void kfree_sensitive(const void *);
size_t __ksize(const void *);
size_t ksize(const void *);
+#ifdef CONFIG_PRINTK
bool kmem_valid_obj(void *object);
void kmem_dump_obj(void *object);
+#endif
#ifdef CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR
void __check_heap_object(const void *ptr, unsigned long n, struct page *page,
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
index df92211..3de7be6 100644
--- a/include/linux/vmalloc.h
+++ b/include/linux/vmalloc.h
@@ -241,7 +241,7 @@ pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)
int register_vmap_purge_notifier(struct notifier_block *nb);
int unregister_vmap_purge_notifier(struct notifier_block *nb);
-#ifdef CONFIG_MMU
+#if defined(CONFIG_MMU) && defined(CONFIG_PRINTK)
bool vmalloc_dump_obj(void *object);
#else
static inline bool vmalloc_dump_obj(void *object) { return false; }
diff --git a/mm/slab.c b/mm/slab.c
index 51fd424..2e64efe 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3651,6 +3651,7 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t flags,
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)
{
struct kmem_cache *cachep;
@@ -3670,6 +3671,7 @@ void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
if (DEBUG && cachep->flags & SLAB_STORE_USER)
kpp->kp_ret = *dbg_userword(cachep, objp);
}
+#endif
/**
* __do_kmalloc - allocate memory
diff --git a/mm/slab.h b/mm/slab.h
index 076582f..120b1d0 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -619,6 +619,7 @@ static inline bool slab_want_init_on_free(struct kmem_cache *c)
return false;
}
+#ifdef CONFIG_PRINTK
#define KS_ADDRS_COUNT 16
struct kmem_obj_info {
void *kp_ptr;
@@ -630,5 +631,6 @@ struct kmem_obj_info {
void *kp_stack[KS_ADDRS_COUNT];
};
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page);
+#endif
#endif /* MM_SLAB_H */
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 88e8339..cec9536 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -526,6 +526,7 @@ bool slab_is_available(void)
return slab_state >= UP;
}
+#ifdef CONFIG_PRINTK
/**
* kmem_valid_obj - does the pointer reference a valid slab object?
* @object: pointer to query.
@@ -600,6 +601,7 @@ void kmem_dump_obj(void *object)
pr_info(" %pS\n", kp.kp_stack[i]);
}
}
+#endif
#ifndef CONFIG_SLOB
/* Create a cache during boot when no slab services are available yet */
diff --git a/mm/slob.c b/mm/slob.c
index 0578429..74d3f6e 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -461,11 +461,13 @@ static void slob_free(void *block, int size)
spin_unlock_irqrestore(&slob_lock, flags);
}
+#ifdef CONFIG_PRINTK
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
{
kpp->kp_ptr = object;
kpp->kp_page = page;
}
+#endif
/*
* End of slob allocator proper. Begin kmem_cache_alloc and kmalloc frontend.
diff --git a/mm/slub.c b/mm/slub.c
index e26c274..077a019 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3963,6 +3963,7 @@ int __kmem_cache_shutdown(struct kmem_cache *s)
return 0;
}
+#ifdef CONFIG_PRINTK
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
{
void *base;
@@ -4002,6 +4003,7 @@ void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
#endif
#endif
}
+#endif
/********************************************************************
* Kmalloc subsystem
diff --git a/mm/util.c b/mm/util.c
index 5487022..2d497fe 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -983,6 +983,7 @@ int __weak memcmp_pages(struct page *page1, struct page *page2)
return ret;
}
+#ifdef CONFIG_PRINTK
/**
* mem_dump_obj - Print available provenance information
* @object: object for which to find provenance information.
@@ -1013,3 +1014,4 @@ void mem_dump_obj(void *object)
}
pr_cont(" non-slab/vmalloc memory.\n");
}
+#endif
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 4f5f8c9..d5f2a84 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -3450,6 +3450,7 @@ void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)
}
#endif /* CONFIG_SMP */
+#ifdef CONFIG_PRINTK
bool vmalloc_dump_obj(void *object)
{
struct vm_struct *vm;
@@ -3462,6 +3463,7 @@ bool vmalloc_dump_obj(void *object)
vm->nr_pages, (unsigned long)vm->addr, vm->caller);
return true;
}
+#endif
#ifdef CONFIG_PROC_FS
static void *s_start(struct seq_file *m, loff_t *pos)
--
2.9.5
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH tip/core/rcu 2/2] rcutorture: Add crude tests for mem_dump_obj()
2021-03-04 0:16 [PATCH tip/core/rcu 0/2] mm_dump_obj() updates for v5.13 Paul E. McKenney
2021-03-04 0:17 ` [PATCH tip/core/rcu 1/2] mm: Don't build mm_dump_obj() on CONFIG_PRINTK=n kernels paulmck
@ 2021-03-04 0:17 ` paulmck
1 sibling, 0 replies; 3+ messages in thread
From: paulmck @ 2021-03-04 0:17 UTC (permalink / raw)
To: linux-mm
Cc: cl, penberg, rientjes, iamjoonsoo.kim, akpm, kernel-team, mingo,
rcu, Paul E. McKenney
From: "Paul E. McKenney" <paulmck@kernel.org>
This commit adds a few crude tests for mem_dump_obj() to rcutorture
runs. Just to prevent bitrot, you understand!
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/rcu/rcutorture.c | 39 +++++++++++++++++++++++++++++++++++++++
mm/slab_common.c | 2 ++
mm/util.c | 1 +
3 files changed, 42 insertions(+)
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 99657ff..8e93f2e 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1861,6 +1861,45 @@ rcu_torture_stats(void *arg)
torture_shutdown_absorb("rcu_torture_stats");
} while (!torture_must_stop());
torture_kthread_stopping("rcu_torture_stats");
+
+ {
+ struct rcu_head *rhp;
+ struct kmem_cache *kcp;
+ static int z;
+
+ kcp = kmem_cache_create("rcuscale", 136, 8, SLAB_STORE_USER, NULL);
+ rhp = kmem_cache_alloc(kcp, GFP_KERNEL);
+ pr_alert("mem_dump_obj() slab test: rcu_torture_stats = %px, &rhp = %px, rhp = %px, &z = %px\n", stats_task, &rhp, rhp, &z);
+ pr_alert("mem_dump_obj(ZERO_SIZE_PTR):");
+ mem_dump_obj(ZERO_SIZE_PTR);
+ pr_alert("mem_dump_obj(NULL):");
+ mem_dump_obj(NULL);
+ pr_alert("mem_dump_obj(%px):", &rhp);
+ mem_dump_obj(&rhp);
+ pr_alert("mem_dump_obj(%px):", rhp);
+ mem_dump_obj(rhp);
+ pr_alert("mem_dump_obj(%px):", &rhp->func);
+ mem_dump_obj(&rhp->func);
+ pr_alert("mem_dump_obj(%px):", &z);
+ mem_dump_obj(&z);
+ kmem_cache_free(kcp, rhp);
+ kmem_cache_destroy(kcp);
+ rhp = kmalloc(sizeof(*rhp), GFP_KERNEL);
+ pr_alert("mem_dump_obj() kmalloc test: rcu_torture_stats = %px, &rhp = %px, rhp = %px\n", stats_task, &rhp, rhp);
+ pr_alert("mem_dump_obj(kmalloc %px):", rhp);
+ mem_dump_obj(rhp);
+ pr_alert("mem_dump_obj(kmalloc %px):", &rhp->func);
+ mem_dump_obj(&rhp->func);
+ kfree(rhp);
+ rhp = vmalloc(4096);
+ pr_alert("mem_dump_obj() vmalloc test: rcu_torture_stats = %px, &rhp = %px, rhp = %px\n", stats_task, &rhp, rhp);
+ pr_alert("mem_dump_obj(vmalloc %px):", rhp);
+ mem_dump_obj(rhp);
+ pr_alert("mem_dump_obj(vmalloc %px):", &rhp->func);
+ mem_dump_obj(&rhp->func);
+ vfree(rhp);
+ }
+
return 0;
}
diff --git a/mm/slab_common.c b/mm/slab_common.c
index cec9536..4c6107e 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -545,6 +545,7 @@ bool kmem_valid_obj(void *object)
page = virt_to_head_page(object);
return PageSlab(page);
}
+EXPORT_SYMBOL_GPL(kmem_valid_obj);
/**
* kmem_dump_obj - Print available slab provenance information
@@ -601,6 +602,7 @@ void kmem_dump_obj(void *object)
pr_info(" %pS\n", kp.kp_stack[i]);
}
}
+EXPORT_SYMBOL_GPL(kmem_dump_obj);
#endif
#ifndef CONFIG_SLOB
diff --git a/mm/util.c b/mm/util.c
index 2d497fe..c37e24d 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -1014,4 +1014,5 @@ void mem_dump_obj(void *object)
}
pr_cont(" non-slab/vmalloc memory.\n");
}
+EXPORT_SYMBOL_GPL(mem_dump_obj);
#endif
--
2.9.5
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-03-04 0:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-04 0:16 [PATCH tip/core/rcu 0/2] mm_dump_obj() updates for v5.13 Paul E. McKenney
2021-03-04 0:17 ` [PATCH tip/core/rcu 1/2] mm: Don't build mm_dump_obj() on CONFIG_PRINTK=n kernels paulmck
2021-03-04 0:17 ` [PATCH tip/core/rcu 2/2] rcutorture: Add crude tests for mem_dump_obj() paulmck
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox