Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753907AbbHRQmv (ORCPT ); Tue, 18 Aug 2015 12:42:51 -0400 Received: from mga11.intel.com ([192.55.52.93]:48477 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753732AbbHRQlY (ORCPT ); Tue, 18 Aug 2015 12:41:24 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,702,1432623600"; d="scan'208";a="786447422" From: kan.liang@intel.com To: acme@kernel.org Cc: a.p.zijlstra@chello.nl, mingo@redhat.com, jolsa@kernel.org, namhyung@kernel.org, ak@linux.intel.com, eranian@google.com, linux-kernel@vger.kernel.org, Kan Liang Subject: [PATCH RFC 08/10] perf,tools: option to set stat read interval Date: Tue, 18 Aug 2015 05:25:44 -0400 Message-Id: <1439889946-28986-9-git-send-email-kan.liang@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1439889946-28986-1-git-send-email-kan.liang@intel.com> References: <1439889946-28986-1-git-send-email-kan.liang@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4146 Lines: 118 From: Kan Liang Add a timer to read stat event regularly. Option --stat-read-interval can be used to set the interval. Only read stat event at the beginning and the end of the test is not enough. Sometimes, we need fine granularity to do sophisticated analysis. For example, 10-20ms is required to do sophisticated bandwidth analysis. Signed-off-by: Kan Liang --- tools/perf/Documentation/perf-record.txt | 7 +++++++ tools/perf/builtin-record.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt index 347a273..00dc000 100644 --- a/tools/perf/Documentation/perf-record.txt +++ b/tools/perf/Documentation/perf-record.txt @@ -304,6 +304,13 @@ This option sets the time out limit. The default value is 500 ms. Record context switch events i.e. events of type PERF_RECORD_SWITCH or PERF_RECORD_SWITCH_CPU_WIDE. +--stat-read-interval:: +Sets the interval to do stat read regularly. This option is valid only with +stat read event. This option is disabled by default. It means that counter +only be read at the beginning and end of the test. +But sometimes, we need fine granularity to do sophisticated analysis. +For example, 10-20ms is required to do sophisticated bandwidth analysis. + SEE ALSO -------- linkperf:perf-stat[1], linkperf:perf-list[1] diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 0e5e4c0..ebf37e3 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -572,6 +572,14 @@ static void workload_exec_failed_signal(int signo __maybe_unused, static void snapshot_sig_handler(int sig); +static unsigned int interval; +struct record *g_rec; + +static void perf_read_alarm(int sig __maybe_unused) +{ + perf_read_counter(g_rec); +} + static int __cmd_record(struct record *rec, int argc, const char **argv) { int err; @@ -584,6 +592,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) struct perf_data_file *file = &rec->file; struct perf_session *session; bool disabled = false, draining = false; + static timer_t timerid; + struct itimerspec timeout; + struct sigevent sigevent; int fd; rec->progname = argv[0]; @@ -597,6 +608,19 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) else signal(SIGUSR2, SIG_IGN); + if (interval) { + signal(SIGALRM, perf_read_alarm); + g_rec = rec; + + /* Create a timer. */ + sigevent.sigev_notify = SIGEV_SIGNAL; + sigevent.sigev_signo = SIGALRM; + timer_create(CLOCK_REALTIME, &sigevent, &timerid); + memset(&timeout, 0, sizeof(timeout)); + timeout.it_value.tv_nsec = interval * 1000000ULL; + timeout.it_interval.tv_nsec = interval * 1000000ULL; + } + session = perf_session__new(file, false, tool); if (session == NULL) { pr_err("Perf session creation failed.\n"); @@ -737,6 +761,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) } perf_read_counter(rec); + if (interval) + timer_settime(timerid, 0, &timeout, NULL); + auxtrace_snapshot_enabled = 1; for (;;) { int hits = rec->samples; @@ -781,6 +808,8 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) */ if (done && !disabled && !target__none(&opts->target)) { auxtrace_snapshot_enabled = 0; + if (interval) + timer_delete(timerid); perf_read_counter(rec); perf_evlist__disable(rec->evlist); disabled = true; @@ -1187,6 +1216,8 @@ struct option __record_options[] = { "per thread proc mmap processing timeout in ms"), OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events, "Record context switch events"), + OPT_UINTEGER(0, "stat-read-interval", &interval, + "Stat read counter at regular interval in ms (>= 10)"), OPT_END() }; -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/