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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 12 Nov 2021 06:12:11 +0200
"Tzvetomir Stoyanov (VMware)" <tz.stoyanov@xxxxxxxxx> 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@xxxxxxxxx>
> ---
> 
> 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);




[Index of Archives]     [Linux USB Development]     [Linux USB Development]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux