[Skiboot] [PATCH 05/15] core/trace: Change buffer alignment from 4K to 64K

Oliver oohall at gmail.com
Mon Mar 25 11:54:17 AEDT 2019


On Mon, Mar 25, 2019 at 11:17 AM Jordan Niethe <jniethe5 at gmail.com> wrote:
>
> The trace buffers are currently aligned to 4K. Later when we will mmap
> the buffers, they must be page aligned. Most Power systems have a 64K
> page size. On systems with a 4K page size, 64K aligned will still be
> page aligned so they would not be effected by this change. It is the
> trace_info struct that is aligned, meaning the tracebuf within it will
> not be. Change the physical address exposed to the kernel from the
> tracebuf_struct to the trace_info struct that contains it. This way an
> aligned address exposed however the lock within the trace_info struct is
> now exposed too.
> ---
>  core/trace.c    | 13 ++++++-------
>  include/trace.h |  2 +-
>  skiboot.lds.S   |  6 +++---
>  3 files changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/core/trace.c b/core/trace.c
> index 64a64bd7c35c..8e231b32eaa4 100644
> --- a/core/trace.c
> +++ b/core/trace.c
> @@ -191,7 +191,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;
>  }
> @@ -204,23 +204,22 @@ 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);
>                         init_lock(&t->trace->lock);
>                         t->trace->tb.max_size = cpu_to_be32(MAX_SIZE);
> -                       trace_add_desc(any, sizeof(t->trace->tb) +
> -                                      tracebuf_extra());
> +                       trace_add_desc(any, size);
>                 } else
>                         prerror("TRACE: cpu 0x%x allocation failed\n", t->pir);
>         }
> 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..596ee8d78abf 100644
> --- a/skiboot.lds.S
> +++ b/skiboot.lds.S
> @@ -142,11 +142,11 @@ SECTIONS
>                  * to reside in their own pages for the sake of TCE
>                  * mappings
>                  */
> -               . = ALIGN(0x1000);
> +               . = ALIGN(0x10000);
>                 *(.data.memcons);

Does the alignment of the data.memcons section need to change? Having
the .align before data.boot_trace forces will insert padding as
required and the .align afterwards ensures that no unrelated stuff
from .data is included in the page, but I don't see why this needs to
change.

> -               . = ALIGN(0x1000);
> +               . = ALIGN(0x10000);
>                 *(.data.boot_trace);
> -               . = ALIGN(0x1000);
> +               . = ALIGN(0x10000);
>                 *(.data*)
>                 *(.force.data)
>                 *(.toc1)
> --
> 2.20.1
>
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot


More information about the Skiboot mailing list