All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrea Parri <andrea.parri@amarulasolutions.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: linux-kernel@vger.kernel.org, will.deacon@arm.com,
	peterz@infradead.org, boqun.feng@gmail.com,
	Dmitry Vyukov <dvyukov@google.com>
Subject: Re: [PATCHv2 03/11] atomics: simplify cmpxchg() instrumentation
Date: Mon, 25 Jun 2018 13:38:03 +0200	[thread overview]
Message-ID: <20180625113803.GA13628@andrea> (raw)
In-Reply-To: <20180625105952.3756-4-mark.rutland@arm.com>

On Mon, Jun 25, 2018 at 11:59:44AM +0100, Mark Rutland wrote:
> Currently we define some fairly verbose wrappers for the cmpxchg()
> family so that we can pass a pointer and size into kasan_check_write().
> 
> The wrapper duplicate the size-switching logic necessary in arch code,
> and only work for scalar types. On some architectures, (cmp)xchg are
> used on non-scalar types, and thus the instrumented wrappers need to be
> able to handle this.
> 
> We could take the type-punning logic form {READ,WRITE}_ONCE(), but this
> makes the wrappers even more verbose, and requires several local
> variables in the macros.
> 
> Instead, let's simplify the wrappers into simple macros which:
> 
>  * snapshot the pointer into a single local variable, called __ai_ptr to
>    avoid conflicts with variables in the scope of the caller.
> 
>  * call kasan_check_read() on __ai_ptr.

Maybe I'm misreading the diff: aren't you calling kasan_check_write()?
(not sure if it makes a difference in this case/for KTSan, but CMPXCHG
does not necessarily perform a write...)

  Andrea


> 
>  * invoke the arch_ function, passing the original arguments, bar
>    __ai_ptr being substituted for ptr.
> 
> There should be no functional change as a result of this patch.
> 
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Cc: Boqun Feng <boqun.feng@gmail.com>
> Cc: Dmitry Vyukov <dvyukov@google.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Will Deacon <will.deacon@arm.com>
> ---
>  include/asm-generic/atomic-instrumented.h | 100 +++++-------------------------
>  1 file changed, 15 insertions(+), 85 deletions(-)
> 
> diff --git a/include/asm-generic/atomic-instrumented.h b/include/asm-generic/atomic-instrumented.h
> index 3c64e95d5ed0..c7c3e4cdd942 100644
> --- a/include/asm-generic/atomic-instrumented.h
> +++ b/include/asm-generic/atomic-instrumented.h
> @@ -408,109 +408,39 @@ static __always_inline bool atomic64_add_negative(s64 i, atomic64_t *v)
>  }
>  #endif
>  
> -static __always_inline unsigned long
> -cmpxchg_size(volatile void *ptr, unsigned long old, unsigned long new, int size)
> -{
> -	kasan_check_write(ptr, size);
> -	switch (size) {
> -	case 1:
> -		return arch_cmpxchg((u8 *)ptr, (u8)old, (u8)new);
> -	case 2:
> -		return arch_cmpxchg((u16 *)ptr, (u16)old, (u16)new);
> -	case 4:
> -		return arch_cmpxchg((u32 *)ptr, (u32)old, (u32)new);
> -	case 8:
> -		BUILD_BUG_ON(sizeof(unsigned long) != 8);
> -		return arch_cmpxchg((u64 *)ptr, (u64)old, (u64)new);
> -	}
> -	BUILD_BUG();
> -	return 0;
> -}
> -
>  #define cmpxchg(ptr, old, new)						\
>  ({									\
> -	((__typeof__(*(ptr)))cmpxchg_size((ptr), (unsigned long)(old),	\
> -		(unsigned long)(new), sizeof(*(ptr))));			\
> +	typeof(ptr) __ai_ptr = (ptr);					\
> +	kasan_check_write(__ai_ptr, sizeof(*__ai_ptr));			\
> +	arch_cmpxchg(__ai_ptr, (old), (new));				\
>  })
>  
> -static __always_inline unsigned long
> -sync_cmpxchg_size(volatile void *ptr, unsigned long old, unsigned long new,
> -		  int size)
> -{
> -	kasan_check_write(ptr, size);
> -	switch (size) {
> -	case 1:
> -		return arch_sync_cmpxchg((u8 *)ptr, (u8)old, (u8)new);
> -	case 2:
> -		return arch_sync_cmpxchg((u16 *)ptr, (u16)old, (u16)new);
> -	case 4:
> -		return arch_sync_cmpxchg((u32 *)ptr, (u32)old, (u32)new);
> -	case 8:
> -		BUILD_BUG_ON(sizeof(unsigned long) != 8);
> -		return arch_sync_cmpxchg((u64 *)ptr, (u64)old, (u64)new);
> -	}
> -	BUILD_BUG();
> -	return 0;
> -}
> -
>  #define sync_cmpxchg(ptr, old, new)					\
>  ({									\
> -	((__typeof__(*(ptr)))sync_cmpxchg_size((ptr),			\
> -		(unsigned long)(old), (unsigned long)(new),		\
> -		sizeof(*(ptr))));					\
> +	typeof(ptr) __ai_ptr = (ptr);					\
> +	kasan_check_write(__ai_ptr, sizeof(*__ai_ptr));			\
> +	arch_sync_cmpxchg(__ai_ptr, (old), (new));			\
>  })
>  
> -static __always_inline unsigned long
> -cmpxchg_local_size(volatile void *ptr, unsigned long old, unsigned long new,
> -		   int size)
> -{
> -	kasan_check_write(ptr, size);
> -	switch (size) {
> -	case 1:
> -		return arch_cmpxchg_local((u8 *)ptr, (u8)old, (u8)new);
> -	case 2:
> -		return arch_cmpxchg_local((u16 *)ptr, (u16)old, (u16)new);
> -	case 4:
> -		return arch_cmpxchg_local((u32 *)ptr, (u32)old, (u32)new);
> -	case 8:
> -		BUILD_BUG_ON(sizeof(unsigned long) != 8);
> -		return arch_cmpxchg_local((u64 *)ptr, (u64)old, (u64)new);
> -	}
> -	BUILD_BUG();
> -	return 0;
> -}
> -
>  #define cmpxchg_local(ptr, old, new)					\
>  ({									\
> -	((__typeof__(*(ptr)))cmpxchg_local_size((ptr),			\
> -		(unsigned long)(old), (unsigned long)(new),		\
> -		sizeof(*(ptr))));					\
> +	typeof(ptr) __ai_ptr = (ptr);					\
> +	kasan_check_write(__ai_ptr, sizeof(*__ai_ptr));			\
> +	arch_cmpxchg_local(__ai_ptr, (old), (new));			\
>  })
>  
> -static __always_inline u64
> -cmpxchg64_size(volatile u64 *ptr, u64 old, u64 new)
> -{
> -	kasan_check_write(ptr, sizeof(*ptr));
> -	return arch_cmpxchg64(ptr, old, new);
> -}
> -
>  #define cmpxchg64(ptr, old, new)					\
>  ({									\
> -	((__typeof__(*(ptr)))cmpxchg64_size((ptr), (u64)(old),		\
> -		(u64)(new)));						\
> +	typeof(ptr) __ai_ptr = (ptr);					\
> +	kasan_check_write(__ai_ptr, sizeof(*__ai_ptr));			\
> +	arch_cmpxchg64(__ai_ptr, (old), (new));				\
>  })
>  
> -static __always_inline u64
> -cmpxchg64_local_size(volatile u64 *ptr, u64 old, u64 new)
> -{
> -	kasan_check_write(ptr, sizeof(*ptr));
> -	return arch_cmpxchg64_local(ptr, old, new);
> -}
> -
>  #define cmpxchg64_local(ptr, old, new)					\
>  ({									\
> -	((__typeof__(*(ptr)))cmpxchg64_local_size((ptr), (u64)(old),	\
> -		(u64)(new)));						\
> +	typeof(ptr) __ai_ptr = (ptr);					\
> +	kasan_check_write(__ai_ptr, sizeof(*__ai_ptr));			\
> +	arch_cmpxchg64_local(__ai_ptr, (old), (new));			\
>  })
>  
>  /*
> -- 
> 2.11.0
> 

  reply	other threads:[~2018-06-25 11:38 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-25 10:59 [PATCHv2 00/11] atomics: generate atomic headers / instrument arm64 Mark Rutland
2018-06-25 10:59 ` [PATCHv2 01/11] atomic/tty: Fix up atomic abuse in ldsem Mark Rutland
2018-06-26 18:53   ` Andy Shevchenko
2018-06-26 19:30     ` Peter Zijlstra
2018-06-27 17:33       ` Andy Shevchenko
2018-06-25 10:59 ` [PATCHv2 02/11] atomics/x86: reduce arch_cmpxchg64*() instrumentation Mark Rutland
2018-06-25 10:59 ` [PATCHv2 03/11] atomics: simplify cmpxchg() instrumentation Mark Rutland
2018-06-25 11:38   ` Andrea Parri [this message]
2018-06-25 11:47     ` Dmitry Vyukov
2018-06-25 11:48     ` Mark Rutland
2018-06-25 10:59 ` [PATCHv2 04/11] atomics/treewide: instrument xchg() Mark Rutland
2018-06-25 10:59 ` [PATCHv2 05/11] atomics: instrument cmpxchg_double*() Mark Rutland
2018-06-25 10:59 ` [PATCHv2 06/11] atomics/treewide: rework ordering barriers Mark Rutland
2018-06-25 15:44   ` Mark Rutland
2018-07-04 15:06   ` Will Deacon
2018-07-04 15:56     ` Mark Rutland
2018-07-04 17:50       ` Will Deacon
2018-07-05 10:12         ` Mark Rutland
2018-07-05 16:25           ` Will Deacon
2018-06-25 10:59 ` [PATCHv2 07/11] atomics: add common header generation files Mark Rutland
2018-06-28 10:58   ` Mark Rutland
2018-06-28 11:46     ` Peter Zijlstra
2018-06-25 10:59 ` [PATCHv2 08/11] atomics: switch to generated fallbacks Mark Rutland
2018-07-04 15:28   ` Will Deacon
2018-07-04 16:01     ` Mark Rutland
2018-07-04 17:44       ` Will Deacon
2018-07-05 11:52         ` Mark Rutland
2018-06-25 10:59 ` [PATCHv2 09/11] atomics: switch to generated atomic-long Mark Rutland
2018-06-25 10:59 ` [PATCHv2 10/11] atomics: switch to generated instrumentation Mark Rutland
2018-06-25 10:59 ` [PATCHv2 11/11] arm64: use instrumented atomics Mark Rutland
2018-07-04 15:24   ` Will Deacon
2018-07-04 16:37     ` Mark Rutland
2018-07-04 17:41       ` Will Deacon
2018-07-05  9:58         ` Mark Rutland
2018-06-25 15:22 ` [PATCHv2 00/11] atomics: generate atomic headers / instrument arm64 Peter Zijlstra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180625113803.GA13628@andrea \
    --to=andrea.parri@amarulasolutions.com \
    --cc=boqun.feng@gmail.com \
    --cc=dvyukov@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=peterz@infradead.org \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.