Re: PROBLEM: Concurrency issue in sem_lock

From: Manfred Spraul
Date: Sat Oct 10 2015 - 02:50:31 EST


This is a multi-part message in MIME format. Hi,

On 10/09/2015 10:24 AM, Felix HÃbner wrote:
Hi all,

I have just reported a concurrency issue in the implementation of
sem_lock, see https://bugzilla.kernel.org/show_bug.cgi?id=105651

[...]
# P0 does spin_lock(&sem->lock); in line 336.

spin_lock(&sem->lock);
[...]
# P2 performs rest of semtimedop, increments complex_count and ends up
in line 1961 and starts to sleep.

return -1;
}
That is the problem: semtimedop() increments complex_count - thus sem_wait_array() returns without a spin_unlock_wait() loop - but P0 already owns spin_lock(&sem->lock).

How do we want to fix it?
- revert my patch (simplify code, but slower for one corner case)
- add the missing sem_wait_array (more complex, but also better for complex semops).

what do you think?

(patch untested)

--
Manfred