From: Masami Hiramatsu (Google) <[email protected]> Record the boot ID (random UUID for each boot) when tracing on the persistent ring buffer and show it in the last_boot_info file. User can use this boot ID when cross-referencing it with other logs.
For example: # cat /proc/sys/kernel/random/boot_id df152e7a-c0a7-4d32-9f0b-7f5c39fb7b68 (enable tracing on persistent instance and reboot) # cat /sys/kernel/tracing/instances/ptracingtest/last_boot_info # boot_id: df152e7a-c0a7-4d32-9f0b-7f5c39fb7b68 ffffffff81000000 [kernel] Thus, if user saves the other logs with this boot_id, user can easily find the appropriate logs. Signed-off-by: Masami Hiramatsu (Google) <[email protected]> --- kernel/trace/trace.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 6eb4d3097a4d..c56694bb5e0c 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -34,10 +34,12 @@ #include <linux/percpu.h> #include <linux/splice.h> #include <linux/kdebug.h> +#include <linux/random.h> #include <linux/string.h> #include <linux/mount.h> #include <linux/rwsem.h> #include <linux/slab.h> +#include <linux/uuid.h> #include <linux/ctype.h> #include <linux/init.h> #include <linux/panic_notifier.h> @@ -4804,6 +4806,7 @@ struct trace_mod_entry { struct trace_scratch { unsigned int clock_id; unsigned long text_addr; + u8 boot_id[UUID_SIZE]; unsigned long nr_entries; struct trace_mod_entry entries[]; }; @@ -4921,6 +4924,7 @@ static void update_last_data(struct trace_array *tr) /* Reset the module list and reload them */ if (tr->scratch) { struct trace_scratch *tscratch = tr->scratch; + const u8 *boot_id = get_boot_id(); tscratch->clock_id = tr->clock_id; memset(tscratch->entries, 0, @@ -4929,6 +4933,11 @@ static void update_last_data(struct trace_array *tr) guard(mutex)(&scratch_mutex); module_for_each_mod(save_mod, tr); + /* Also, update boot ID if exists */ + if (boot_id) + memcpy(tscratch->boot_id, boot_id, sizeof(tscratch->boot_id)); + else + memset(tscratch->boot_id, 0, sizeof(tscratch->boot_id)); } /* @@ -5822,9 +5831,10 @@ static void show_last_boot_header(struct seq_file *m, struct trace_array *tr) * Otherwise it shows the KASLR address from the previous boot which * should not be the same as the current boot. */ - if (tscratch && (tr->flags & TRACE_ARRAY_FL_LAST_BOOT)) + if (tscratch && (tr->flags & TRACE_ARRAY_FL_LAST_BOOT)) { + seq_printf(m, "# boot_id: %pUb\n", tscratch->boot_id); seq_printf(m, "%lx\t[kernel]\n", tscratch->text_addr); - else + } else seq_puts(m, "# Current\n"); }
