diff mbox series

[v2] libtraceevent: A new API for trace page size

Message ID 20211112041211.23458-1-tz.stoyanov@gmail.com (mailing list archive)
State Superseded
Headers show
Series [v2] libtraceevent: A new API for trace page size | expand

Commit Message

Tzvetomir Stoyanov (VMware) Nov. 12, 2021, 4:12 a.m. UTC
Currently, the size of a trace buffer page is equal to the size of the
system memory page. This may change in the future, so this assumption
may not be valid. The proper way to determine the trace buffer page size
is by using the information from "events/header_page" ftrace file:
 ...
 field: char data;	offset:16;	size:4080;	signed:1;
 ...
The trace buffer page size is the size of the "data" filed + its offset.

A new libtraceevent API is introduced, for getting the trace buffer page
size using that formula:
 tep_get_sub_buffer_size()

Note, that some old kernels may not have "events/header_page" file. For
those, the system memory page size is returned.

Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---

v2 changes:
 - Renamed tep_get_trace_page_size() to tep_get_sub_buffer_size().
 - Handle the old kernels in tep_parse_header_page() instead of in
   tep_get_sub_buffer_size().

 src/event-parse-api.c | 16 ++++++++++++++++
 src/event-parse.c     |  2 ++
 src/event-parse.h     |  1 +
 3 files changed, 19 insertions(+)

Comments

Steven Rostedt Nov. 23, 2021, 3:30 a.m. UTC | #1
On Fri, 12 Nov 2021 06:12:11 +0200
"Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> wrote:

> Currently, the size of a trace buffer page is equal to the size of the
> system memory page. This may change in the future, so this assumption
> may not be valid. The proper way to determine the trace buffer page size
> is by using the information from "events/header_page" ftrace file:
>  ...
>  field: char data;	offset:16;	size:4080;	signed:1;
>  ...
> The trace buffer page size is the size of the "data" filed + its offset.
> 
> A new libtraceevent API is introduced, for getting the trace buffer page
> size using that formula:
>  tep_get_sub_buffer_size()
> 
> Note, that some old kernels may not have "events/header_page" file. For
> those, the system memory page size is returned.
> 
> Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
> ---
> 
> v2 changes:
>  - Renamed tep_get_trace_page_size() to tep_get_sub_buffer_size().
>  - Handle the old kernels in tep_parse_header_page() instead of in
>    tep_get_sub_buffer_size().
> 
>  src/event-parse-api.c | 16 ++++++++++++++++
>  src/event-parse.c     |  2 ++
>  src/event-parse.h     |  1 +
>  3 files changed, 19 insertions(+)
> 
> diff --git a/src/event-parse-api.c b/src/event-parse-api.c
> index f8361e4..f8433e5 100644
> --- a/src/event-parse-api.c
> +++ b/src/event-parse-api.c
> @@ -4,6 +4,7 @@
>   *
>   */
>  
> +#include <unistd.h>

The above include isn't needed here anymore due to moving the
getpagesize into the C file.

-- Steve


>  #include "event-parse.h"
>  #include "event-parse-local.h"
>  #include "event-utils.h"
> @@ -248,6 +249,21 @@ void tep_set_page_size(struct tep_handle *tep, int _page_size)
>  		tep->page_size = _page_size;
>  }
>  
> +/**
> + * tep_get_sub_buffer_size - get the size of a trace buffer page
> + * @tep: a handle to the tep_handle
> + *
> + * This returns the size of a trace buffer page on the traced machine.
> + * If @tep is NULL then -1 is returned.
> + */
> +int tep_get_sub_buffer_size(struct tep_handle *tep)
> +{
> +	if (!tep)
> +		return -1;
> +
> +	return tep->header_page_data_size + tep->header_page_data_offset;
> +}
> +
>  /**
>   * tep_is_file_bigendian - return the endian of the file
>   * @tep: a handle to the tep_handle
> diff --git a/src/event-parse.c b/src/event-parse.c
> index f42ae38..4b67289 100644
> --- a/src/event-parse.c
> +++ b/src/event-parse.c
> @@ -17,6 +17,7 @@
>  #include <ctype.h>
>  #include <errno.h>
>  #include <stdint.h>
> +#include <unistd.h>
>  #include <limits.h>
>  #include <linux/time64.h>
>  
> @@ -6905,6 +6906,7 @@ int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
>  		tep->header_page_ts_size = sizeof(long long);
>  		tep->header_page_size_size = long_size;
>  		tep->header_page_data_offset = sizeof(long long) + long_size;
> +		tep->header_page_data_size = getpagesize() - tep->header_page_data_offset;
>  		tep->old_format = 1;
>  		return -1;
>  	}
> diff --git a/src/event-parse.h b/src/event-parse.h
> index d4a876f..e4ecde5 100644
> --- a/src/event-parse.h
> +++ b/src/event-parse.h
> @@ -565,6 +565,7 @@ void tep_set_cpus(struct tep_handle *tep, int cpus);
>  int tep_get_long_size(struct tep_handle *tep);
>  void tep_set_long_size(struct tep_handle *tep, int long_size);
>  int tep_get_page_size(struct tep_handle *tep);
> +int tep_get_sub_buffer_size(struct tep_handle *tep);
>  void tep_set_page_size(struct tep_handle *tep, int _page_size);
>  bool tep_is_file_bigendian(struct tep_handle *tep);
>  void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian);
diff mbox series

Patch

diff --git a/src/event-parse-api.c b/src/event-parse-api.c
index f8361e4..f8433e5 100644
--- a/src/event-parse-api.c
+++ b/src/event-parse-api.c
@@ -4,6 +4,7 @@ 
  *
  */
 
+#include <unistd.h>
 #include "event-parse.h"
 #include "event-parse-local.h"
 #include "event-utils.h"
@@ -248,6 +249,21 @@  void tep_set_page_size(struct tep_handle *tep, int _page_size)
 		tep->page_size = _page_size;
 }
 
+/**
+ * tep_get_sub_buffer_size - get the size of a trace buffer page
+ * @tep: a handle to the tep_handle
+ *
+ * This returns the size of a trace buffer page on the traced machine.
+ * If @tep is NULL then -1 is returned.
+ */
+int tep_get_sub_buffer_size(struct tep_handle *tep)
+{
+	if (!tep)
+		return -1;
+
+	return tep->header_page_data_size + tep->header_page_data_offset;
+}
+
 /**
  * tep_is_file_bigendian - return the endian of the file
  * @tep: a handle to the tep_handle
diff --git a/src/event-parse.c b/src/event-parse.c
index f42ae38..4b67289 100644
--- a/src/event-parse.c
+++ b/src/event-parse.c
@@ -17,6 +17,7 @@ 
 #include <ctype.h>
 #include <errno.h>
 #include <stdint.h>
+#include <unistd.h>
 #include <limits.h>
 #include <linux/time64.h>
 
@@ -6905,6 +6906,7 @@  int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
 		tep->header_page_ts_size = sizeof(long long);
 		tep->header_page_size_size = long_size;
 		tep->header_page_data_offset = sizeof(long long) + long_size;
+		tep->header_page_data_size = getpagesize() - tep->header_page_data_offset;
 		tep->old_format = 1;
 		return -1;
 	}
diff --git a/src/event-parse.h b/src/event-parse.h
index d4a876f..e4ecde5 100644
--- a/src/event-parse.h
+++ b/src/event-parse.h
@@ -565,6 +565,7 @@  void tep_set_cpus(struct tep_handle *tep, int cpus);
 int tep_get_long_size(struct tep_handle *tep);
 void tep_set_long_size(struct tep_handle *tep, int long_size);
 int tep_get_page_size(struct tep_handle *tep);
+int tep_get_sub_buffer_size(struct tep_handle *tep);
 void tep_set_page_size(struct tep_handle *tep, int _page_size);
 bool tep_is_file_bigendian(struct tep_handle *tep);
 void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian);