From: Mike Rapoport <rppt@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
Linus Torvalds <torvalds@linux-foundation.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Andrew Morton <akpm@linux-foundation.org>,
Vincent Donnefort <vdonnefort@google.com>,
Vlastimil Babka <vbabka@suse.cz>, Jann Horn <jannh@google.com>
Subject: Re: [PATCH v5 2/4] tracing: Have reserve_mem use phys_to_virt() and separate from memmap buffer
Date: Wed, 2 Apr 2025 12:24:12 +0300 [thread overview]
Message-ID: <Z-0CPFGDqcUt-fMp@kernel.org> (raw)
In-Reply-To: <20250401225842.429332654@goodmis.org>
On Tue, Apr 01, 2025 at 06:58:13PM -0400, Steven Rostedt wrote:
> From: Steven Rostedt <rostedt@goodmis.org>
>
> The reserve_mem kernel command line option may pass back a physical
> address, but the memory is still part of the normal memory just like
> using memblock_reserve() would be. This means that the physical memory
... using memblock_alloc() would be
> returned by the reserve_mem command line option can be converted directly
> to virtual memory by simply using phys_to_virt().
>
> When freeing the buffer there's no need to call vunmap() anymore as the
> memory allocated by reserve_mem is freed by the call to
> reserve_mem_release_by_name().
>
> Because the persistent ring buffer can also be allocated via the memmap
> option, which *is* different than normal memory as it cannot be added back
> to the buddy system, it must be treated differently. It still needs to be
> virtually mapped to have access to it. It also can not be freed nor can it
> ever be memory mapped to user space.
>
> Create a new trace_array flag called TRACE_ARRAY_FL_MEMMAP which gets set
> if the buffer is created by the memmap option, and this will prevent the
> buffer from being memory mapped by user space.
>
> Also increment the ref count for memmap'ed buffers so that they can never
> be freed.
>
> Link: https://lore.kernel.org/all/Z-wFszhJ_9o4dc8O@kernel.org/
>
> Suggested-by: Mike Rapoport <rppt@kernel.org>
> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
> ---
> kernel/trace/trace.c | 23 ++++++++++++++++-------
> kernel/trace/trace.h | 1 +
> 2 files changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
> index de9c237e5826..2f9c91f26d5b 100644
> --- a/kernel/trace/trace.c
> +++ b/kernel/trace/trace.c
> @@ -8505,6 +8505,10 @@ static int tracing_buffers_mmap(struct file *filp, struct vm_area_struct *vma)
> struct trace_iterator *iter = &info->iter;
> int ret = 0;
>
> + /* A memmap'ed buffer is not supported for user space mmap */
> + if (iter->tr->flags & TRACE_ARRAY_FL_MEMMAP)
> + return -ENODEV;
> +
> /* Currently the boot mapped buffer is not supported for mmap */
> if (iter->tr->flags & TRACE_ARRAY_FL_BOOT)
> return -ENODEV;
> @@ -9614,9 +9618,6 @@ static void free_trace_buffers(struct trace_array *tr)
> #ifdef CONFIG_TRACER_MAX_TRACE
> free_trace_buffer(&tr->max_buffer);
> #endif
> -
> - if (tr->range_addr_start)
> - vunmap((void *)tr->range_addr_start);
> }
>
> static void init_trace_flags_index(struct trace_array *tr)
> @@ -10710,6 +10711,7 @@ static inline void do_allocate_snapshot(const char *name) { }
> __init static void enable_instances(void)
> {
> struct trace_array *tr;
> + bool memmap_area = false;
> char *curr_str;
> char *name;
> char *str;
> @@ -10778,6 +10780,7 @@ __init static void enable_instances(void)
> name);
> continue;
> }
> + memmap_area = true;
> } else if (tok) {
> if (!reserve_mem_find_by_name(tok, &start, &size)) {
> start = 0;
> @@ -10800,7 +10803,10 @@ __init static void enable_instances(void)
> continue;
> }
>
> - addr = map_pages(start, size);
> + if (memmap_area)
> + addr = map_pages(start, size);
> + else
> + addr = (unsigned long)phys_to_virt(start);
> if (addr) {
> pr_info("Tracing: mapped boot instance %s at physical memory %pa of size 0x%lx\n",
> name, &start, (unsigned long)size);
> @@ -10827,10 +10833,13 @@ __init static void enable_instances(void)
> update_printk_trace(tr);
>
> /*
> - * If start is set, then this is a mapped buffer, and
> - * cannot be deleted by user space, so keep the reference
> - * to it.
> + * memmap'd buffers can not be freed.
> */
> + if (memmap_area) {
> + tr->flags |= TRACE_ARRAY_FL_MEMMAP;
> + tr->ref++;
> + }
> +
> if (start) {
> tr->flags |= TRACE_ARRAY_FL_BOOT | TRACE_ARRAY_FL_LAST_BOOT;
> tr->range_name = no_free_ptr(rname);
> diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
> index c20f6bcc200a..f9513dc14c37 100644
> --- a/kernel/trace/trace.h
> +++ b/kernel/trace/trace.h
> @@ -447,6 +447,7 @@ enum {
> TRACE_ARRAY_FL_BOOT = BIT(1),
> TRACE_ARRAY_FL_LAST_BOOT = BIT(2),
> TRACE_ARRAY_FL_MOD_INIT = BIT(3),
> + TRACE_ARRAY_FL_MEMMAP = BIT(4),
> };
>
> #ifdef CONFIG_MODULES
> --
> 2.47.2
>
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2025-04-02 9:24 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-01 22:58 [PATCH v5 0/4] tracing: Clean up persistent ring buffer code Steven Rostedt
2025-04-01 22:58 ` [PATCH v5 1/4] tracing: Enforce the persistent ring buffer to be page aligned Steven Rostedt
2025-04-02 9:21 ` Mike Rapoport
2025-04-02 14:26 ` Steven Rostedt
2025-04-02 15:01 ` Mathieu Desnoyers
2025-04-02 15:03 ` Mathieu Desnoyers
2025-04-01 22:58 ` [PATCH v5 2/4] tracing: Have reserve_mem use phys_to_virt() and separate from memmap buffer Steven Rostedt
2025-04-02 9:24 ` Mike Rapoport [this message]
2025-04-02 14:28 ` Steven Rostedt
2025-04-01 22:58 ` [PATCH v5 3/4] tracing: Use vmap_page_range() to map memmap ring buffer Steven Rostedt
2025-04-02 16:42 ` Linus Torvalds
2025-04-02 16:55 ` Steven Rostedt
2025-04-02 17:03 ` Steven Rostedt
2025-04-02 17:14 ` Steven Rostedt
2025-04-02 17:20 ` Linus Torvalds
2025-04-02 17:40 ` Steven Rostedt
2025-04-02 17:46 ` Linus Torvalds
2025-04-01 22:58 ` [PATCH v5 4/4] ring-buffer: Use flush_kernel_vmap_range() over flush_dcache_folio() Steven Rostedt
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=Z-0CPFGDqcUt-fMp@kernel.org \
--to=rppt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=jannh@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=rostedt@goodmis.org \
--cc=torvalds@linux-foundation.org \
--cc=vbabka@suse.cz \
--cc=vdonnefort@google.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.