Re: [PATCH -v4 2/8] locking/mutex: Rework mutex::owner

From: Will Deacon
Date: Thu Oct 13 2016 - 11:18:59 EST


On Fri, Oct 07, 2016 at 04:52:45PM +0200, Peter Zijlstra wrote:
> The current mutex implementation has an atomic lock word and a
> non-atomic owner field.
>
> This disparity leads to a number of issues with the current mutex code
> as it means that we can have a locked mutex without an explicit owner
> (because the owner field has not been set, or already cleared).
>
> This leads to a number of weird corner cases, esp. between the
> optimistic spinning and debug code. Where the optimistic spinning
> code needs the owner field updated inside the lock region, the debug
> code is more relaxed because the whole lock is serialized by the
> wait_lock.
>
> Also, the spinning code itself has a few corner cases where we need to
> deal with a held lock without an owner field.
>
> Furthermore, it becomes even more of a problem when trying to fix
> starvation cases in the current code. We end up stacking special case
> on special case.
>
> To solve this rework the basic mutex implementation to be a single
> atomic word that contains the owner and uses the low bits for extra
> state.
>
> This matches how PI futexes and rt_mutex already work. By having the
> owner an integral part of the lock state a lot of the problems
> dissapear and we get a better option to deal with starvation cases,
> direct owner handoff.
>
> Changing the basic mutex does however invalidate all the arch specific
> mutex code; this patch leaves that unused in-place, a later patch will
> remove that.
>
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
> ---
> include/linux/mutex-debug.h | 24 --
> include/linux/mutex.h | 46 +++--
> kernel/locking/mutex-debug.c | 13 -
> kernel/locking/mutex-debug.h | 10 -
> kernel/locking/mutex.c | 371 ++++++++++++++++++-------------------------
> kernel/locking/mutex.h | 26 ---
> kernel/sched/core.c | 2
> 7 files changed, 187 insertions(+), 305 deletions(-)

Looks good to me:

Reviewed-by: Will Deacon <will.deacon@xxxxxxx>

Will