From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752577AbbIBGyg (ORCPT ); Wed, 2 Sep 2015 02:54:36 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:3668 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751537AbbIBGyf (ORCPT ); Wed, 2 Sep 2015 02:54:35 -0400 Message-ID: <55E69D06.4050005@huawei.com> Date: Wed, 2 Sep 2015 14:53:58 +0800 From: "Wangnan (F)" User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: , CC: Alexei Starovoitov , Jiri Olsa , Namhyung Kim , Zefan Li , , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH] perf tools: Don't write to evsel if parser doesn't collect evsel References: <50399556C9727B4D88A595C8584AAB37525027C2@GSjpTKYDCembx32.service.hitachi.net> <1441176553-116129-1-git-send-email-wangnan0@huawei.com> In-Reply-To: <1441176553-116129-1-git-send-email-wangnan0@huawei.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.66.109] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sorry, forget to CC kernel mailing list... On 2015/9/2 14:49, Wang Nan wrote: > If parse_events__scanner() collects no entry, perf_evlist__last(evlist) > is invalid. > > Although it shouldn't happen at this point, before calling > perf_evlist__last(), we should ensure the list is not empty for safety > reason. > > There are 3 places need this checking: > > 1. Before setting cmdline_group_boundary; > 2. Before __perf_evlist__set_leader(); > 3. In foreach_evsel_in_last_glob. > > Signed-off-by: Wang Nan > Cc: Arnaldo Carvalho de Melo > Cc: Alexei Starovoitov > Cc: Jiri Olsa > Cc: Masami Hiramatsu > Cc: Namhyung Kim > Cc: Zefan Li > Cc: pi3orama@163.com > --- > > Merge all 3 list_empty() test together into one patch. > > Add warning messages. > > Improve commit message. > > --- > tools/perf/util/parse-events.c | 22 +++++++++++++++++++--- > 1 file changed, 19 insertions(+), 3 deletions(-) > > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c > index d826e6f..069848d 100644 > --- a/tools/perf/util/parse-events.c > +++ b/tools/perf/util/parse-events.c > @@ -793,6 +793,11 @@ void parse_events__set_leader(char *name, struct list_head *list) > { > struct perf_evsel *leader; > > + if (list_empty(list)) { > + __WARN_printf("WARNING: failed to set leader: empty list"); > + return; > + } > + > __perf_evlist__set_leader(list); > leader = list_entry(list->next, struct perf_evsel, node); > leader->group_name = name ? strdup(name) : NULL; > @@ -1143,10 +1148,15 @@ int parse_events(struct perf_evlist *evlist, const char *str, > int entries = data.idx - evlist->nr_entries; > struct perf_evsel *last; > > + if (!list_empty(&data.list)) { > + last = list_entry(data.list.prev, > + struct perf_evsel, node); > + last->cmdline_group_boundary = true; > + } else > + __WARN_printf("WARNING: event parser found nothing"); > + > perf_evlist__splice_list_tail(evlist, &data.list, entries); > evlist->nr_groups += data.nr_groups; > - last = perf_evlist__last(evlist); > - last->cmdline_group_boundary = true; > > return 0; > } > @@ -1252,7 +1262,13 @@ foreach_evsel_in_last_glob(struct perf_evlist *evlist, > struct perf_evsel *last = NULL; > int err; > > - if (evlist->nr_entries > 0) > + /* > + * Don't return when list_empty, give func a chance to report > + * error when it found last == NULL. > + * > + * So no need to WARN here, let *func do this. > + */ > + if (!list_empty(&evlist->entries)) > last = perf_evlist__last(evlist); > > do {