]> git.baikalelectronics.ru Git - kernel.git/commit
locking/core: Remove break_lock field when CONFIG_GENERIC_LOCKBREAK=y
authorWill Deacon <will.deacon@arm.com>
Tue, 28 Nov 2017 18:42:19 +0000 (18:42 +0000)
committerIngo Molnar <mingo@kernel.org>
Tue, 12 Dec 2017 10:24:01 +0000 (11:24 +0100)
commit764264bb8494d3933be6c4727c698510d4e2a89c
tree37ee5c994ea7efc53d2995e085d27ca120908b27
parent8f07b9838be5e259776bf2ec71d129bc74b675a4
locking/core: Remove break_lock field when CONFIG_GENERIC_LOCKBREAK=y

When CONFIG_GENERIC_LOCKBEAK=y, locking structures grow an extra int ->break_lock
field which is used to implement raw_spin_is_contended() by setting the field
to 1 when waiting on a lock and clearing it to zero when holding a lock.
However, there are a few problems with this approach:

  - There is a write-write race between a CPU successfully taking the lock
    (and subsequently writing break_lock = 0) and a waiter waiting on
    the lock (and subsequently writing break_lock = 1). This could result
    in a contended lock being reported as uncontended and vice-versa.

  - On machines with store buffers, nothing guarantees that the writes
    to break_lock are visible to other CPUs at any particular time.

  - READ_ONCE/WRITE_ONCE are not used, so the field is potentially
    susceptible to harmful compiler optimisations,

Consequently, the usefulness of this field is unclear and we'd be better off
removing it and allowing architectures to implement raw_spin_is_contended() by
providing a definition of arch_spin_is_contended(), as they can when
CONFIG_GENERIC_LOCKBREAK=n.

Signed-off-by: Will Deacon <will.deacon@arm.com>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Sebastian Ott <sebott@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1511894539-7988-3-git-send-email-will.deacon@arm.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
include/linux/rwlock_types.h
include/linux/spinlock.h
include/linux/spinlock_types.h
kernel/locking/spinlock.c