From: David Carrillo-Cisneros <davidcc@google.com>
To: linux-kernel@vger.kernel.org
Cc: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Andi Kleen <ak@linux.intel.com>, Simon Que <sque@chromium.org>,
Wang Nan <wangnan0@huawei.com>, Jiri Olsa <jolsa@kernel.org>,
He Kuang <hekuang@huawei.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
David Ahern <dsa@cumulusnetworks.com>,
Namhyung Kim <namhyung@kernel.org>,
Stephane Eranian <eranian@google.com>,
Paul Turner <pjt@google.com>,
David Carrillo-Cisneros <davidcc@google.com>
Subject: [PATCH v2 10/13] perf header: add a buffer to struct feat_fd
Date: Tue, 23 May 2017 00:48:50 -0700 [thread overview]
Message-ID: <20170523074853.54892-11-davidcc@google.com> (raw)
In-Reply-To: <20170523074853.54892-1-davidcc@google.com>
Extend struct feat_fd to use a temporal buffer in pipe-mode, rather
than a perf.data file.
Revamp write_pmu_mappings to avoid seeking so that is compatible with
pipe-mode.
Print an error when trying to use buf in features that do not support
pipe-mode.
Signed-off-by: David Carrillo-Cisneros <davidcc@google.com>
---
| 79 +++++++++++++++++++++++++++++++++++++-----------
1 file changed, 62 insertions(+), 17 deletions(-)
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 65cd2d1f1721..b7704b30ed52 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -60,6 +60,7 @@ struct perf_file_attr {
struct feat_fd {
struct perf_header *ph;
int fd;
+ void *buf; /* Either buf != NULL or fd >= 0 */
ssize_t offset;
size_t size;
};
@@ -82,11 +83,27 @@ bool perf_header__has_feat(const struct perf_header *header, int feat)
/* Return: 0 if succeded, -ERR if failed. */
int do_write(struct feat_fd *fd, const void *buf, size_t size)
{
- ssize_t ret;
+ void *addr;
- ret = writen(fd->fd, buf, size);
- if (ret != (ssize_t)size)
- return ret < 0 ? (int)ret: -1;
+ if (!fd->buf) {
+ ssize_t ret = writen(fd->fd, buf, size);
+
+ if (ret != (ssize_t)size)
+ return ret < 0 ? (int)ret : -1;
+ return 0;
+ }
+retry:
+ if (size > (fd->size - fd->offset)) {
+ addr = realloc(fd->buf, fd->size << 1);
+ if (!addr)
+ return -ENOSPC;
+ fd->buf = addr;
+ fd->size <<= 1;
+ goto retry;
+ }
+
+ memcpy(fd->buf + fd->offset, buf, size);
+ fd->offset += size;
return 0;
}
@@ -126,10 +143,21 @@ static int do_write_string(struct feat_fd *fd, const char *str)
static int __do_read(struct feat_fd *fd, void *addr, ssize_t size)
{
- ssize_t ret = readn(fd->fd, addr, size);
+ if (!fd->buf) {
+ ssize_t ret = readn(fd->fd, addr, size);
+
+ if (ret != (ssize_t)size)
+ return ret < 0 ? (int)ret : -1;
+ return 0;
+ }
+
+ assert((ssize_t)fd->size > fd->offset);
+ if (size > (ssize_t)fd->size - fd->offset)
+ return -1;
+
+ memcpy(addr, fd->buf + fd->offset, size);
+ fd->offset += size;
- if (ret != (ssize_t)size)
- return ret < 0 ? (int)ret : -1;
return 0;
}
@@ -187,6 +215,10 @@ static char *do_read_string(struct feat_fd *fd)
static int write_tracing_data(struct feat_fd *fd,
struct perf_evlist *evlist)
{
+ if (fd->buf) {
+ pr_err("Unsupported write_tracing_data to memory buffer.\n");
+ return -1;
+ }
return read_tracing_data(fd->fd, &evlist->entries);
}
@@ -201,6 +233,10 @@ static int write_build_id(struct feat_fd *fd,
if (!perf_session__read_build_ids(session, true))
return -1;
+ if (fd->buf) {
+ pr_err("Unsupported write_build_id to memory buffer.\n");
+ return -1;
+ }
err = perf_session__write_buildid_table(session, fd);
if (err < 0) {
pr_debug("failed to write buildid table\n");
@@ -795,11 +831,19 @@ static int write_pmu_mappings(struct feat_fd *fd,
struct perf_evlist *evlist __maybe_unused)
{
struct perf_pmu *pmu = NULL;
- off_t offset = lseek(fd->fd, 0, SEEK_CUR);
- __u32 pmu_num = 0;
+ u32 pmu_num = 0;
int ret;
- /* write real pmu_num later */
+ /*
+ * Do a first pass to count number of pmu to avoid lseek so this
+ * works in pipe mode as well.
+ */
+ while ((pmu = perf_pmu__scan(pmu))) {
+ if (!pmu->name)
+ continue;
+ pmu_num++;
+ }
+
ret = do_write(fd, &pmu_num, sizeof(pmu_num));
if (ret < 0)
return ret;
@@ -807,7 +851,6 @@ static int write_pmu_mappings(struct feat_fd *fd,
while ((pmu = perf_pmu__scan(pmu))) {
if (!pmu->name)
continue;
- pmu_num++;
ret = do_write(fd, &pmu->type, sizeof(pmu->type));
if (ret < 0)
@@ -818,12 +861,6 @@ static int write_pmu_mappings(struct feat_fd *fd,
return ret;
}
- if (pwrite(fd->fd, &pmu_num, sizeof(pmu_num), offset) != sizeof(pmu_num)) {
- /* discard all */
- lseek(fd->fd, offset, SEEK_SET);
- return -1;
- }
-
return 0;
}
@@ -909,6 +946,10 @@ static int write_auxtrace(struct feat_fd *fd,
struct perf_session *session;
int err;
+ if (fd->buf) {
+ pr_err("Unsupported write_auxtrace to memory buffer.\n");
+ return -1;
+ }
session = container_of(fd->ph, struct perf_session, header);
err = auxtrace_index__write(fd->fd, &session->auxtrace_index);
@@ -2187,6 +2228,10 @@ static int do_write_feat(struct feat_fd *fd, struct perf_header *h, int type,
if (!feat_ops[type].write)
return -1;
+ if (fd->buf) {
+ pr_err("Called %s for memory buffer.\n", __func__);
+ return -1;
+ }
(*p)->offset = lseek(fd->fd, 0, SEEK_CUR);
err = feat_ops[type].write(fd, evlist);
--
2.13.0.219.gdb65acc882-goog
next prev parent reply other threads:[~2017-05-23 7:51 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-23 7:48 [PATCH v2 00/13] perf tool: add meta-data header support for pipe-mode David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 01/13] perf header: encapsulate read and swap David Carrillo-Cisneros
2017-05-24 15:35 ` Namhyung Kim
2017-06-04 23:09 ` David Carrillo-Cisneros
2017-05-25 8:07 ` Jiri Olsa
2017-06-04 23:22 ` David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 02/13] perf header: add PROCESS_STR_FUN macro David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 03/13] perf header: fail on write_padded error David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 04/13] perf util: add const modifier to buf in "writen" function David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 05/13] perf header: revamp do_write David Carrillo-Cisneros
2017-05-25 8:08 ` Jiri Olsa
2017-06-05 2:25 ` David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 06/13] perf header: add struct feat_fd for write David Carrillo-Cisneros
2017-05-25 8:07 ` Jiri Olsa
2017-06-05 1:50 ` David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 07/13] perf header: use struct feat_fd for print David Carrillo-Cisneros
2017-05-25 8:09 ` Jiri Olsa
2017-06-05 2:37 ` David Carrillo-Cisneros
2017-06-05 3:01 ` David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 08/13] perf header: use struct feat_fd to process header records David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 09/13] perf header: use struct feat_fd in read " David Carrillo-Cisneros
2017-05-23 7:48 ` David Carrillo-Cisneros [this message]
2017-05-25 8:07 ` [PATCH v2 10/13] perf header: add a buffer to struct feat_fd Jiri Olsa
2017-05-25 8:08 ` Jiri Olsa
2017-05-25 8:09 ` Jiri Olsa
2017-05-25 8:10 ` Jiri Olsa
2017-05-23 7:48 ` [PATCH v2 11/13] perf header: change FEAT_OP* macros David Carrillo-Cisneros
2017-05-25 8:08 ` Jiri Olsa
2017-05-25 8:08 ` Jiri Olsa
2017-06-05 2:13 ` David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 12/13] perf tool: add show_feature_header to perf_tool David Carrillo-Cisneros
2017-05-23 7:48 ` [PATCH v2 13/13] perf tools: add feature header record to pipe-mode David Carrillo-Cisneros
2017-05-24 15:40 ` Namhyung Kim
2017-05-25 8:08 ` Jiri Olsa
2017-05-25 8:09 ` Jiri Olsa
2017-05-25 8:09 ` Jiri Olsa
2017-05-25 8:09 ` Jiri Olsa
[not found] ` <CALcN6mhWWDbnGkDP5unmbB3GPi8+LRoKW8DFAse-KMUy85Fpew@mail.gmail.com>
2017-06-06 11:03 ` Jiri Olsa
2017-05-25 8:09 ` Jiri Olsa
2017-05-25 8:10 ` Jiri Olsa
2017-06-06 1:32 ` David Carrillo-Cisneros
2017-06-06 11:04 ` Jiri Olsa
2017-06-06 18:13 ` David Carrillo-Cisneros
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=20170523074853.54892-11-davidcc@google.com \
--to=davidcc@google.com \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=dsa@cumulusnetworks.com \
--cc=eranian@google.com \
--cc=hekuang@huawei.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=sque@chromium.org \
--cc=wangnan0@huawei.com \
/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.