________________________________________ 发件人: Waiman Long <long...@redhat.com> 发送时间: 2020年9月9日 2:23 收件人: Zhang, Qiang; t...@linutronix.de; mi...@kernel.org; el...@google.com 抄送: linux-kernel@vger.kernel.org 主题: Re: [PATCH v3] debugobjects: install CPU hotplug callback
On 9/8/20 2:27 AM, qiang.zh...@windriver.com wrote: > From: Zqiang <qiang.zh...@windriver.com> > > Due to CPU hotplug, it may never be online after it's offline, > some objects in percpu pool is never free. in order to avoid > this happening, install CPU hotplug callback, call this callback > func to free objects in percpu pool when CPU going offline. > > Signed-off-by: Zqiang <qiang.zh...@windriver.com> > --- > v1->v2: > Modify submission information. > > v2->v3: > In CPU hotplug callback func, add clear percpu pool "obj_free" operation. > capitalize 'CPU', and use shorter preprocessor sequence. > > include/linux/cpuhotplug.h | 1 + > lib/debugobjects.c | 24 ++++++++++++++++++++++++ > 2 files changed, 25 insertions(+) > > diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h > index 3215023d4852..0c39d57e5342 100644 > --- a/include/linux/cpuhotplug.h > +++ b/include/linux/cpuhotplug.h > @@ -36,6 +36,7 @@ enum cpuhp_state { > CPUHP_X86_MCE_DEAD, > CPUHP_VIRT_NET_DEAD, > CPUHP_SLUB_DEAD, > + CPUHP_DEBUG_OBJ_DEAD, > CPUHP_MM_WRITEBACK_DEAD, > CPUHP_MM_VMSTAT_DEAD, > CPUHP_SOFTIRQ_DEAD, > diff --git a/lib/debugobjects.c b/lib/debugobjects.c > index fe4557955d97..bb69a02c3e7b 100644 > --- a/lib/debugobjects.c > +++ b/lib/debugobjects.c > @@ -19,6 +19,7 @@ > #include <linux/slab.h> > #include <linux/hash.h> > #include <linux/kmemleak.h> > +#include <linux/cpu.h> > > #define ODEBUG_HASH_BITS 14 > #define ODEBUG_HASH_SIZE (1 << ODEBUG_HASH_BITS) > @@ -433,6 +434,24 @@ static void free_object(struct debug_obj *obj) > } > } > > +#ifdef CONFIG_HOTPLUG_CPU > +static int object_cpu_offline(unsigned int cpu) > +{ > + struct debug_percpu_free *percpu_pool; > + struct hlist_node *tmp; > + struct debug_obj *obj; > + > + percpu_pool = per_cpu_ptr(&percpu_obj_pool, cpu); > + hlist_for_each_entry_safe(obj, tmp, &percpu_pool->free_objs, node) { > + hlist_del(&obj->node); > + kmem_cache_free(obj_cache, obj); > + } > + percpu_pool->obj_free = 0; >>For pointer, it is better to use NULL for clarity. >>Cheers, >>Longman Do you mean "->obj_free" variable ? this represents the number of free objects in percpu_pool . > + > + return 0; > +} > +#endif > + > /* > * We run out of memory. That means we probably have tons of objects > * allocated. > @@ -1367,6 +1386,11 @@ void __init debug_objects_mem_init(void) > } else > debug_objects_selftest(); > > +#ifdef CONFIG_HOTPLUG_CPU > + cpuhp_setup_state_nocalls(CPUHP_DEBUG_OBJ_DEAD, "object:offline", NULL, > + object_cpu_offline); > +#endif > + > /* > * Increase the thresholds for allocating and freeing objects > * according to the number of possible CPUs available in the system.