From: "Steven Rostedt (Google)" <rost...@goodmis.org>

Allow boot instances to use memory reserved by the reserve_mem boot
option.

  reserve_mem=12M:4096:trace  trace_instance=boot_mapped@trace

The above will allocate 12 megs with 4096 alignment and label it "trace".
The second parameter will create a "boot_mapped" instance and use the
memory reserved and labeled as "trace" as the memory for the ring buffer.

That will create an instance called "boot_mapped":

  /sys/kernel/tracing/instances/boot_mapped

Note, because the ring buffer is using a defined memory ranged, it will
act just like a memory mapped ring buffer. It will not have a snapshot
buffer, as it can't swap out the buffer. The snapshot files as well as any
tracers that uses a snapshot will not be present in the boot_mapped
instance.

Also note that reserve_mem is not reliable in acquiring the same physical
memory at each soft reboot. It is possible that KALSR could map the kernel
at the previous boot memory location forcing the reserve_mem to return a
different memory location. In this case, the previous ring buffer will be
lost.

Signed-off-by: Steven Rostedt (Google) <rost...@goodmis.org>
---
 .../admin-guide/kernel-parameters.txt         | 13 +++++++++++++
 kernel/trace/trace.c                          | 19 +++++++++++++------
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index c688bc6e9153..f91a68bc8e77 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -6754,6 +6754,19 @@
                        memory at 0x284500000 that is 12Megs. The per CPU 
buffers of that
                        instance will be split up accordingly.
 
+                       Alternatively, the memory can be reserved by the 
reserve_mem option:
+
+                               reserve_mem=12M:4096:trace 
trace_instance=boot_map@trace
+
+                       This will reserve 12 megabytes at boot up with a 4096 
byte alignment
+                       and place the ring buffer in this memory. Note that due 
to KASLR, the
+                       memory may not be the same location each time, which 
will not preserve
+                       the buffer content.
+
+                       Also note that the layout of the ring buffer data may 
change between
+                       kernel versions where the validator will fail and reset 
the ring buffer
+                       if the layout is not the same as the previous kernel.
+
        trace_options=[option-list]
                        [FTRACE] Enable or disable tracer options at boot.
                        The option-list is a comma delimited list of options
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 8e5a4ca9fd70..c93a8dc69c69 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -10465,22 +10465,20 @@ __init static void enable_instances(void)
        str = boot_instance_info;
 
        while ((curr_str = strsep(&str, "\t"))) {
-               unsigned long start = 0;
-               unsigned long size = 0;
+               phys_addr_t start = 0;
+               phys_addr_t size = 0;
                unsigned long addr = 0;
 
                tok = strsep(&curr_str, ",");
                name = strsep(&tok, "@");
-               if (tok) {
+
+               if (tok && isdigit(*tok)) {
                        start = memparse(tok, &tok);
                        if (!start) {
                                pr_warn("Tracing: Invalid boot instance address 
for %s\n",
                                        name);
                                continue;
                        }
-               }
-
-               if (start) {
                        if (*tok != ':') {
                                pr_warn("Tracing: No size specified for 
instance %s\n", name);
                                continue;
@@ -10492,6 +10490,15 @@ __init static void enable_instances(void)
                                        name);
                                continue;
                        }
+               } else if (tok) {
+                       if (!reserve_mem_find_by_name(tok, &start, &size)) {
+                               start = 0;
+                               pr_warn("Failed to map boot instance %s to 
%s\n", name, tok);
+                               continue;
+                       }
+               }
+
+               if (start) {
                        addr = map_pages(start, size);
                        if (addr) {
                                pr_info("Tracing: mapped boot instance %s at 
physical memory 0x%lx of size 0x%lx\n",
-- 
2.43.0



Reply via email to