|
Message-ID: <CAEXv5_jdQM0X1XNtxNVJi4Ftf8w4P4WN6sy_MK64=0Gmo8oWKQ@mail.gmail.com> Date: Mon, 3 Oct 2016 18:49:01 -0400 From: David Windsor <dwindsor@...il.com> To: Dave Hansen <dave.hansen@...el.com> Cc: kernel-hardening@...ts.openwall.com, Kees Cook <keescook@...omium.org>, Elena Reshetova <elena.reshetova@...el.com>, Hans Liljestrand <ishkamiel@...il.com> Subject: Re: [RFC PATCH 12/13] x86: x86 implementation for HARDENED_ATOMIC On Mon, Oct 3, 2016 at 3:27 PM, Dave Hansen <dave.hansen@...el.com> wrote: > On 10/02/2016 11:41 PM, Elena Reshetova wrote: >> static __always_inline void atomic_add(int i, atomic_t *v) >> { >> - asm volatile(LOCK_PREFIX "addl %1,%0" >> + asm volatile(LOCK_PREFIX "addl %1,%0\n" >> + >> +#ifdef CONFIG_HARDENED_ATOMIC >> + "jno 0f\n" >> + LOCK_PREFIX "subl %1,%0\n" >> + "int $4\n0:\n" >> + _ASM_EXTABLE(0b, 0b) >> +#endif >> + >> + : "+m" (v->counter) >> + : "ir" (i)); >> +} > > Rather than doing all this assembly and exception stuff, could we just do: > > static __always_inline void atomic_add(int i, atomic_t *v) > { > if (atomic_add_unless(v, a, INT_MAX)) > BUG_ON_OVERFLOW_FOO()... > } > > That way, there's also no transient state where somebody can have > observed the overflow before it is fixed up. Granted, this > cmpxchg-based operation _is_ more expensive than the fast-path locked addl. I'm not opposed to this, as this would allow us to eliminate the race on x86 and this doesn't really change how things work on a fundamental level here. The overflow detection mechanism essentially remains the same: __atomic_add_unless still would use exception dispatching as the means of signaling that an overflow has occurred: static __always_inline int __atomic_add_unless(atomic_t *v, int a, int u) { int c, old, new; c = atomic_read(v); for (;;) { if (unlikely(c == (u))) break; asm volatile("addl %2,%0\n" #ifdef CONFIG_HARDENED_ATOMIC "jno 0f\n" "subl %2,%0\n" "int $4\n0:\n" _ASM_EXTABLE(0b, 0b) #endif : "=r" (new) : "0" (c), "ir" (a)); old = atomic_cmpxchg((v), c, new); if (likely(old == c)) break; c = old; } return c; } I'm unsure about the performance implications of cmpxchg, though, so I agree with Kees: we should subject this feature (and this series as a whole) to benchmarking.
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.