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; > }