From: Namhyung Kim <namhyung@kernel.org>
To: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
linux-kernel@vger.kernel.org,
Adrian Hunter <adrian.hunter@intel.com>,
Ingo Molnar <mingo@redhat.com>, Jiri Olsa <jolsa@redhat.com>
Subject: Re: [PATCH perf/core 03/13] perf: Introduce generic refcount APIs with debug feature
Date: Fri, 20 Nov 2015 11:52:32 +0900 [thread overview]
Message-ID: <20151120025232.GF23310@sejong> (raw)
In-Reply-To: <20151118064016.30709.10199.stgit@localhost.localdomain>
On Wed, Nov 18, 2015 at 03:40:16PM +0900, Masami Hiramatsu wrote:
> This is a kind of debugging feature for atomic reference counter.
> The reference counters are widely used in perf tools but not well
> debugged. It sometimes causes memory leaks but no one has noticed
> the issue, since it is hard to debug such un-reclaimed objects.
>
> This refcnt interface provides fully backtrace debug feature to
> analyze such issue. User just replace atomic_t ops with refcnt
> APIs and add refcnt__exit() where the object is released.
>
> /* At object initializing */
> refcnt__init(obj, refcnt); /* <- atomic_set(&obj->refcnt, 1); */
>
> /* At object get method */
> refcnt__get(obj, refcnt); /* <- atomic_inc(&obj->refcnt); */
>
> /* At object put method */
> if (obj && refcnt__put(obj, refcnt)) /* <-atmoic_dec_and_test(&obj->refcnt)*/
>
> /* At object releasing */
> refcnt__exit(obj, refcnt); /* <- Newly added */
>
> The debugging feature is enabled when building perf with
> REFCNT_DEBUG=1. Otherwides it is just translated as normal
> atomic ops.
>
> Debugging binary warns you if it finds leaks when the perf exits.
> If you give -v (or --verbose) to the perf, it also shows backtrace
> logs on all refcnt operations of leaked objects.
>
> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Looks really useful!
Acked-by: Namhyung Kim <namhyung@kernel.org>
Just a nitpick below..
> ---
[SNIP]
> +void refcnt_object__record(void *obj, const char *name, int count)
> +{
> + struct refcnt_object *ref = refcnt__find_object(obj);
> + struct refcnt_buffer *buf;
> +
> + /* If no entry, allocate new one */
> + if (!ref) {
> + ref = malloc(sizeof(*ref));
> + if (!ref) {
> + pr_debug("REFCNT: Out of memory for %p (%s)\n",
> + obj, name);
> + return;
> + }
> + INIT_LIST_HEAD(&ref->list);
> + INIT_LIST_HEAD(&ref->head);
> + ref->name = name;
> + ref->obj = obj;
> + list_add_tail(&ref->list, &refcnt_root);
> + }
> +
> + buf = malloc(sizeof(*buf));
> + if (!buf) {
> + pr_debug("REFCNT: Out of memory for %p (%s)\n", obj, ref->name);
> + return;
> + }
> +
> + INIT_LIST_HEAD(&buf->list);
> + buf->count = count;
> + buf->nr = backtrace(buf->buf, BACKTRACE_SIZE);
> + list_add_tail(&buf->list, &ref->head);
> +}
> +
> +static void pr_refcnt_buffer(struct refcnt_buffer *buf)
> +{
> + char **symbuf;
> + int i;
> +
> + if (!buf)
> + return;
> + symbuf = backtrace_symbols(buf->buf, buf->nr);
It seems you need to check the return value. Maybe we can use
backtrace_symbols_fd() instead, or just in case of an error.
Thanks,
Namhyung
> + /* Skip the first one because it is always btrace__record */
> + for (i = 1; i < buf->nr; i++)
> + pr_debug(" %s\n", symbuf[i]);
> + free(symbuf);
> +}
> +
> +void refcnt__dump_unreclaimed(void) __attribute__((destructor));
> +void refcnt__dump_unreclaimed(void)
> +{
> + struct refcnt_object *ref, *n;
> + struct refcnt_buffer *buf;
> + int i = 0;
> +
> + if (list_empty(&refcnt_root))
> + return;
> +
> + pr_warning("REFCNT: BUG: Unreclaimed objects found.\n");
> + list_for_each_entry_safe(ref, n, &refcnt_root, list) {
> + pr_debug("==== [%d] ====\nUnreclaimed %s: %p\n", i,
> + ref->name ? ref->name : "(object)", ref->obj);
> + list_for_each_entry(buf, &ref->head, list) {
> + pr_debug("Refcount %s => %d at\n",
> + buf->count > 0 ? "+1" : "-1",
> + buf->count > 0 ? buf->count : -buf->count - 1);
> + pr_refcnt_buffer(buf);
> + }
> + __refcnt_object__delete(ref);
> + i++;
> + }
> + pr_warning("REFCNT: Total %d objects are not reclaimed.\n", i);
> + if (!verbose)
> + pr_warning(" To see all backtraces, rerun with -v option\n");
> +}
next prev parent reply other threads:[~2015-11-20 2:52 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-18 6:40 [PATCH perf/core 00/13] perf memory/refcnt leak fixes Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 01/13] perf probe: Fix to free temporal Dwarf_Frame Masami Hiramatsu
2015-11-18 22:36 ` Arnaldo Carvalho de Melo
2015-11-18 23:32 ` Namhyung Kim
2015-11-19 3:12 ` 平松雅巳 / HIRAMATU,MASAMI
2015-11-20 1:46 ` Namhyung Kim
2015-11-23 16:10 ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 02/13] perf: Make perf_exec_path always returns malloc'd string Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 03/13] perf: Introduce generic refcount APIs with debug feature Masami Hiramatsu
2015-11-20 2:52 ` Namhyung Kim [this message]
2015-11-20 4:12 ` 平松雅巳 / HIRAMATU,MASAMI
2015-11-20 5:53 ` Namhyung Kim
2015-11-18 6:40 ` [PATCH perf/core 04/13] perf: make map to use refcnt Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 05/13] perf: Fix machine__findnew_module_map to put registered map Masami Hiramatsu
2015-11-18 22:36 ` Arnaldo Carvalho de Melo
2015-11-23 16:10 ` [tip:perf/core] perf machine: " tip-bot for Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 06/13] perf: Fix machine__destroy_kernel_maps to put vmlinux_maps Masami Hiramatsu
2015-11-18 22:38 ` Arnaldo Carvalho de Melo
2015-11-23 16:11 ` [tip:perf/core] perf machine: Fix machine__destroy_kernel_maps to drop vmlinux_maps references tip-bot for Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 07/13] perf: Fix to destroy kernel maps when machine exits Masami Hiramatsu
2015-11-23 16:11 ` [tip:perf/core] perf machine: " tip-bot for Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 08/13] perf: Fix to put new map after inserting to map_groups in dso__load_sym Masami Hiramatsu
2015-11-23 16:12 ` [tip:perf/core] perf tools: " tip-bot for Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 09/13] perf: Make dso to use refcnt for debug Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 10/13] perf: Fix __dsos__addnew to put dso after adding it to the list Masami Hiramatsu
2015-11-23 16:12 ` [tip:perf/core] perf tools: " tip-bot for Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 11/13] perf: Fix machine__create_kernel_maps to put kernel dso Masami Hiramatsu
2015-11-23 16:12 ` [tip:perf/core] perf tools: Fix machine__create_kernel_maps to put kernel dso refcount tip-bot for Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 12/13] perf: Fix machine__findnew_module_map to put dso Masami Hiramatsu
2015-11-23 16:13 ` [tip:perf/core] perf machine: " tip-bot for Masami Hiramatsu
2015-11-18 6:40 ` [PATCH perf/core 13/13] perf: Fix dso__load_sym " Masami Hiramatsu
2015-11-18 12:46 ` [PATCH perf/core 00/13] perf memory/refcnt leak fixes Arnaldo Carvalho de Melo
2015-11-19 2:56 ` 平松雅巳 / HIRAMATU,MASAMI
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151120025232.GF23310@sejong \
--to=namhyung@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mingo@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.