On Wed, 05 Feb 2025 17:50:34 -0500
Steven Rostedt <rost...@goodmis.org> wrote:

> From: Steven Rostedt <rost...@goodmis.org>
> 
> Now that there's one page at the start of the persistent memory used by
> the ring buffer, make the part of that page that is not used by the ring
> buffer available for the tracer to use. This will allow the tracer to
> store its own persistent data.

Looks good to me.

Reviewed-by: Masami Hiramatsu (Google) <mhira...@kernel.org>

Thanks,

> 
> Signed-off-by: Steven Rostedt (Google) <rost...@goodmis.org>
> ---
>  include/linux/ring_buffer.h |  1 +
>  kernel/trace/ring_buffer.c  | 13 +++++++++++++
>  2 files changed, 14 insertions(+)
> 
> diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h
> index 8de035f4f0d9..b95f940fd07a 100644
> --- a/include/linux/ring_buffer.h
> +++ b/include/linux/ring_buffer.h
> @@ -95,6 +95,7 @@ struct trace_buffer *__ring_buffer_alloc_range(unsigned 
> long size, unsigned flag
>                                              struct lock_class_key *key);
>  
>  bool ring_buffer_last_boot_delta(struct trace_buffer *buffer, unsigned long 
> *kaslr_addr);
> +void *ring_buffer_meta_scratch(struct trace_buffer *buffer, unsigned int 
> *size);
>  
>  /*
>   * Because the ring buffer is generic, if other users of the ring buffer get
> diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
> index 0446d053dbd6..5a81ff785665 100644
> --- a/kernel/trace/ring_buffer.c
> +++ b/kernel/trace/ring_buffer.c
> @@ -1730,6 +1730,9 @@ static bool rb_meta_init(struct trace_buffer *buffer)
>       bmeta->total_size = total_size;
>       bmeta->buffers_offset = (void *)ptr - (void *)bmeta;
>  
> +     /* Zero out the scatch pad */
> +     memset((void *)bmeta + sizeof(*bmeta), 0, PAGE_SIZE - sizeof(*bmeta));
> +
>       return false;
>  }
>  
> @@ -2532,6 +2535,16 @@ bool ring_buffer_last_boot_delta(struct trace_buffer 
> *buffer, unsigned long *kas
>       return true;
>  }
>  
> +void *ring_buffer_meta_scratch(struct trace_buffer *buffer, unsigned int 
> *size)
> +{
> +     if (!buffer || !buffer->meta)
> +             return NULL;
> +
> +     *size = PAGE_SIZE - sizeof(*buffer->meta);
> +
> +     return (void *)buffer->meta + sizeof(*buffer->meta);
> +}
> +
>  /**
>   * ring_buffer_free - free a ring buffer.
>   * @buffer: the buffer to free.
> -- 
> 2.45.2
> 
> 


-- 
Masami Hiramatsu (Google) <mhira...@kernel.org>

Reply via email to