[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <a2eb8d2c-34b9-6027-66da-d8e8184285f1@alibaba-inc.com>
Date: Tue, 28 Nov 2017 01:53:30 +0800
From: "Yang Shi" <yang.s@...baba-inc.com>
To: tglx@...utronix.de, longman@...hat.com
Cc: linux-kernel@...r.kernel.org
Subject: Re: [RFC PATCH 1/2] lib: debugobjects: export max loops counter
Hi Waiman & tglx,
I'm not sure who is the maintainer for lib/debugobjects.c now, I'm
supposed tglx still is, however, get_maintainer.pl told me Waiman is the
most active developer of this, so added Waiman in this loop in case he
didn't see the patches on LKML.
Thanks,
Yang
On 11/17/17 11:43 AM, Yang Shi wrote:
> Currently max chain counter is exported to sysfs, it just record the
> counter of inner loop, however, there might be significant iterations of
> external loop then it may take significant amount of time to finish all
> of the checks. This may cuase lockup on !CONFIG_PREEMPT kernel build
> occasionally.
>
> Record the counter of the max loops then export to sysfs so that the
> user can be aware of the real overhead.
>
> Then the output of /sys/kernel/debug/debug_objects/stats looks like:
>
> max_chain :121
> max_loops :543267
> warnings :0
> fixups :0
> pool_free :1764
> pool_min_free :341
> pool_used :86438
> pool_max_used :268887
> objs_allocated:6068254
> objs_freed :5981076
>
> Signed-off-by: Yang Shi <yang.s@...baba-inc.com>
> ---
> lib/debugobjects.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/lib/debugobjects.c b/lib/debugobjects.c
> index 2f5349c..166488d 100644
> --- a/lib/debugobjects.c
> +++ b/lib/debugobjects.c
> @@ -50,6 +50,7 @@ struct debug_bucket {
> static struct kmem_cache *obj_cache;
>
> static int debug_objects_maxchain __read_mostly;
> +static int debug_objects_maxloops __read_mostly;
> static int debug_objects_fixups __read_mostly;
> static int debug_objects_warnings __read_mostly;
> static int debug_objects_enabled __read_mostly
> @@ -720,7 +721,7 @@ static void __debug_check_no_obj_freed(const void *address, unsigned long size)
> enum debug_obj_state state;
> struct debug_bucket *db;
> struct debug_obj *obj;
> - int cnt;
> + int cnt, max_loops = 0;
>
> saddr = (unsigned long) address;
> eaddr = saddr + size;
> @@ -765,7 +766,12 @@ static void __debug_check_no_obj_freed(const void *address, unsigned long size)
>
> if (cnt > debug_objects_maxchain)
> debug_objects_maxchain = cnt;
> +
> + max_loops += cnt;
> }
> +
> + if (max_loops > debug_objects_maxloops)
> + debug_objects_maxloops = max_loops;
> }
>
> void debug_check_no_obj_freed(const void *address, unsigned long size)
> @@ -780,6 +786,7 @@ void debug_check_no_obj_freed(const void *address, unsigned long size)
> static int debug_stats_show(struct seq_file *m, void *v)
> {
> seq_printf(m, "max_chain :%d\n", debug_objects_maxchain);
> + seq_printf(m, "max_loops :%d\n", debug_objects_maxloops);
> seq_printf(m, "warnings :%d\n", debug_objects_warnings);
> seq_printf(m, "fixups :%d\n", debug_objects_fixups);
> seq_printf(m, "pool_free :%d\n", obj_pool_free);
>
Powered by blists - more mailing lists