From nobody Mon Dec 1 22:04:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E43123E35B for ; Fri, 28 Nov 2025 01:23:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764293003; cv=none; b=tVr6iNpodi6V28PHmYTEnEVN0xfpJFw4qaka0UglwQEt6sf2AJw8tXwAqHIxM8dlCt6jmWRqVkOjLPfTVyui5LGL0DaXtb7wQb8+1UpUI66RzrMU5DyiOjOKav3UINNEkLghKEAE+BAvvIB0u0pgs7uAfTtPvUTZJnorFCkO0A8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764293003; c=relaxed/simple; bh=np0eLDp8SYvSYO771ibfOvtV9+LDDr8rGaeHXffJO9c=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=MFlEktk8g7neoXzgn00geVORd6eLGIyeIJhZpAt2ucgYvc+fcs5a5kDC2CuVJizYOMfAtLEmpcjqHAWVvpSJNKu7FkRxyTRDqpdFE3m1hoPkM4PSGia5NGE9bmyXTh2I2HVPjUd/z7KllzQ54Kxao4RyXbREHn/RSTAi1bSvVTQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WO3rzRrx; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WO3rzRrx" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 108F4C19422; Fri, 28 Nov 2025 01:23:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764293003; bh=np0eLDp8SYvSYO771ibfOvtV9+LDDr8rGaeHXffJO9c=; h=Date:From:To:Cc:Subject:References:From; b=WO3rzRrx6qJFaiRgqTywRDZZQjt4gX611NwdGwYbFx0NQNCQzTWxEWIi7k7xUhktn 9IEACFAQhzG75kDloLucVsLeLD3xmA9nNZxTw2EzfoVdTP4sVqAeAoSJz6vSOIdIxG 1UptElf/yqewC1G3MKpTDc5qe4zEN6pxS0d1W8gPSeTnbXDtOtaI+QQbNQuM2i7538 X6JqEn5Ja977mZDn2ZXCQCMyYi8P8qpw4Z0uxZnGVq1sfJm+apuJ6P3jNAYV4JfKFV 4HJE4/DtmgOSfv06+EYpjFer4q3f7KyZCf/fXKbrLrJj3fA3J0R2ne9yNHtccsDELg W+d7XyM4iRXaQ== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vOnDY-00000006gik-3MMJ; Thu, 27 Nov 2025 20:24:12 -0500 Message-ID: <20251128012412.654828389@kernel.org> User-Agent: quilt/0.68 Date: Thu, 27 Nov 2025 20:23:42 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton Subject: [for-next][PATCH 11/13] tracing: Add boot-time backup of persistent ring buffer References: <20251128012331.307010654@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Masami Hiramatsu (Google)" Currently, the persistent ring buffer instance needs to be read before using it. This means we have to wait for boot up user space and dump the persistent ring buffer. However, in that case we can not start tracing on it from the kernel cmdline. To solve this limitation, this adds an option which allows to create a trace instance as a backup of the persistent ring buffer at boot. If user specifies trace_instance=3D=3D then the instance is made as a copy of the instance. For example, the below kernel cmdline records all syscalls, scheduler and interrupt events on the persistent ring buffer `boot_map` but before starting the tracing, it makes a `backup` instance from the `boot_map`. Thus, the `backup` instance has the previous boot events. 'reserve_mem=3D12M:4M:trace trace_instance=3Dboot_map@trace,syscalls:*,sche= d:*,irq:* trace_instance=3Dbackup=3Dboot_map' As you can see, this just make a copy of entire reserved area and make a backup instance on it. So you can release (or shrink) the backup instance after use it to save the memory usage. /sys/kernel/tracing/instances # free total used free shared buff/cache ava= ilable Mem: 1999284 55704 1930520 10132 13060 1= 914628 Swap: 0 0 0 /sys/kernel/tracing/instances # rmdir backup/ /sys/kernel/tracing/instances # free total used free shared buff/cache ava= ilable Mem: 1999284 40640 1945584 10132 13060 1= 929692 Swap: 0 0 0 Note: since there is no reason to make a copy of empty buffer, this backup only accepts a persistent ring buffer as the original instance. Also, since this backup is based on vmalloc(), it does not support user-space mmap(). Cc: Mathieu Desnoyers Link: https://patch.msgid.link/176377150002.219692.9425536150438129267.stgi= t@devnote2 Signed-off-by: Masami Hiramatsu (Google) Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace.c | 63 +++++++++++++++++++++++++++++++++++++++----- kernel/trace/trace.h | 1 + 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 032bdedca5d9..73f8b79f1b0c 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -9004,8 +9004,8 @@ static int tracing_buffers_mmap(struct file *filp, st= ruct vm_area_struct *vma) struct trace_iterator *iter =3D &info->iter; int ret =3D 0; =20 - /* A memmap'ed buffer is not supported for user space mmap */ - if (iter->tr->flags & TRACE_ARRAY_FL_MEMMAP) + /* A memmap'ed and backup buffers are not supported for user space mmap */ + if (iter->tr->flags & (TRACE_ARRAY_FL_MEMMAP | TRACE_ARRAY_FL_VMALLOC)) return -ENODEV; =20 ret =3D get_snapshot_map(iter->tr); @@ -10520,6 +10520,8 @@ static int __remove_instance(struct trace_array *tr) reserve_mem_release_by_name(tr->range_name); kfree(tr->range_name); } + if (tr->flags & TRACE_ARRAY_FL_VMALLOC) + vfree((void *)tr->range_addr_start); =20 for (i =3D 0; i < tr->nr_topts; i++) { kfree(tr->topts[i].topts); @@ -11325,6 +11327,42 @@ __init static void do_allocate_snapshot(const char= *name) static inline void do_allocate_snapshot(const char *name) { } #endif =20 +__init static int backup_instance_area(const char *backup, + unsigned long *addr, phys_addr_t *size) +{ + struct trace_array *backup_tr; + void *allocated_vaddr =3D NULL; + + backup_tr =3D trace_array_get_by_name(backup, NULL); + if (!backup_tr) { + pr_warn("Tracing: Instance %s is not found.\n", backup); + return -ENOENT; + } + + if (!(backup_tr->flags & TRACE_ARRAY_FL_BOOT)) { + pr_warn("Tracing: Instance %s is not boot mapped.\n", backup); + trace_array_put(backup_tr); + return -EINVAL; + } + + *size =3D backup_tr->range_addr_size; + + allocated_vaddr =3D vzalloc(*size); + if (!allocated_vaddr) { + pr_warn("Tracing: Failed to allocate memory for copying instance %s (siz= e 0x%lx)\n", + backup, (unsigned long)*size); + trace_array_put(backup_tr); + return -ENOMEM; + } + + memcpy(allocated_vaddr, + (void *)backup_tr->range_addr_start, (size_t)*size); + *addr =3D (unsigned long)allocated_vaddr; + + trace_array_put(backup_tr); + return 0; +} + __init static void enable_instances(void) { struct trace_array *tr; @@ -11347,11 +11385,15 @@ __init static void enable_instances(void) char *flag_delim; char *addr_delim; char *rname __free(kfree) =3D NULL; + char *backup; =20 tok =3D strsep(&curr_str, ","); =20 - flag_delim =3D strchr(tok, '^'); - addr_delim =3D strchr(tok, '@'); + name =3D strsep(&tok, "=3D"); + backup =3D tok; + + flag_delim =3D strchr(name, '^'); + addr_delim =3D strchr(name, '@'); =20 if (addr_delim) *addr_delim++ =3D '\0'; @@ -11359,7 +11401,10 @@ __init static void enable_instances(void) if (flag_delim) *flag_delim++ =3D '\0'; =20 - name =3D tok; + if (backup) { + if (backup_instance_area(backup, &addr, &size) < 0) + continue; + } =20 if (flag_delim) { char *flag; @@ -11455,7 +11500,13 @@ __init static void enable_instances(void) tr->ref++; } =20 - if (start) { + /* + * Backup buffers can be freed but need vfree(). + */ + if (backup) + tr->flags |=3D TRACE_ARRAY_FL_VMALLOC; + + if (start || backup) { tr->flags |=3D TRACE_ARRAY_FL_BOOT | TRACE_ARRAY_FL_LAST_BOOT; tr->range_name =3D no_free_ptr(rname); } diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index a3aa225ed50a..666f9a2c189d 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -454,6 +454,7 @@ enum { TRACE_ARRAY_FL_LAST_BOOT =3D BIT(2), TRACE_ARRAY_FL_MOD_INIT =3D BIT(3), TRACE_ARRAY_FL_MEMMAP =3D BIT(4), + TRACE_ARRAY_FL_VMALLOC =3D BIT(5), }; =20 #ifdef CONFIG_MODULES --=20 2.51.0