[PATCH] powerpc/powernv/memtrace: Fake non-memblock aligned sized traces

Michael Neuling mikey at neuling.org
Thu Nov 12 08:03:22 AEDT 2020


CC Rashmica Gupta <rashmicy at 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 <jniethe5 at 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;
>  }


More information about the Linuxppc-dev mailing list