CC Rashmica Gupta <rashm...@gmail.com>

On Wed, 2020-11-11 at 16:55 +1100, Jordan Niethe wrote:
> The hardware trace macros which use the memory provided by memtrace are
> able to use trace sizes as small as 16MB. Only memblock aligned values
> can be removed from each NUMA node by writing that value to
> memtrace/enable in debugfs.  This means setting up, say, a 16MB trace is
> not possible.  To allow such a trace size, instead align whatever value
> is written to memtrace/enable to the memblock size for the purpose of
> removing it from each NUMA node but report the written value from
> memtrace/enable and memtrace/x/size in debugfs.
> 
> Signed-off-by: Jordan Niethe <jniet...@gmail.com>
> ---
>  arch/powerpc/platforms/powernv/memtrace.c | 20 ++++++--------------
>  1 file changed, 6 insertions(+), 14 deletions(-)
> 
> diff --git a/arch/powerpc/platforms/powernv/memtrace.c
> b/arch/powerpc/platforms/powernv/memtrace.c
> index 6828108486f8..1188bc8fd090 100644
> --- a/arch/powerpc/platforms/powernv/memtrace.c
> +++ b/arch/powerpc/platforms/powernv/memtrace.c
> @@ -191,7 +191,7 @@ static int memtrace_init_debugfs(void)
>               ent->dir = dir;
>               debugfs_create_file("trace", 0400, dir, ent, &memtrace_fops);
>               debugfs_create_x64("start", 0400, dir, &ent->start);
> -             debugfs_create_x64("size", 0400, dir, &ent->size);
> +             debugfs_create_x64("size", 0400, dir, &memtrace_size);
>       }
>  
>       return ret;
> @@ -259,33 +259,25 @@ static int memtrace_enable_set(void *data, u64 val)
>  {
>       u64 bytes;
>  
> -     /*
> -      * Don't attempt to do anything if size isn't aligned to a memory
> -      * block or equal to zero.
> -      */
> -     bytes = memory_block_size_bytes();
> -     if (val & (bytes - 1)) {
> -             pr_err("Value must be aligned with 0x%llx\n", bytes);
> -             return -EINVAL;
> -     }
> -
>       /* Re-add/online previously removed/offlined memory */
>       if (memtrace_size) {
>               if (memtrace_online())
>                       return -EAGAIN;
>       }
>  
> +     memtrace_size = val;
> +
>       if (!val)
>               return 0;
>  
> -     /* Offline and remove memory */
> -     if (memtrace_init_regions_runtime(val))
> +     /* Offline and remove memory aligned to memory blocks */
> +     bytes = memory_block_size_bytes();
> +     if (memtrace_init_regions_runtime(ALIGN(val, bytes)))
>               return -EINVAL;
>  
>       if (memtrace_init_debugfs())
>               return -EINVAL;
>  
> -     memtrace_size = val;
>  
>       return 0;
>  }

Reply via email to