From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: Jiri Olsa <jolsa@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 v12 05/15] perf evlist: implement control command handling functions
Date: Wed, 22 Jul 2020 09:41:34 -0300 [thread overview]
Message-ID: <20200722124134.GL77866@kernel.org> (raw)
In-Reply-To: <62518ceb-1cc9-2aba-593b-55408d07c1bf@linux.intel.com>
Em Fri, Jul 17, 2020 at 10:01:33AM +0300, Alexey Budankov escreveu:
>
> Implement functions of initialization, finalization and processing
> of control command messages coming from control file descriptors.
> Allocate control file descriptor as descriptor at struct pollfd
> object of evsel_list for atomic poll() operation.
>
> Signed-off-by: Alexey Budankov <alexey.budankov@linux.intel.com>
> Acked-by: Jiri Olsa <jolsa@redhat.com>
> Acked-by: Namhyung Kim <namhyung@kernel.org>
> ---
> tools/perf/util/evlist.c | 140 +++++++++++++++++++++++++++++++++++++++
> tools/perf/util/evlist.h | 18 +++++
> 2 files changed, 158 insertions(+)
>
> diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> index 36eb50aba1f5..fe900d82815c 100644
> --- a/tools/perf/util/evlist.c
> +++ b/tools/perf/util/evlist.c
> @@ -1714,3 +1714,143 @@ struct evsel *perf_evlist__reset_weak_group(struct evlist *evsel_list,
> }
> return leader;
> }
> +
> +int evlist__initialize_ctlfd(struct evlist *evlist, int fd, int ack)
> +{
> + if (fd == -1) {
> + pr_debug("Control descriptor is not initialized\n");
> + return 0;
> + }
> +
> + evlist->ctl_fd.pos = perf_evlist__add_pollfd(&evlist->core, fd, NULL, POLLIN,
> + fdarray_flag__nonfilterable);
> + if (evlist->ctl_fd.pos < 0) {
> + evlist->ctl_fd.pos = -1;
> + pr_err("Failed to add ctl fd entry: %m\n");
> + return -1;
> + }
> +
> + evlist->ctl_fd.fd = fd;
> + evlist->ctl_fd.ack = ack;
> +
> + return 0;
> +}
> +
> +bool evlist__ctlfd_initialized(struct evlist *evlist)
> +{
> + return evlist->ctl_fd.pos >= 0;
> +}
> +
> +int evlist__finalize_ctlfd(struct evlist *evlist)
> +{
> + struct pollfd *entries = evlist->core.pollfd.entries;
> +
> + if (!evlist__ctlfd_initialized(evlist))
> + return 0;
> +
> + entries[evlist->ctl_fd.pos].fd = -1;
> + entries[evlist->ctl_fd.pos].events = 0;
> + entries[evlist->ctl_fd.pos].revents = 0;
> +
> + evlist->ctl_fd.pos = -1;
> + evlist->ctl_fd.ack = -1;
> + evlist->ctl_fd.fd = -1;
> +
> + return 0;
> +}
> +
> +static int evlist__ctlfd_recv(struct evlist *evlist, enum evlist_ctl_cmd *cmd,
> + char *cmd_data, size_t data_size)
> +{
> + int err;
> + char c;
> + size_t bytes_read = 0;
> +
> + memset(cmd_data, 0, data_size);
> + data_size--;
> +
> + do {
> + err = read(evlist->ctl_fd.fd, &c, 1);
> + if (err > 0) {
> + if (c == '\n' || c == '\0')
> + break;
> + cmd_data[bytes_read++] = c;
> + if (bytes_read == data_size)
> + break;
> + } else {
> + if (err == -1)
> + pr_err("Failed to read from ctlfd %d: %m\n", evlist->ctl_fd.fd);
> + break;
> + }
> + } while (1);
Ok, here you don't know how many bytes you have to read, the protocol is
a string ending in \n or \0, so you can't use 'readn()', but see below
for the write() case.
Also is this ctf_fd in non-blocking mode? Can't this get stuck waiting
forever?
> + pr_debug("Message from ctl_fd: \"%s%s\"\n", cmd_data,
> + bytes_read == data_size ? "" : c == '\n' ? "\\n" : "\\0");
> +
> + if (err > 0) {
> + if (!strncmp(cmd_data, EVLIST_CTL_CMD_ENABLE_TAG,
> + (sizeof(EVLIST_CTL_CMD_ENABLE_TAG)-1))) {
> + *cmd = EVLIST_CTL_CMD_ENABLE;
> + } else if (!strncmp(cmd_data, EVLIST_CTL_CMD_DISABLE_TAG,
> + (sizeof(EVLIST_CTL_CMD_DISABLE_TAG)-1))) {
> + *cmd = EVLIST_CTL_CMD_DISABLE;
> + }
> + }
> +
> + return err;
> +}
> +
> +static int evlist__ctlfd_ack(struct evlist *evlist)
> +{
> + int err;
> +
> + if (evlist->ctl_fd.ack == -1)
> + return 0;
> +
> + err = write(evlist->ctl_fd.ack, EVLIST_CTL_CMD_ACK_TAG,
> + sizeof(EVLIST_CTL_CMD_ACK_TAG));
> + if (err == -1)
> + pr_err("failed to write to ctl_ack_fd %d: %m\n", evlist->ctl_fd.ack);
Also the function to use here is 'writen()':
/*
* Write exactly 'n' bytes or return an error.
*/
ssize_t writen(int fd, const void *buf, size_t n)
{
/* ion does not modify buf. */
return ion(false, fd, (void *)buf, n);
}
"tools/lib/perf/lib.c"
-----------------------------
I.e. libperf's fd based fwrite().
Again, this can be done on top of this patch set, so I'll continue
as-is.
- Arnaldo
next prev parent reply other threads:[~2020-07-22 12:41 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-17 6:45 [PATCH v12 00/15] perf: support enable and disable commands in stat and record modes Alexey Budankov
2020-07-17 6:59 ` [PATCH v12 01/15] tools/libperf: avoid internal moving of fdarray fds Alexey Budankov
2020-07-21 12:40 ` Arnaldo Carvalho de Melo
2020-07-17 6:59 ` [PATCH v12 02/15] tools/libperf: add flags to fdarray fds objects Alexey Budankov
2020-07-21 12:53 ` Arnaldo Carvalho de Melo
2020-07-17 7:00 ` [PATCH v12 03/15] tools/libperf: avoid counting of nonfilterable fdarray fds Alexey Budankov
2020-07-21 19:59 ` Arnaldo Carvalho de Melo
2020-07-17 7:00 ` [PATCH v12 04/15] perf evlist: introduce control file descriptors Alexey Budankov
2020-07-17 7:01 ` [PATCH v12 05/15] perf evlist: implement control command handling functions Alexey Budankov
2020-07-22 12:27 ` Arnaldo Carvalho de Melo
2020-07-22 12:34 ` Arnaldo Carvalho de Melo
2020-07-22 12:45 ` Alexey Budankov
2020-07-22 12:41 ` Arnaldo Carvalho de Melo [this message]
2020-07-17 7:02 ` [PATCH v12 06/15] perf stat: factor out body of event handling loop for system wide Alexey Budankov
2020-07-17 7:02 ` [PATCH v12 07/15] perf stat: move target check to loop control statement Alexey Budankov
2020-07-17 7:03 ` [PATCH v12 08/15] perf stat: factor out body of event handling loop for fork case Alexey Budankov
2020-07-17 7:04 ` [PATCH v12 09/15] perf stat: factor out event handling loop into dispatch_events() Alexey Budankov
2020-07-17 7:04 ` [PATCH v12 10/15] perf stat: extend -D,--delay option with -1 value Alexey Budankov
2020-07-17 7:05 ` [PATCH v12 11/15] perf stat: implement control commands handling Alexey Budankov
2020-07-22 12:56 ` Arnaldo Carvalho de Melo
2020-07-22 13:18 ` Alexey Budankov
2020-07-17 7:05 ` [PATCH v12 12/15] perf stat: introduce --control fd:ctl-fd[,ack-fd] options Alexey Budankov
2020-07-17 7:07 ` [PATCH v12 13/15] perf record: extend -D,--delay option with -1 value Alexey Budankov
2020-07-17 7:07 ` [PATCH v12 14/15] perf record: implement control commands handling Alexey Budankov
2020-07-17 7:08 ` [PATCH v12 15/15] perf record: introduce --control fd:ctl-fd[,ack-fd] options 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=20200722124134.GL77866@kernel.org \
--to=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=alexey.budankov@linux.intel.com \
--cc=jolsa@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.