[Skiboot] [PATCH v2 07/16] core/trace: Change buffer alignment from 4K to 64K

Jordan Niethe jniethe5 at gmail.com
Tue Apr 2 10:43:18 AEDT 2019


We want to be able to mmap the trace buffers to be used by the
dump_trace tool. This means that the trace bufferes must be page
aligned.  Currently they are aligned to 4K. Most power systems have a
64K page size. On systems with a 4K page size, 64K aligned will still be
page aligned.  Change the allocation of the trace buffers to be 64K
aligned.

The trace_info struct that contains the trace buffer is actually what is
allocated aligned memory. This means the trace buffer itself is not
actually aligned and this is the address that is currently exposed
through sysfs.  To get around this change the address that is exposed to
sysfs to be the trace_info struct. This means the lock in trace_info is
now visible too.

Signed-off-by: Jordan Niethe <jniethe5 at gmail.com>
---
 core/trace.c    | 10 +++++-----
 include/trace.h |  2 +-
 skiboot.lds.S   |  4 ++--
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/core/trace.c b/core/trace.c
index a7b3cd141755..4b7d570409e8 100644
--- a/core/trace.c
+++ b/core/trace.c
@@ -193,7 +193,7 @@ static void trace_add_desc(struct trace_info *t, uint64_t size)
 	}
 	debug_descriptor.num_traces++;
 
-	debug_descriptor.trace_phys[i] = (uint64_t)&t->tb;
+	debug_descriptor.trace_phys[i] = (uint64_t)t;
 	debug_descriptor.trace_tce[i] = 0; /* populated later */
 	debug_descriptor.trace_size[i] = size;
 }
@@ -206,16 +206,16 @@ void init_trace_buffers(void)
 	uint64_t size;
 
 	/* Boot the boot trace in the debug descriptor */
-	trace_add_desc(any, sizeof(boot_tracebuf.buf));
+	trace_add_desc(any, sizeof(boot_tracebuf));
 
 	/* Allocate a trace buffer for each primary cpu. */
 	for_each_cpu(t) {
 		if (t->is_secondary)
 			continue;
 
-		/* Use a 4K alignment for TCE mapping */
-		size = ALIGN_UP(sizeof(*t->trace) + tracebuf_extra(), 0x1000);
-		t->trace = local_alloc(t->chip_id, size, 0x1000);
+		/* Use a 64K alignment for TCE mapping */
+		size = ALIGN_UP(sizeof(*t->trace) + tracebuf_extra(), 0x10000);
+		t->trace = local_alloc(t->chip_id, size, 0x10000);
 		if (t->trace) {
 			any = t->trace;
 			memset(t->trace, 0, size);
diff --git a/include/trace.h b/include/trace.h
index da43572e2d06..2b65e9075591 100644
--- a/include/trace.h
+++ b/include/trace.h
@@ -29,7 +29,7 @@ struct cpu_thread;
 void init_boot_tracebuf(struct cpu_thread *boot_cpu);
 
 struct trace_info {
-	/* Lock for writers. */
+	/* Lock for writers. Exposed to kernel. */
 	struct lock lock;
 	/* Exposed to kernel. */
 	struct tracebuf tb;
diff --git a/skiboot.lds.S b/skiboot.lds.S
index 8d09b40e601c..ec04ca39e26f 100644
--- a/skiboot.lds.S
+++ b/skiboot.lds.S
@@ -144,9 +144,9 @@ SECTIONS
 		 */
 		. = ALIGN(0x1000);
 		*(.data.memcons);
-		. = ALIGN(0x1000);
+		. = ALIGN(0x10000);
 		*(.data.boot_trace);
-		. = ALIGN(0x1000);
+		. = ALIGN(0x10000);
 		*(.data*)
 		*(.force.data)
 		*(.toc1)
-- 
2.20.1



More information about the Skiboot mailing list