]> git.baikalelectronics.ru Git - kernel.git/commit
locking/osq: Fix ordering of node initialisation in osq_lock
authorWill Deacon <will.deacon@arm.com>
Fri, 11 Dec 2015 17:46:41 +0000 (17:46 +0000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 17 Dec 2015 19:40:29 +0000 (11:40 -0800)
commit7d058b700246aac7a6c1a3e63d9f7e44fb8e9b85
tree6109868576fbdc7bbbe6cddba7ddec62ca920b67
parent9a871eb4397d5b2e56eef1684102ef5b6f7bd0a2
locking/osq: Fix ordering of node initialisation in osq_lock

The Cavium guys reported a soft lockup on their arm64 machine, caused by
commit 53ae01ed25ca ("locking/osq: Relax atomic semantics"):

    mutex_optimistic_spin+0x9c/0x1d0
    __mutex_lock_slowpath+0x44/0x158
    mutex_lock+0x54/0x58
    kernfs_iop_permission+0x38/0x70
    __inode_permission+0x88/0xd8
    inode_permission+0x30/0x6c
    link_path_walk+0x68/0x4d4
    path_openat+0xb4/0x2bc
    do_filp_open+0x74/0xd0
    do_sys_open+0x14c/0x228
    SyS_openat+0x3c/0x48
    el0_svc_naked+0x24/0x28

This is because in osq_lock we initialise the node for the current CPU:

    node->locked = 0;
    node->next = NULL;
    node->cpu = curr;

and then publish the current CPU in the lock tail:

    old = atomic_xchg_acquire(&lock->tail, curr);

Once the update to lock->tail is visible to another CPU, the node is
then live and can be both read and updated by concurrent lockers.

Unfortunately, the ACQUIRE semantics of the xchg operation mean that
there is no guarantee the contents of the node will be visible before
lock tail is updated.  This can lead to lock corruption when, for
example, a concurrent locker races to set the next field.

Fixes: 53ae01ed25ca ("locking/osq: Relax atomic semantics"):
Reported-by: David Daney <ddaney@caviumnetworks.com>
Reported-by: Andrew Pinski <andrew.pinski@caviumnetworks.com>
Tested-by: Andrew Pinski <andrew.pinski@caviumnetworks.com>
Acked-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1449856001-21177-1-git-send-email-will.deacon@arm.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
kernel/locking/osq_lock.c