linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv2 0/6] perf session: Add reader object
@ 2019-01-10 10:12 Jiri Olsa
  2019-01-10 10:12 ` [PATCH 1/6] perf session: Rearrange perf_session__process_events function Jiri Olsa
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Jiri Olsa @ 2019-01-10 10:12 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Peter Zijlstra

hi,
this patchset adds reader object to interface event
processing for any data. It's defined as:

  struct reader {
        int fd;
        u64 data_size;
        u64 data_offset;
  };

Now we can simply define reader object for arbitrary file
data portion and pass it to reader__process_events function
to process its data.

It's preparation for multiple file storage under perf.data
directory.

Available also in:
  git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
  perf/reader

Changes in v2:
  - rebased on latest perf/core
  - added dependency patch (1/6) that was omitted in the original post

thanks,
jirka


---
Jiri Olsa (6):
      perf session: Rearrange perf_session__process_events function
      perf session: Get rid of file_size variable
      perf session: Add reader object
      perf session: Add data_size to reader object
      perf session: Add data_offset to reader object
      perf session: Add reader__process_events function

 tools/perf/util/session.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
 1 file changed, 50 insertions(+), 35 deletions(-)

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 1/6] perf session: Rearrange perf_session__process_events function
  2019-01-10 10:12 [PATCHv2 0/6] perf session: Add reader object Jiri Olsa
@ 2019-01-10 10:12 ` Jiri Olsa
  2019-01-22 10:10   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2019-01-10 10:12 ` [PATCH 2/6] perf session: Get rid of file_size variable Jiri Olsa
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Jiri Olsa @ 2019-01-10 10:12 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Peter Zijlstra

To reduce function arguments and the code.

Link: http://lkml.kernel.org/n/tip-xuzuxyxqpl2n0otolfnew0o@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/session.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 5456c84c7dd1..ad14192db811 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1820,13 +1820,14 @@ fetch_mmaped_event(struct perf_session *session,
 #define NUM_MMAPS 128
 #endif
 
-static int __perf_session__process_events(struct perf_session *session,
-					  u64 data_offset, u64 data_size,
-					  u64 file_size)
+static int __perf_session__process_events(struct perf_session *session)
 {
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
 	int fd = perf_data__fd(session->data);
+	u64 file_size = perf_data__size(session->data);
+	u64 data_offset = session->header.data_offset;
+	u64 data_size = session->header.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
 	int err, mmap_prot, mmap_flags, map_idx = 0;
 	size_t	mmap_size;
@@ -1944,20 +1945,13 @@ static int __perf_session__process_events(struct perf_session *session,
 
 int perf_session__process_events(struct perf_session *session)
 {
-	u64 size = perf_data__size(session->data);
-	int err;
-
 	if (perf_session__register_idle_thread(session) < 0)
 		return -ENOMEM;
 
-	if (!perf_data__is_pipe(session->data))
-		err = __perf_session__process_events(session,
-						     session->header.data_offset,
-						     session->header.data_size, size);
-	else
-		err = __perf_session__process_pipe_events(session);
+	if (perf_data__is_pipe(session->data))
+		return __perf_session__process_pipe_events(session);
 
-	return err;
+	return __perf_session__process_events(session);
 }
 
 bool perf_session__has_traces(struct perf_session *session, const char *msg)
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 2/6] perf session: Get rid of file_size variable
  2019-01-10 10:12 [PATCHv2 0/6] perf session: Add reader object Jiri Olsa
  2019-01-10 10:12 ` [PATCH 1/6] perf session: Rearrange perf_session__process_events function Jiri Olsa
@ 2019-01-10 10:12 ` Jiri Olsa
  2019-01-22 10:11   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2019-01-10 10:12 ` [PATCH 3/6] perf session: Add reader object Jiri Olsa
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Jiri Olsa @ 2019-01-10 10:12 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Peter Zijlstra

It's not needed and removing it makes the code little
more simple for upcoming changes.

It's safe to replace file_size with data_size, because
perf_data__size value is never smaller than data_offset
+ data_size.

Link: http://lkml.kernel.org/n/tip-ocz7zwwkkx11v0mkxrtcddih@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/session.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index ad14192db811..c8c2069fb01e 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1825,7 +1825,6 @@ static int __perf_session__process_events(struct perf_session *session)
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
 	int fd = perf_data__fd(session->data);
-	u64 file_size = perf_data__size(session->data);
 	u64 data_offset = session->header.data_offset;
 	u64 data_size = session->header.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
@@ -1845,14 +1844,13 @@ static int __perf_session__process_events(struct perf_session *session)
 	if (data_size == 0)
 		goto out;
 
-	if (data_offset + data_size < file_size)
-		file_size = data_offset + data_size;
+	ui_progress__init_size(&prog, data_size, "Processing events...");
 
-	ui_progress__init_size(&prog, file_size, "Processing events...");
+	data_size += data_offset;
 
 	mmap_size = MMAP_SIZE;
-	if (mmap_size > file_size) {
-		mmap_size = file_size;
+	if (mmap_size > data_size) {
+		mmap_size = data_size;
 		session->one_mmap = true;
 	}
 
@@ -1917,7 +1915,7 @@ static int __perf_session__process_events(struct perf_session *session)
 	if (session_done())
 		goto out;
 
-	if (file_pos < file_size)
+	if (file_pos < data_size)
 		goto more;
 
 out:
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 3/6] perf session: Add reader object
  2019-01-10 10:12 [PATCHv2 0/6] perf session: Add reader object Jiri Olsa
  2019-01-10 10:12 ` [PATCH 1/6] perf session: Rearrange perf_session__process_events function Jiri Olsa
  2019-01-10 10:12 ` [PATCH 2/6] perf session: Get rid of file_size variable Jiri Olsa
@ 2019-01-10 10:12 ` Jiri Olsa
  2019-01-22 10:11   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2019-01-10 10:12 ` [PATCH 4/6] perf session: Add data_size to " Jiri Olsa
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Jiri Olsa @ 2019-01-10 10:12 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Peter Zijlstra

Adding session private reader object to encapsulate reading
of the event data block. Starting with fd field inside.

Link: http://lkml.kernel.org/n/tip-glbs0xvtdcstckscvahueigf@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/session.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index c8c2069fb01e..06379cc87f59 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1820,11 +1820,17 @@ fetch_mmaped_event(struct perf_session *session,
 #define NUM_MMAPS 128
 #endif
 
+struct reader {
+	int	fd;
+};
+
 static int __perf_session__process_events(struct perf_session *session)
 {
+	struct reader rd = {
+		.fd		= perf_data__fd(session->data),
+	};
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
-	int fd = perf_data__fd(session->data);
 	u64 data_offset = session->header.data_offset;
 	u64 data_size = session->header.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
@@ -1864,7 +1870,7 @@ static int __perf_session__process_events(struct perf_session *session)
 		mmap_flags = MAP_PRIVATE;
 	}
 remap:
-	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, fd,
+	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, rd.fd,
 		   file_offset);
 	if (buf == MAP_FAILED) {
 		pr_err("failed to mmap file\n");
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 4/6] perf session: Add data_size to reader object
  2019-01-10 10:12 [PATCHv2 0/6] perf session: Add reader object Jiri Olsa
                   ` (2 preceding siblings ...)
  2019-01-10 10:12 ` [PATCH 3/6] perf session: Add reader object Jiri Olsa
@ 2019-01-10 10:12 ` Jiri Olsa
  2019-01-22 10:12   ` [tip:perf/core] perf session: Add 'data_size' member " tip-bot for Jiri Olsa
  2019-01-10 10:13 ` [PATCH 5/6] perf session: Add data_offset " Jiri Olsa
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Jiri Olsa @ 2019-01-10 10:12 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Peter Zijlstra

Adding data_size to reader object. Keeping the data_size
variable instead of replacing it with rd.data_size as it
will be used in following patch.

Link: http://lkml.kernel.org/n/tip-5xcux9957yqsljh1cm5ngyqy@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/session.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 06379cc87f59..9f29ed743425 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1822,17 +1822,19 @@ fetch_mmaped_event(struct perf_session *session,
 
 struct reader {
 	int	fd;
+	u64	data_size;
 };
 
 static int __perf_session__process_events(struct perf_session *session)
 {
 	struct reader rd = {
 		.fd		= perf_data__fd(session->data),
+		.data_size	= session->header.data_size,
 	};
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
 	u64 data_offset = session->header.data_offset;
-	u64 data_size = session->header.data_size;
+	u64 data_size = rd.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
 	int err, mmap_prot, mmap_flags, map_idx = 0;
 	size_t	mmap_size;
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 5/6] perf session: Add data_offset to reader object
  2019-01-10 10:12 [PATCHv2 0/6] perf session: Add reader object Jiri Olsa
                   ` (3 preceding siblings ...)
  2019-01-10 10:12 ` [PATCH 4/6] perf session: Add data_size to " Jiri Olsa
@ 2019-01-10 10:13 ` Jiri Olsa
  2019-01-22 10:13   ` [tip:perf/core] perf session: Add 'data_offset' member " tip-bot for Jiri Olsa
  2019-01-10 10:13 ` [PATCH 6/6] perf session: Add reader__process_events function Jiri Olsa
  2019-01-11  1:31 ` [PATCHv2 0/6] perf session: Add reader object Namhyung Kim
  6 siblings, 1 reply; 15+ messages in thread
From: Jiri Olsa @ 2019-01-10 10:13 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Peter Zijlstra

Adding data_offset to reader object.

Link: http://lkml.kernel.org/n/tip-k531enq5bmack3mjccjblvi6@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/session.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 9f29ed743425..173cf445475c 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1823,6 +1823,7 @@ fetch_mmaped_event(struct perf_session *session,
 struct reader {
 	int	fd;
 	u64	data_size;
+	u64	data_offset;
 };
 
 static int __perf_session__process_events(struct perf_session *session)
@@ -1830,10 +1831,10 @@ static int __perf_session__process_events(struct perf_session *session)
 	struct reader rd = {
 		.fd		= perf_data__fd(session->data),
 		.data_size	= session->header.data_size,
+		.data_offset	= session->header.data_offset,
 	};
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
-	u64 data_offset = session->header.data_offset;
 	u64 data_size = rd.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
 	int err, mmap_prot, mmap_flags, map_idx = 0;
@@ -1845,16 +1846,16 @@ static int __perf_session__process_events(struct perf_session *session)
 
 	perf_tool__fill_defaults(tool);
 
-	page_offset = page_size * (data_offset / page_size);
+	page_offset = page_size * (rd.data_offset / page_size);
 	file_offset = page_offset;
-	head = data_offset - page_offset;
+	head = rd.data_offset - page_offset;
 
 	if (data_size == 0)
 		goto out;
 
 	ui_progress__init_size(&prog, data_size, "Processing events...");
 
-	data_size += data_offset;
+	data_size += rd.data_offset;
 
 	mmap_size = MMAP_SIZE;
 	if (mmap_size > data_size) {
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 6/6] perf session: Add reader__process_events function
  2019-01-10 10:12 [PATCHv2 0/6] perf session: Add reader object Jiri Olsa
                   ` (4 preceding siblings ...)
  2019-01-10 10:13 ` [PATCH 5/6] perf session: Add data_offset " Jiri Olsa
@ 2019-01-10 10:13 ` Jiri Olsa
  2019-01-22 10:13   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2019-01-11  1:31 ` [PATCHv2 0/6] perf session: Add reader object Namhyung Kim
  6 siblings, 1 reply; 15+ messages in thread
From: Jiri Olsa @ 2019-01-10 10:13 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Peter Zijlstra

Adding reader__process_events function to readers data.

The reader object is defined by file's fd, data offset
and data size.

Now we can simply define reader object for arbitrary file
data portion and pass it to reader__process_events function
to process its data.

Link: http://lkml.kernel.org/n/tip-sh3yfoavlzr2f45rf8g6145j@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/session.c | 62 ++++++++++++++++++++++++---------------
 1 file changed, 38 insertions(+), 24 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 173cf445475c..d6f41611f504 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1826,36 +1826,25 @@ struct reader {
 	u64	data_offset;
 };
 
-static int __perf_session__process_events(struct perf_session *session)
+static int
+reader__process_events(struct reader *rd, struct perf_session *session,
+		       struct ui_progress *prog)
 {
-	struct reader rd = {
-		.fd		= perf_data__fd(session->data),
-		.data_size	= session->header.data_size,
-		.data_offset	= session->header.data_offset,
-	};
-	struct ordered_events *oe = &session->ordered_events;
-	struct perf_tool *tool = session->tool;
-	u64 data_size = rd.data_size;
+	u64 data_size = rd->data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
-	int err, mmap_prot, mmap_flags, map_idx = 0;
+	int err = 0, mmap_prot, mmap_flags, map_idx = 0;
 	size_t	mmap_size;
 	char *buf, *mmaps[NUM_MMAPS];
 	union perf_event *event;
-	struct ui_progress prog;
 	s64 skip;
 
-	perf_tool__fill_defaults(tool);
-
-	page_offset = page_size * (rd.data_offset / page_size);
+	page_offset = page_size * (rd->data_offset / page_size);
 	file_offset = page_offset;
-	head = rd.data_offset - page_offset;
+	head = rd->data_offset - page_offset;
 
-	if (data_size == 0)
-		goto out;
+	ui_progress__init_size(prog, data_size, "Processing events...");
 
-	ui_progress__init_size(&prog, data_size, "Processing events...");
-
-	data_size += rd.data_offset;
+	data_size += rd->data_offset;
 
 	mmap_size = MMAP_SIZE;
 	if (mmap_size > data_size) {
@@ -1873,12 +1862,12 @@ static int __perf_session__process_events(struct perf_session *session)
 		mmap_flags = MAP_PRIVATE;
 	}
 remap:
-	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, rd.fd,
+	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, rd->fd,
 		   file_offset);
 	if (buf == MAP_FAILED) {
 		pr_err("failed to mmap file\n");
 		err = -errno;
-		goto out_err;
+		goto out;
 	}
 	mmaps[map_idx] = buf;
 	map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1);
@@ -1910,7 +1899,7 @@ static int __perf_session__process_events(struct perf_session *session)
 		       file_offset + head, event->header.size,
 		       event->header.type);
 		err = -EINVAL;
-		goto out_err;
+		goto out;
 	}
 
 	if (skip)
@@ -1919,7 +1908,7 @@ static int __perf_session__process_events(struct perf_session *session)
 	head += size;
 	file_pos += size;
 
-	ui_progress__update(&prog, size);
+	ui_progress__update(prog, size);
 
 	if (session_done())
 		goto out;
@@ -1928,6 +1917,31 @@ static int __perf_session__process_events(struct perf_session *session)
 		goto more;
 
 out:
+	return err;
+}
+
+static int __perf_session__process_events(struct perf_session *session)
+{
+	struct reader rd = {
+		.fd		= perf_data__fd(session->data),
+		.data_size	= session->header.data_size,
+		.data_offset	= session->header.data_offset,
+	};
+	struct ordered_events *oe = &session->ordered_events;
+	struct perf_tool *tool = session->tool;
+	struct ui_progress prog;
+	int err;
+
+	perf_tool__fill_defaults(tool);
+
+	if (rd.data_size == 0)
+		return -1;
+
+	ui_progress__init_size(&prog, rd.data_size, "Processing events...");
+
+	err = reader__process_events(&rd, session, &prog);
+	if (err)
+		goto out_err;
 	/* do the final flush for ordered samples */
 	err = ordered_events__flush(oe, OE_FLUSH__FINAL);
 	if (err)
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCHv2 0/6] perf session: Add reader object
  2019-01-10 10:12 [PATCHv2 0/6] perf session: Add reader object Jiri Olsa
                   ` (5 preceding siblings ...)
  2019-01-10 10:13 ` [PATCH 6/6] perf session: Add reader__process_events function Jiri Olsa
@ 2019-01-11  1:31 ` Namhyung Kim
  2019-01-11 13:53   ` Arnaldo Carvalho de Melo
  6 siblings, 1 reply; 15+ messages in thread
From: Namhyung Kim @ 2019-01-11  1:31 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, lkml, Ingo Molnar, Alexander Shishkin,
	Peter Zijlstra, kernel-team

Hi Jirka,

On Thu, Jan 10, 2019 at 11:12:55AM +0100, Jiri Olsa wrote:
> hi,
> this patchset adds reader object to interface event
> processing for any data. It's defined as:
> 
>   struct reader {
>         int fd;
>         u64 data_size;
>         u64 data_offset;
>   };
> 
> Now we can simply define reader object for arbitrary file
> data portion and pass it to reader__process_events function
> to process its data.
> 
> It's preparation for multiple file storage under perf.data
> directory.

I'm looking forward to seeing it soon! :)

Acked-by: Namhyung Kim <namhyung@kernel.org>

Thanks,
Namhyung


> 
> Available also in:
>   git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
>   perf/reader
> 
> Changes in v2:
>   - rebased on latest perf/core
>   - added dependency patch (1/6) that was omitted in the original post
> 
> thanks,
> jirka
> 
> 
> ---
> Jiri Olsa (6):
>       perf session: Rearrange perf_session__process_events function
>       perf session: Get rid of file_size variable
>       perf session: Add reader object
>       perf session: Add data_size to reader object
>       perf session: Add data_offset to reader object
>       perf session: Add reader__process_events function
> 
>  tools/perf/util/session.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
>  1 file changed, 50 insertions(+), 35 deletions(-)

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCHv2 0/6] perf session: Add reader object
  2019-01-11  1:31 ` [PATCHv2 0/6] perf session: Add reader object Namhyung Kim
@ 2019-01-11 13:53   ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2019-01-11 13:53 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Namhyung Kim, linux-kernel, Ingo Molnar, Alexander Shishkin,
	Peter Zijlstra, kernel-team

Em Fri, Jan 11, 2019 at 10:31:16AM +0900, Namhyung Kim escreveu:
> Hi Jirka,
> 
> On Thu, Jan 10, 2019 at 11:12:55AM +0100, Jiri Olsa wrote:
> > hi,
> > this patchset adds reader object to interface event
> > processing for any data. It's defined as:
> > 
> >   struct reader {
> >         int fd;
> >         u64 data_size;
> >         u64 data_offset;
> >   };
> > 
> > Now we can simply define reader object for arbitrary file
> > data portion and pass it to reader__process_events function
> > to process its data.
> > 
> > It's preparation for multiple file storage under perf.data
> > directory.
> 
> I'm looking forward to seeing it soon! :)
> 
> Acked-by: Namhyung Kim <namhyung@kernel.org>

Thanks, baby steps, prepping the stage for using multiple readers, one
per thread, etc, applied.

- Arnaldo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [tip:perf/core] perf session: Rearrange perf_session__process_events function
  2019-01-10 10:12 ` [PATCH 1/6] perf session: Rearrange perf_session__process_events function Jiri Olsa
@ 2019-01-22 10:10   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 15+ messages in thread
From: tip-bot for Jiri Olsa @ 2019-01-22 10:10 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: hpa, mingo, peterz, tglx, alexander.shishkin, namhyung,
	linux-kernel, acme, jolsa

Commit-ID:  7ba4da100261482afcb693a1b39e483c9c03aba2
Gitweb:     https://git.kernel.org/tip/7ba4da100261482afcb693a1b39e483c9c03aba2
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Thu, 10 Jan 2019 11:12:56 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 21 Jan 2019 15:15:57 -0300

perf session: Rearrange perf_session__process_events function

To reduce function arguments and the code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20190110101301.6196-2-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/session.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 5456c84c7dd1..ad14192db811 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1820,13 +1820,14 @@ fetch_mmaped_event(struct perf_session *session,
 #define NUM_MMAPS 128
 #endif
 
-static int __perf_session__process_events(struct perf_session *session,
-					  u64 data_offset, u64 data_size,
-					  u64 file_size)
+static int __perf_session__process_events(struct perf_session *session)
 {
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
 	int fd = perf_data__fd(session->data);
+	u64 file_size = perf_data__size(session->data);
+	u64 data_offset = session->header.data_offset;
+	u64 data_size = session->header.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
 	int err, mmap_prot, mmap_flags, map_idx = 0;
 	size_t	mmap_size;
@@ -1944,20 +1945,13 @@ out_err:
 
 int perf_session__process_events(struct perf_session *session)
 {
-	u64 size = perf_data__size(session->data);
-	int err;
-
 	if (perf_session__register_idle_thread(session) < 0)
 		return -ENOMEM;
 
-	if (!perf_data__is_pipe(session->data))
-		err = __perf_session__process_events(session,
-						     session->header.data_offset,
-						     session->header.data_size, size);
-	else
-		err = __perf_session__process_pipe_events(session);
+	if (perf_data__is_pipe(session->data))
+		return __perf_session__process_pipe_events(session);
 
-	return err;
+	return __perf_session__process_events(session);
 }
 
 bool perf_session__has_traces(struct perf_session *session, const char *msg)

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [tip:perf/core] perf session: Get rid of file_size variable
  2019-01-10 10:12 ` [PATCH 2/6] perf session: Get rid of file_size variable Jiri Olsa
@ 2019-01-22 10:11   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 15+ messages in thread
From: tip-bot for Jiri Olsa @ 2019-01-22 10:11 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: acme, alexander.shishkin, peterz, jolsa, linux-kernel, hpa,
	mingo, tglx, namhyung

Commit-ID:  4f5a473d79c755d2e325c9a8dab01804d5416923
Gitweb:     https://git.kernel.org/tip/4f5a473d79c755d2e325c9a8dab01804d5416923
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Thu, 10 Jan 2019 11:12:57 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 21 Jan 2019 15:15:57 -0300

perf session: Get rid of file_size variable

It's not needed and removing it makes the code a little simpler for the
upcoming changes.

It's safe to replace file_size with data_size, because the
perf_data__size() value is never smaller than data_offset + data_size.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20190110101301.6196-3-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/session.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index ad14192db811..c8c2069fb01e 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1825,7 +1825,6 @@ static int __perf_session__process_events(struct perf_session *session)
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
 	int fd = perf_data__fd(session->data);
-	u64 file_size = perf_data__size(session->data);
 	u64 data_offset = session->header.data_offset;
 	u64 data_size = session->header.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
@@ -1845,14 +1844,13 @@ static int __perf_session__process_events(struct perf_session *session)
 	if (data_size == 0)
 		goto out;
 
-	if (data_offset + data_size < file_size)
-		file_size = data_offset + data_size;
+	ui_progress__init_size(&prog, data_size, "Processing events...");
 
-	ui_progress__init_size(&prog, file_size, "Processing events...");
+	data_size += data_offset;
 
 	mmap_size = MMAP_SIZE;
-	if (mmap_size > file_size) {
-		mmap_size = file_size;
+	if (mmap_size > data_size) {
+		mmap_size = data_size;
 		session->one_mmap = true;
 	}
 
@@ -1917,7 +1915,7 @@ more:
 	if (session_done())
 		goto out;
 
-	if (file_pos < file_size)
+	if (file_pos < data_size)
 		goto more;
 
 out:

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [tip:perf/core] perf session: Add reader object
  2019-01-10 10:12 ` [PATCH 3/6] perf session: Add reader object Jiri Olsa
@ 2019-01-22 10:11   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 15+ messages in thread
From: tip-bot for Jiri Olsa @ 2019-01-22 10:11 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: tglx, alexander.shishkin, mingo, linux-kernel, peterz, namhyung,
	jolsa, hpa, acme

Commit-ID:  82715eb184c55b5097c8f1022f54303c2ddbc329
Gitweb:     https://git.kernel.org/tip/82715eb184c55b5097c8f1022f54303c2ddbc329
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Thu, 10 Jan 2019 11:12:58 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 21 Jan 2019 15:15:57 -0300

perf session: Add reader object

Add a session private reader object to encapsulate the reading of the
event data block. Starting with a 'fd' field.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20190110101301.6196-4-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/session.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index c8c2069fb01e..06379cc87f59 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1820,11 +1820,17 @@ fetch_mmaped_event(struct perf_session *session,
 #define NUM_MMAPS 128
 #endif
 
+struct reader {
+	int	fd;
+};
+
 static int __perf_session__process_events(struct perf_session *session)
 {
+	struct reader rd = {
+		.fd		= perf_data__fd(session->data),
+	};
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
-	int fd = perf_data__fd(session->data);
 	u64 data_offset = session->header.data_offset;
 	u64 data_size = session->header.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
@@ -1864,7 +1870,7 @@ static int __perf_session__process_events(struct perf_session *session)
 		mmap_flags = MAP_PRIVATE;
 	}
 remap:
-	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, fd,
+	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, rd.fd,
 		   file_offset);
 	if (buf == MAP_FAILED) {
 		pr_err("failed to mmap file\n");

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [tip:perf/core] perf session: Add 'data_size' member to reader object
  2019-01-10 10:12 ` [PATCH 4/6] perf session: Add data_size to " Jiri Olsa
@ 2019-01-22 10:12   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 15+ messages in thread
From: tip-bot for Jiri Olsa @ 2019-01-22 10:12 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: alexander.shishkin, hpa, linux-kernel, peterz, jolsa, acme,
	mingo, namhyung, tglx

Commit-ID:  f66f0950527cd070d2949a0133275c30e717ba9b
Gitweb:     https://git.kernel.org/tip/f66f0950527cd070d2949a0133275c30e717ba9b
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Thu, 10 Jan 2019 11:12:59 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 21 Jan 2019 15:15:57 -0300

perf session: Add 'data_size' member to reader object

Add a  'data_size' member to the reader object. Keep the 'data_size'
variable instead of replacing it with rd.data_size as it will be used in
the following patch.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20190110101301.6196-5-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/session.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 06379cc87f59..9f29ed743425 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1822,17 +1822,19 @@ fetch_mmaped_event(struct perf_session *session,
 
 struct reader {
 	int	fd;
+	u64	data_size;
 };
 
 static int __perf_session__process_events(struct perf_session *session)
 {
 	struct reader rd = {
 		.fd		= perf_data__fd(session->data),
+		.data_size	= session->header.data_size,
 	};
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
 	u64 data_offset = session->header.data_offset;
-	u64 data_size = session->header.data_size;
+	u64 data_size = rd.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
 	int err, mmap_prot, mmap_flags, map_idx = 0;
 	size_t	mmap_size;

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [tip:perf/core] perf session: Add 'data_offset' member to reader object
  2019-01-10 10:13 ` [PATCH 5/6] perf session: Add data_offset " Jiri Olsa
@ 2019-01-22 10:13   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 15+ messages in thread
From: tip-bot for Jiri Olsa @ 2019-01-22 10:13 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: hpa, mingo, alexander.shishkin, peterz, namhyung, acme, tglx,
	linux-kernel, jolsa

Commit-ID:  71002bd214822a15bee0f7bc033a0dbf95cf780b
Gitweb:     https://git.kernel.org/tip/71002bd214822a15bee0f7bc033a0dbf95cf780b
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Thu, 10 Jan 2019 11:13:00 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 21 Jan 2019 15:15:57 -0300

perf session: Add 'data_offset' member to reader object

Add 'data_offset' member to reader object.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20190110101301.6196-6-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/session.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 9f29ed743425..173cf445475c 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1823,6 +1823,7 @@ fetch_mmaped_event(struct perf_session *session,
 struct reader {
 	int	fd;
 	u64	data_size;
+	u64	data_offset;
 };
 
 static int __perf_session__process_events(struct perf_session *session)
@@ -1830,10 +1831,10 @@ static int __perf_session__process_events(struct perf_session *session)
 	struct reader rd = {
 		.fd		= perf_data__fd(session->data),
 		.data_size	= session->header.data_size,
+		.data_offset	= session->header.data_offset,
 	};
 	struct ordered_events *oe = &session->ordered_events;
 	struct perf_tool *tool = session->tool;
-	u64 data_offset = session->header.data_offset;
 	u64 data_size = rd.data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
 	int err, mmap_prot, mmap_flags, map_idx = 0;
@@ -1845,16 +1846,16 @@ static int __perf_session__process_events(struct perf_session *session)
 
 	perf_tool__fill_defaults(tool);
 
-	page_offset = page_size * (data_offset / page_size);
+	page_offset = page_size * (rd.data_offset / page_size);
 	file_offset = page_offset;
-	head = data_offset - page_offset;
+	head = rd.data_offset - page_offset;
 
 	if (data_size == 0)
 		goto out;
 
 	ui_progress__init_size(&prog, data_size, "Processing events...");
 
-	data_size += data_offset;
+	data_size += rd.data_offset;
 
 	mmap_size = MMAP_SIZE;
 	if (mmap_size > data_size) {

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [tip:perf/core] perf session: Add reader__process_events function
  2019-01-10 10:13 ` [PATCH 6/6] perf session: Add reader__process_events function Jiri Olsa
@ 2019-01-22 10:13   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 15+ messages in thread
From: tip-bot for Jiri Olsa @ 2019-01-22 10:13 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: hpa, tglx, linux-kernel, acme, peterz, mingo, alexander.shishkin,
	namhyung, jolsa

Commit-ID:  3c7b67b23eb317787d113b1e9a6d82250202a1e3
Gitweb:     https://git.kernel.org/tip/3c7b67b23eb317787d113b1e9a6d82250202a1e3
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Thu, 10 Jan 2019 11:13:01 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 21 Jan 2019 15:15:57 -0300

perf session: Add reader__process_events function

The reader object is defined by file's fd, data offset and data size.

Now we can simply define a reader object for an arbitrary file data
portion and pass it to reader__process_events().

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20190110101301.6196-7-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/session.c | 62 +++++++++++++++++++++++++++++------------------
 1 file changed, 38 insertions(+), 24 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 173cf445475c..d6f41611f504 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1826,36 +1826,25 @@ struct reader {
 	u64	data_offset;
 };
 
-static int __perf_session__process_events(struct perf_session *session)
+static int
+reader__process_events(struct reader *rd, struct perf_session *session,
+		       struct ui_progress *prog)
 {
-	struct reader rd = {
-		.fd		= perf_data__fd(session->data),
-		.data_size	= session->header.data_size,
-		.data_offset	= session->header.data_offset,
-	};
-	struct ordered_events *oe = &session->ordered_events;
-	struct perf_tool *tool = session->tool;
-	u64 data_size = rd.data_size;
+	u64 data_size = rd->data_size;
 	u64 head, page_offset, file_offset, file_pos, size;
-	int err, mmap_prot, mmap_flags, map_idx = 0;
+	int err = 0, mmap_prot, mmap_flags, map_idx = 0;
 	size_t	mmap_size;
 	char *buf, *mmaps[NUM_MMAPS];
 	union perf_event *event;
-	struct ui_progress prog;
 	s64 skip;
 
-	perf_tool__fill_defaults(tool);
-
-	page_offset = page_size * (rd.data_offset / page_size);
+	page_offset = page_size * (rd->data_offset / page_size);
 	file_offset = page_offset;
-	head = rd.data_offset - page_offset;
+	head = rd->data_offset - page_offset;
 
-	if (data_size == 0)
-		goto out;
+	ui_progress__init_size(prog, data_size, "Processing events...");
 
-	ui_progress__init_size(&prog, data_size, "Processing events...");
-
-	data_size += rd.data_offset;
+	data_size += rd->data_offset;
 
 	mmap_size = MMAP_SIZE;
 	if (mmap_size > data_size) {
@@ -1873,12 +1862,12 @@ static int __perf_session__process_events(struct perf_session *session)
 		mmap_flags = MAP_PRIVATE;
 	}
 remap:
-	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, rd.fd,
+	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, rd->fd,
 		   file_offset);
 	if (buf == MAP_FAILED) {
 		pr_err("failed to mmap file\n");
 		err = -errno;
-		goto out_err;
+		goto out;
 	}
 	mmaps[map_idx] = buf;
 	map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1);
@@ -1910,7 +1899,7 @@ more:
 		       file_offset + head, event->header.size,
 		       event->header.type);
 		err = -EINVAL;
-		goto out_err;
+		goto out;
 	}
 
 	if (skip)
@@ -1919,7 +1908,7 @@ more:
 	head += size;
 	file_pos += size;
 
-	ui_progress__update(&prog, size);
+	ui_progress__update(prog, size);
 
 	if (session_done())
 		goto out;
@@ -1928,6 +1917,31 @@ more:
 		goto more;
 
 out:
+	return err;
+}
+
+static int __perf_session__process_events(struct perf_session *session)
+{
+	struct reader rd = {
+		.fd		= perf_data__fd(session->data),
+		.data_size	= session->header.data_size,
+		.data_offset	= session->header.data_offset,
+	};
+	struct ordered_events *oe = &session->ordered_events;
+	struct perf_tool *tool = session->tool;
+	struct ui_progress prog;
+	int err;
+
+	perf_tool__fill_defaults(tool);
+
+	if (rd.data_size == 0)
+		return -1;
+
+	ui_progress__init_size(&prog, rd.data_size, "Processing events...");
+
+	err = reader__process_events(&rd, session, &prog);
+	if (err)
+		goto out_err;
 	/* do the final flush for ordered samples */
 	err = ordered_events__flush(oe, OE_FLUSH__FINAL);
 	if (err)

^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2019-01-22 10:14 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-10 10:12 [PATCHv2 0/6] perf session: Add reader object Jiri Olsa
2019-01-10 10:12 ` [PATCH 1/6] perf session: Rearrange perf_session__process_events function Jiri Olsa
2019-01-22 10:10   ` [tip:perf/core] " tip-bot for Jiri Olsa
2019-01-10 10:12 ` [PATCH 2/6] perf session: Get rid of file_size variable Jiri Olsa
2019-01-22 10:11   ` [tip:perf/core] " tip-bot for Jiri Olsa
2019-01-10 10:12 ` [PATCH 3/6] perf session: Add reader object Jiri Olsa
2019-01-22 10:11   ` [tip:perf/core] " tip-bot for Jiri Olsa
2019-01-10 10:12 ` [PATCH 4/6] perf session: Add data_size to " Jiri Olsa
2019-01-22 10:12   ` [tip:perf/core] perf session: Add 'data_size' member " tip-bot for Jiri Olsa
2019-01-10 10:13 ` [PATCH 5/6] perf session: Add data_offset " Jiri Olsa
2019-01-22 10:13   ` [tip:perf/core] perf session: Add 'data_offset' member " tip-bot for Jiri Olsa
2019-01-10 10:13 ` [PATCH 6/6] perf session: Add reader__process_events function Jiri Olsa
2019-01-22 10:13   ` [tip:perf/core] " tip-bot for Jiri Olsa
2019-01-11  1:31 ` [PATCHv2 0/6] perf session: Add reader object Namhyung Kim
2019-01-11 13:53   ` Arnaldo Carvalho de Melo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).