From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.3 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F77CC433DF for ; Mon, 1 Jun 2020 20:21:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D927A2073B for ; Mon, 1 Jun 2020 20:21:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728627AbgFAUVK (ORCPT ); Mon, 1 Jun 2020 16:21:10 -0400 Received: from mga09.intel.com ([134.134.136.24]:57046 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728167AbgFAUVJ (ORCPT ); Mon, 1 Jun 2020 16:21:09 -0400 IronPort-SDR: WIjIF+MkoRV6JUVT1f/7TUpbuHDmRb3szK+8b8bPpALAu3Vejd3lqBImrZZV0Ydj8eTrt1MS/Y 3CXjGYOQ60xA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Jun 2020 13:21:06 -0700 IronPort-SDR: n1ZPPuYDUZofFfMBSkTAmlE13KIA+Kq5aAce963N9kDHJeX339bdgaMxuOcabNJH7NkWc6POTP TJ+f87tT+6cg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,462,1583222400"; d="scan'208";a="377514526" Received: from linux.intel.com ([10.54.29.200]) by fmsmga001.fm.intel.com with ESMTP; 01 Jun 2020 13:21:05 -0700 Received: from [10.249.230.65] (abudanko-mobl.ccr.corp.intel.com [10.249.230.65]) by linux.intel.com (Postfix) with ESMTP id 4019F58010E; Mon, 1 Jun 2020 13:21:03 -0700 (PDT) Subject: Re: [PATCH v5 00/13] perf: support enable and disable commands in stat and record modes From: Alexey Budankov To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Namhyung Kim , Alexander Shishkin , Peter Zijlstra , Ingo Molnar , Andi Kleen , linux-kernel References: <165cbe1a-bb97-3295-425e-1dd12bef70f1@linux.intel.com> Organization: Intel Corp. Message-ID: <40a461ab-4eaa-5abf-22e3-1207cf8db87f@linux.intel.com> Date: Mon, 1 Jun 2020 23:21:02 +0300 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.8.1 MIME-Version: 1.0 In-Reply-To: <165cbe1a-bb97-3295-425e-1dd12bef70f1@linux.intel.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Please see v6 with all improvements. ~Alexey On 01.06.2020 19:53, Alexey Budankov wrote: > > Please refrain from testing this patch set. For some reason it lacks exposure > of ctl-fd, ctl-fd-ack options. There are also functional issues. I am working > to improve all that and resend fixed v5. > > ~Alexey > > On 01.06.2020 18:46, Alexey Budankov wrote: >> >> Changes in v5: >> - split re-factoring of events handling loops for stat mode >> into smaller incremental parts >> >> v4: https://lore.kernel.org/lkml/653fe5f3-c986-a841-1ed8-0a7d2fa24c00@linux.intel.com/ >> >> Changes in v4: >> - made checking of ctlfd state unconditional in record trace streaming loop >> - introduced static poll fds to keep evlist__filter_pollfd() unaffected >> - handled ret code of evlist__initialize_ctlfd() where need >> - renamed and structured handle_events() function >> - applied anonymous structs where needed >> >> v3: https://lore.kernel.org/lkml/eb38e9e5-754f-d410-1d9b-e26b702d51b7@linux.intel.com/ >> >> Changes in v3: >> - renamed functions and types from perf_evlist_ to evlist_ to avoid >> clash with libperf code; >> - extended commands to be strings of variable length consisting of >> command name and also possibly including command specific data; >> - merged docs update with the code changes; >> - updated docs for -D,--delay=-1 option for stat and record modes; >> >> v2: https://lore.kernel.org/lkml/d582cc3d-2302-c7e2-70d3-bc7ab6f628c3@linux.intel.com/ >> >> Changes in v2: >> - renamed resume and pause commands to enable and disable ones, renamed >> CTL_CMD_RESUME and CTL_CMD_PAUSE to CTL_CMD_ENABLE and CTL_CMD_DISABLE >> to fit to the appropriate ioctls and avoid mixing up with PAUSE_OUTPUT >> ioctl; >> - factored out event handling loop into a handle_events() for stat mode; >> - separated -D,--delay=-1 into separate patches for stat and record modes; >> >> v1: https://lore.kernel.org/lkml/825a5132-b58d-c0b6-b050-5a6040386ec7@linux.intel.com/ >> >> repo: tip of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git perf/core >> >> The patch set implements handling of 'start disabled', 'enable' and 'disable' >> external control commands which can be provided for stat and record modes >> of the tool from an external controlling process. 'start disabled' command >> can be used to postpone enabling of events in the beginning of a monitoring >> session. 'enable' and 'disable' commands can be used to enable and disable >> events correspondingly any time after the start of the session. >> >> The 'start disabled', 'enable' and 'disable' external control commands can be >> used to focus measurement on specially selected time intervals of workload >> execution. Focused measurement reduces tool intrusion and influence on >> workload behavior, reduces distortion and amount of collected and stored >> data, mitigates data accuracy loss because measurement and data capturing >> happen only during intervals of interest. >> >> A controlling process can be a bash shell script [1], native executable or >> any other language program that can directly work with file descriptors, >> e.g. pipes [2], and spawn a process, specially the tool one. >> >> -D,--delay option is extended with -1 value to skip events enabling >> in the beginning of a monitoring session ('start disabled' command). >> --ctl-fd and --ctl-fd-ack command line options are introduced to provide the >> tool with a pair of file descriptors to listen to control commands and reply >> to the controlling process on the completion of received commands. >> >> The tool reads control command message from ctl-fd descriptor, handles the >> command and optionally replies acknowledgement message to fd-ack descriptor, >> if it is specified on the command line. 'enable' command is recognized as >> 'enable' string message and 'disable' command is recognized as 'disable' >> string message both received from ctl-fd descriptor. Completion message is >> 'ack\n' and sent to fd-ack descriptor. >> >> Example bash script demonstrating simple use case follows: >> >> #!/bin/bash >> >> ctl_dir=/tmp/ >> >> ctl_fifo=${ctl_dir}perf_ctl.fifo >> test -p ${ctl_fifo} && unlink ${ctl_fifo} >> mkfifo ${ctl_fifo} && exec {ctl_fd}<>${ctl_fifo} >> >> ctl_ack_fifo=${ctl_dir}perf_ctl_ack.fifo >> test -p ${ctl_ack_fifo} && unlink ${ctl_ack_fifo} >> mkfifo ${ctl_ack_fifo} && exec {ctl_fd_ack}<>${ctl_ack_fifo} >> >> perf stat -D -1 -e cpu-cycles -a -I 1000 \ >> --ctl-fd ${ctl_fd} --ctl-fd-ack ${ctl_fd_ack} \ >> -- sleep 40 & >> perf_pid=$! >> >> sleep 5 && echo 'enable' >&${ctl_fd} && read -u ${ctl_fd_ack} e1 && echo "enabled(${e1})" >> sleep 10 && echo 'disable' >&${ctl_fd} && read -u ${ctl_fd_ack} d1 && echo "disabled(${d1})" >> sleep 5 && echo 'enable' >&${ctl_fd} && read -u ${ctl_fd_ack} e2 && echo "enabled(${e2})" >> sleep 10 && echo 'disable' >&${ctl_fd} && read -u ${ctl_fd_ack} d2 && echo "disabled(${d2})" >> >> exec {ctl_fd_ack}>&- && unlink ${ctl_ack_fifo} >> exec {ctl_fd}>&- && unlink ${ctl_fifo} >> >> wait -n ${perf_pid} >> exit $? >> >> >> Script output: >> >> [root@host dir] example >> Events disabled >> # time counts unit events >> 1.001101062 cpu-cycles >> 2.002994944 cpu-cycles >> 3.004864340 cpu-cycles >> 4.006727177 cpu-cycles >> Events enabled >> enabled(ack) >> 4.993808464 3,124,246 cpu-cycles >> 5.008597004 3,325,624 cpu-cycles >> 6.010387483 83,472,992 cpu-cycles >> 7.012266598 55,877,621 cpu-cycles >> 8.014175695 97,892,729 cpu-cycles >> 9.016056093 68,461,242 cpu-cycles >> 10.017937507 55,449,643 cpu-cycles >> 11.019830154 68,938,167 cpu-cycles >> 12.021719952 55,164,101 cpu-cycles >> 13.023627550 70,535,720 cpu-cycles >> 14.025580995 53,240,125 cpu-cycles >> disabled(ack) >> 14.997518260 53,558,068 cpu-cycles >> Events disabled >> 15.027216416 cpu-cycles >> 16.029052729 cpu-cycles >> 17.030904762 cpu-cycles >> 18.032073424 cpu-cycles >> 19.033805074 cpu-cycles >> Events enabled >> enabled(ack) >> 20.001279097 3,021,022 cpu-cycles >> 20.035044381 6,434,367 cpu-cycles >> 21.036923813 89,358,251 cpu-cycles >> 22.038825169 72,516,351 cpu-cycles >> # time counts unit events >> 23.040715596 55,046,157 cpu-cycles >> 24.042643757 78,128,649 cpu-cycles >> 25.044558535 61,052,428 cpu-cycles >> 26.046452785 62,142,806 cpu-cycles >> 27.048353021 74,477,971 cpu-cycles >> 28.050241286 61,001,623 cpu-cycles >> 29.052149961 61,653,502 cpu-cycles >> disabled(ack) >> 30.004980264 82,729,640 cpu-cycles >> Events disabled >> 30.053516176 cpu-cycles >> 31.055348366 cpu-cycles >> 32.057202097 cpu-cycles >> 33.059040702 cpu-cycles >> 34.060843288 cpu-cycles >> 35.000888624 cpu-cycles >> [root@host dir]# >> >> [1] http://man7.org/linux/man-pages/man1/bash.1.html >> [2] http://man7.org/linux/man-pages/man2/pipe.2.html >> >> --- >> Alexey Budankov (13): >> tools/libperf: introduce static poll file descriptors >> perf evlist: introduce control file descriptors >> perf evlist: implement control command handling functions >> perf stat: factor out body of event handling loop for system wide >> perf stat: move target check to loop control statement >> perf stat: factor out body of event handling loop for launch case >> perf stat: factor out event handling loop into dispatch_events() >> perf stat: extend -D,--delay option with -1 value >> perf stat: implement control commands handling >> perf stat: introduce --ctl-fd[-ack] options >> perf record: extend -D,--delay option with -1 value >> perf record: implement control commands handling >> perf record: introduce --ctl-fd[-ack] options >> >> tools/lib/api/fd/array.c | 42 ++++++- >> tools/lib/api/fd/array.h | 7 ++ >> tools/lib/perf/evlist.c | 11 ++ >> tools/lib/perf/include/internal/evlist.h | 2 + >> tools/perf/Documentation/perf-record.txt | 5 +- >> tools/perf/Documentation/perf-stat.txt | 45 ++++++- >> tools/perf/builtin-record.c | 34 +++++- >> tools/perf/builtin-stat.c | 145 +++++++++++++++++------ >> tools/perf/builtin-trace.c | 2 +- >> tools/perf/util/evlist.c | 131 ++++++++++++++++++++ >> tools/perf/util/evlist.h | 25 ++++ >> tools/perf/util/record.h | 4 +- >> tools/perf/util/stat.h | 4 +- >> 13 files changed, 407 insertions(+), 50 deletions(-) >>