From: Jiri Olsa <jolsa@redhat.com>
To: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>,
Namhyung Kim <namhyung@kernel.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>, Andi Kleen <ak@linux.intel.com>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v3 3/9] perf stat: factor out event handling loop into a function
Date: Wed, 20 May 2020 14:38:50 +0200 [thread overview]
Message-ID: <20200520123850.GI157452@krava> (raw)
In-Reply-To: <dcb0b0f5-4c92-3027-a508-c3946c51f3d1@linux.intel.com>
On Wed, May 13, 2020 at 11:00:47AM +0300, Alexey Budankov wrote:
>
> Factor out event handling loop into handle_events() function.
>
> Signed-off-by: Alexey Budankov <alexey.budankov@linux.intel.com>
> ---
> tools/perf/builtin-stat.c | 85 +++++++++++++++++++++++----------------
> 1 file changed, 50 insertions(+), 35 deletions(-)
>
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index e0c1ad23c768..9775b0905146 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -371,6 +371,16 @@ static void process_interval(void)
> print_counters(&rs, 0, NULL);
> }
>
> +static bool print_interval_and_stop(struct perf_stat_config *config, int *times)
> +{
> + if (config->interval) {
> + process_interval();
> + if (interval_count && !(--(*times)))
> + return true;
> + }
> + return false;
> +}
> +
> static void enable_counters(void)
> {
> if (stat_config.initial_delay)
> @@ -436,6 +446,42 @@ static bool is_target_alive(struct target *_target,
> return false;
> }
>
> +static int handle_events(pid_t pid, struct perf_stat_config *config)
> +{
> + pid_t child = 0;
> + bool res, stop = false;
> + struct timespec time_to_sleep;
> + int sleep_time, status = 0, times = config->times;
> +
> + if (config->interval)
> + sleep_time = config->interval;
> + else if (config->timeout)
> + sleep_time = config->timeout;
> + else
> + sleep_time = 1000;
> +
> + time_to_sleep.tv_sec = sleep_time / MSEC_PER_SEC;
> + time_to_sleep.tv_nsec = (sleep_time % MSEC_PER_SEC) * NSEC_PER_MSEC;
> +
> + do {
> + if (pid != -1)
> + child = waitpid(pid, &status, WNOHANG);
> + if (child || stop || done)
> + break;
> + nanosleep(&time_to_sleep, NULL);
> + if (pid == -1)
> + stop = !is_target_alive(&target, evsel_list->core.threads);
> + if (config->timeout) {
> + stop = !stop ? true : stop;
> + } else {
> + res = print_interval_and_stop(config, ×);
> + stop = !stop ? res : stop;
> + }
> + } while (1);
> +
> + return status;
> +}
> +
> enum counter_recovery {
> COUNTER_SKIP,
> COUNTER_RETRY,
> @@ -494,12 +540,10 @@ static enum counter_recovery stat_handle_error(struct evsel *counter)
> static int __run_perf_stat(int argc, const char **argv, int run_idx)
> {
> int interval = stat_config.interval;
> - int times = stat_config.times;
> int timeout = stat_config.timeout;
> char msg[BUFSIZ];
> unsigned long long t0, t1;
> struct evsel *counter;
> - struct timespec ts;
> size_t l;
> int status = 0;
> const bool forks = (argc > 0);
> @@ -508,17 +552,6 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
> int i, cpu;
> bool second_pass = false;
>
> - if (interval) {
> - ts.tv_sec = interval / USEC_PER_MSEC;
> - ts.tv_nsec = (interval % USEC_PER_MSEC) * NSEC_PER_MSEC;
> - } else if (timeout) {
> - ts.tv_sec = timeout / USEC_PER_MSEC;
> - ts.tv_nsec = (timeout % USEC_PER_MSEC) * NSEC_PER_MSEC;
> - } else {
> - ts.tv_sec = 1;
> - ts.tv_nsec = 0;
> - }
> -
> if (forks) {
> if (perf_evlist__prepare_workload(evsel_list, &target, argv, is_pipe,
> workload_exec_failed_signal) < 0) {
> @@ -675,16 +708,9 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
> perf_evlist__start_workload(evsel_list);
> enable_counters();
>
> - if (interval || timeout) {
> - while (!waitpid(child_pid, &status, WNOHANG)) {
> - nanosleep(&ts, NULL);
> - if (timeout)
> - break;
> - process_interval();
> - if (interval_count && !(--times))
> - break;
> - }
> - }
> + if (interval || timeout)
> + handle_events(child_pid, &stat_config);
> +
> if (child_pid != -1) {
> if (timeout)
> kill(child_pid, SIGTERM);
> @@ -701,18 +727,7 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
> psignal(WTERMSIG(status), argv[0]);
> } else {
> enable_counters();
> - while (!done) {
> - nanosleep(&ts, NULL);
> - if (!is_target_alive(&target, evsel_list->core.threads))
> - break;
> - if (timeout)
> - break;
> - if (interval) {
> - process_interval();
> - if (interval_count && !(--times))
> - break;
> - }
> - }
> + handle_events(-1, &stat_config);
this makes me worried.. I'm not sure if it's good idea
to squash these 2 looops into one, because they are already
complex as they are.. and one of you following patches is
making it even more complex
wouldn't it be better if you just add single call into
each of them.. that would poll on your fd and process the
commands if needed?
jirka
next prev parent reply other threads:[~2020-05-20 12:39 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-13 7:53 [PATCH v3 0/9] perf: support enable and disable commands in stat and record modes Alexey Budankov
2020-05-13 7:59 ` [PATCH v3 1/9] perf evlist: introduce control file descriptors Alexey Budankov
2020-05-20 12:38 ` Jiri Olsa
2020-05-20 14:46 ` Alexey Budankov
2020-05-13 8:00 ` [PATCH v3 2/9] perf evlist: implement control command handling functions Alexey Budankov
2020-05-20 12:38 ` Jiri Olsa
2020-05-20 14:56 ` Alexey Budankov
2020-05-13 8:00 ` [PATCH v3 3/9] perf stat: factor out event handling loop into a function Alexey Budankov
2020-05-20 12:38 ` Jiri Olsa [this message]
2020-05-20 15:17 ` Alexey Budankov
2020-05-21 11:48 ` Jiri Olsa
2020-05-13 8:01 ` [PATCH v3 4/9] perf stat: extend -D,--delay option with -1 value Alexey Budankov
2020-05-13 8:02 ` [PATCH v3 5/9] perf stat: implement control commands handling Alexey Budankov
2020-05-13 8:03 ` [PATCH v3 6/9] perf stat: introduce --ctl-fd[-ack] options Alexey Budankov
2020-05-20 12:38 ` Jiri Olsa
2020-05-20 15:05 ` Alexey Budankov
2020-05-13 8:03 ` [PATCH v3 7/9] perf record: extend -D,--delay option with -1 value Alexey Budankov
2020-05-13 8:04 ` [PATCH v3 8/9] perf record: implement control commands handling Alexey Budankov
2020-05-20 12:38 ` Jiri Olsa
2020-05-20 18:06 ` Alexey Budankov
2020-05-13 8:05 ` [PATCH v3 9/9] perf record: introduce --ctl-fd[-ack] options Alexey Budankov
2020-05-20 12:38 ` Jiri Olsa
2020-05-20 15:21 ` Alexey Budankov
2020-05-18 8:08 ` [PATCH v3 0/9] perf: support enable and disable commands in stat and record modes Alexey Budankov
2020-05-20 10:55 ` Jiri Olsa
-- strict thread matches above, loose matches on Subject: below --
2020-05-08 10:43 Alexey Budankov
2020-05-08 10:48 ` [PATCH v3 3/9] perf stat: factor out event handling loop into a function Alexey Budankov
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=20200520123850.GI157452@krava \
--to=jolsa@redhat.com \
--cc=acme@redhat.com \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=alexey.budankov@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox