On 01/04/2016 02:02 PM, Davidlohr Bueso wrote: > On Sat, 02 Jan 2016, Manfred Spraul wrote: > >> Commit 6d07b68ce16a ("ipc/sem.c: optimize sem_lock()") introduced a >> race: >> >> sem_lock has a fast path that allows parallel simple operations. >> There are two reasons why a simple operation cannot run in parallel: >> - a non-simple operations is ongoing (sma->sem_perm.lock held) >> - a complex operation is sleeping (sma->complex_count != 0) >> >> As both facts are stored independently, a thread can bypass the current >> checks by sleeping in the right positions. See below for more details >> (or kernel bugzilla 105651). >> >> The patch fixes that by creating one variable (complex_mode) >> that tracks both reasons why parallel operations are not possible. >> >> The patch also updates stale documentation regarding the locking. >> >> With regards to stable kernels: >> The patch is required for all kernels that include the commit >> 6d07b68ce16a >> ("ipc/sem.c: optimize sem_lock()") (3.10?) >> >> The alternative is to revert the patch that introduced the race. > > I am just now catching up with this, but a quick thought is that we > probably > want to keep 6d07b68ce16a as waiting on unlocking all sem->lock should be > much worse for performance than keeping track of the complex 'mode'. Keeping track is simple - and the fast path gets simpler compared to ncurrent code. > Specially > if we have a large array. Yes, I would prefer my patch as a backport. But if someone has objections, then a revert would be an alternative. > > Also, any idea what workload exposed this race? Anyway, will take a > closer look > at the patch/issue. It was found by a theoretical review: The sem_lock code was used as an exercise at University Bremen. -- Manfred P.S.: If we replace the "bool" with an "int", we could even introduce a hysteresis, to further reduce the amount of array scans.