Commit ad462769 authored by Jiri Olsa's avatar Jiri Olsa Committed by David S. Miller
Browse files

memory barrier: adding smp_mb__after_lock

Adding smp_mb__after_lock define to be used as a smp_mb call after
a lock.

Making it nop for x86, since {read|write|spin}_lock() on x86 are
full memory barriers.
Signed-off-by: default avatarJiri Olsa <>
Signed-off-by: default avatarEric Dumazet <>
Signed-off-by: default avatarDavid S. Miller <>
parent a57de0b4
......@@ -302,4 +302,8 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw)
#define _raw_read_relax(lock) cpu_relax()
#define _raw_write_relax(lock) cpu_relax()
/* The {read|write|spin}_lock() on x86 are full memory barriers. */
static inline void smp_mb__after_lock(void) { }
#endif /* _ASM_X86_SPINLOCK_H */
......@@ -132,6 +132,11 @@ do { \
#endif /*__raw_spin_is_contended*/
/* The lock does not imply full memory barrier. */
static inline void smp_mb__after_lock(void) { smp_mb(); }
* spin_unlock_wait - wait until the spinlock gets unlocked
* @lock: the spinlock in question.
......@@ -1271,6 +1271,9 @@ static inline int sk_has_allocations(const struct sock *sk)
* in its cache, and so does the tp->rcv_nxt update on CPU2 side. The CPU1
* could then endup calling schedule and sleep forever if there are no more
* data on the socket.
* The sk_has_sleeper is always called right after a call to read_lock, so we
* can use smp_mb__after_lock barrier.
static inline int sk_has_sleeper(struct sock *sk)
......@@ -1280,7 +1283,7 @@ static inline int sk_has_sleeper(struct sock *sk)
* This memory barrier is paired in the sock_poll_wait.
return sk->sk_sleep && waitqueue_active(sk->sk_sleep);
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment