On 03/14/2017 10:24 PM, Dmitry Vyukov wrote:

> diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h
> index 14635c5ea025..95dd167eb3af 100644
> --- a/arch/x86/include/asm/atomic.h
> +++ b/arch/x86/include/asm/atomic.h
> @@ -16,36 +16,46 @@
>  #define ATOMIC_INIT(i)       { (i) }
>  
>  /**
> - * atomic_read - read atomic variable
> + * arch_atomic_read - read atomic variable
>   * @v: pointer of type atomic_t
>   *
>   * Atomically reads the value of @v.
>   */
> -static __always_inline int atomic_read(const atomic_t *v)
> +static __always_inline int arch_atomic_read(const atomic_t *v)
>  {
> -     return READ_ONCE((v)->counter);
> +     /*
> +      * We use READ_ONCE_NOCHECK() because atomic_read() contains KASAN
> +      * instrumentation. Double instrumentation is unnecessary.
> +      */
> +     return READ_ONCE_NOCHECK((v)->counter);

This is kinda questionable "optimization". READ_ONCE_NOCHECK() is actually
function call to  __read_once_size_nocheck().
So this _NOCHECK adds some bloat to the kernel.
E.g. on my .config remove of _NOCHECK() saves ~400K of .text:

size vmlinux_read
   text    data     bss     dec     hex filename
40548235        16418838        23289856        80256929        4c89fa1 
vmlinux_read
size vmlinux_read_nocheck
   text    data     bss     dec     hex filename
40938418        16451958        23289856        80680232        4cf1528 
vmlinux_read_nocheck

Reply via email to