From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753268AbdCNPHf (ORCPT ); Tue, 14 Mar 2017 11:07:35 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:60321 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753250AbdCNPHc (ORCPT ); Tue, 14 Mar 2017 11:07:32 -0400 From: Ravi Bangoria To: mingo@redhat.com, acme@kernel.org, mhiramat@kernel.org Cc: brendan.d.gregg@gmail.com, peterz@infradead.org, alexander.shishkin@linux.intel.com, wangnan0@huawei.com, jolsa@kernel.org, ak@linux.intel.com, treeze.taeung@gmail.com, mathieu.poirier@linaro.org, hekuang@huawei.com, sukadev@linux.vnet.ibm.com, ananth@in.ibm.com, naveen.n.rao@linux.vnet.ibm.com, adrian.hunter@intel.com, linux-kernel@vger.kernel.org, hemant@linux.vnet.ibm.com, Ravi Bangoria Subject: [PATCH v5 5/7] perf/sdt: Warn when number of events recorded are not equal to cached events Date: Tue, 14 Mar 2017 20:36:56 +0530 X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170314150658.7065-1-ravi.bangoria@linux.vnet.ibm.com> References: <20170314150658.7065-1-ravi.bangoria@linux.vnet.ibm.com> X-TM-AS-MML: disable x-cbid: 17031415-7323-0000-0000-000000D91D94 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17031415-7324-0000-0000-0000027E1D7F Message-Id: <20170314150658.7065-6-ravi.bangoria@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-03-14_08:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=2 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1702020001 definitions=main-1703140118 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If number of events found from probe-cache is not equal to number of existing events(fetched from uprobe_events), and somehow we decides to record only existing events, we warn user about the same. For ex, $ sudo ./perf probe sdt_libpthread:mutex_release Added new events: sdt_libpthread:mutex_release (on %mutex_release in /usr/lib64/libpthread-2.24.so) sdt_libpthread:mutex_release_1 (on %mutex_release in /usr/lib64/libpthread-2.24.so) sdt_libpthread:mutex_release_2 (on %mutex_release in /usr/lib64/libpthread-2.24.so) sdt_libpthread:mutex_release_3 (on %mutex_release in /usr/lib64/libpthread-2.24.so) $ sudo ./perf record -a -e sdt_libpthread:* Warning: Recording on 4 occurrences of sdt_libpthread:* Warning: Found 35 events from probe-cache with name 'sdt_libpthread:*'. Since 4 probe points already exists, recording only them. Hint: Please use 'perf probe -d sdt_libpthread:*' to allow record on all events. $ sudo ./perf evlist sdt_libpthread:mutex_release_3 sdt_libpthread:mutex_release_2 sdt_libpthread:mutex_release_1 sdt_libpthread:mutex_release Signed-off-by: Ravi Bangoria --- tools/perf/util/probe-event.c | 53 ++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 94b9105..7bf8783 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -3523,22 +3523,15 @@ void remove_sdt_event_list(struct list_head *sdt_events) free_sdt_list(sdt_events); } -static int get_sdt_events_from_cache(struct perf_probe_event *pev) +static void sdt_warn_abt_exist_events(struct perf_probe_event *pev, int ctr) { - int ret = 0; - - pev->ntevs = find_cached_events_all(pev, &pev->tevs); - - if (pev->ntevs < 0) { - pr_err("Error: Cache lookup failed (code: %d)\n", pev->ntevs); - ret = pev->ntevs; - } else if (!pev->ntevs) { - pr_err("Error: %s:%s not found in the cache\n", - pev->group, pev->event); - ret = -EINVAL; - } - - return ret; + pr_warning("Warning: Found %d events from probe-cache with name '%s:%s'.\n" + "\t Since %d probe point%c already exists, recording only %s.\n" + "Hint: Please use 'perf probe -d %s:%s' to allow record on all events.\n\n", + pev->ntevs, pev->group, pev->event, ctr, + ctr > 1 ? 's' : '\0', + ctr > 1 ? "them" : "it", + pev->group, pev->event); } static int add_event_to_sdt_evlist(struct probe_trace_event *tev, @@ -3727,6 +3720,15 @@ int add_sdt_event(char *event, struct list_head *sdt_evlist) probe_conf.max_probes = MAX_PROBES; probe_conf.force_add = 1; + /* + * This call is intentionally placed before fetching events + * from uprobe_events file. If number of events found from probe- + * cache is not equal to number of existing events, and somehow + * we decides to record only existing events, we warn user about + * the same (sdt_warn_abt_exist_events()). + */ + pev->ntevs = find_cached_events_all(pev, &pev->tevs); + /* Fetch all sdt events from uprobe_events */ exst_ntevs = probe_file__get_sdt_events(&exst_tevs); if (exst_ntevs < 0) { @@ -3738,14 +3740,29 @@ int add_sdt_event(char *event, struct list_head *sdt_evlist) ret = sdt_event_probepoint_exists(pev, exst_tevs, exst_ntevs, sdt_evlist); if (ret) { + if (ret > 0 && pev->ntevs > 0 && ret != pev->ntevs) + sdt_warn_abt_exist_events(pev, ret); ret = ret > 0 ? 0 : ret; goto free_pev; } - /* Fetch all matching events from cache. */ - ret = get_sdt_events_from_cache(pev); - if (ret < 0) + /* + * Check if find_cached_events_all() failed. + * We deliberately check failure of this function after checking + * entries in uprobe_events. Because, even if this function fails, + * we may find matching entry from uprobe_events and in that case + * we should continue recording that event. + */ + if (pev->ntevs < 0) { + pr_err("Error: Cache lookup failed (code: %d)\n", pev->ntevs); + ret = pev->ntevs; goto free_pev; + } else if (!pev->ntevs) { + pr_err("Error: %s:%s not found in the cache\n", + pev->group, pev->event); + ret = -EINVAL; + goto free_pev; + } /* * Merge events found from uprobe_events with events found -- 2.9.3