On Tue, Feb 04, 2014 at 12:28:46PM +0000, Will Deacon wrote: > When unlocking a spinlock, we require the following, strictly ordered > sequence of events: > > <barrier> /* dmb */ > <unlock> > <barrier> /* dsb */ > <sev> > > Whilst the code does indeed reflect this in terms of the architecture, > the final <barrier> + <sev> have been contracted into a single inline > asm without a "memory" clobber, therefore the compiler is at liberty to > reorder the unlock to the end of the above sequence. In such a case, > a waiting CPU may be woken up before the lock has been unlocked, leading > to extremely poor performance. > > This patch reworks the dsb_sev() function to make use of the dsb() > macro and ensure ordering against the unlock. > > Cc: <[email protected]> > Reported-by: Mark Rutland <[email protected]> > Signed-off-by: Will Deacon <[email protected]>
FWIW: Reviewed-by: Christoffer Dall <[email protected]> -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
