This is a usage example of spin_lock_bh_mask(). NET_RX, TIMER and
TASKLET are the three softirqs that have been reported by lockdep to
be used for this socket lock, at least on my own usecases.

Reviewed-by: David S. Miller <[email protected]>
Signed-off-by: Frederic Weisbecker <[email protected]>
Cc: Mauro Carvalho Chehab <[email protected]>
Cc: Joel Fernandes <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Pavan Kondeti <[email protected]>
Cc: Paul E . McKenney <[email protected]>
Cc: David S . Miller <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Sebastian Andrzej Siewior <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
---
 net/core/sock.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/net/core/sock.c b/net/core/sock.c
index 6aa2e7e0b4fb..d6c7dca82ad9 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -2795,7 +2795,11 @@ EXPORT_SYMBOL(lock_sock_nested);
 
 void release_sock(struct sock *sk)
 {
-       spin_lock_bh(&sk->sk_lock.slock);
+       unsigned int bh;
+
+       bh = spin_lock_bh_mask(&sk->sk_lock.slock,
+                              BIT(NET_RX_SOFTIRQ) | BIT(TIMER_SOFTIRQ) |
+                              BIT(HRTIMER_SOFTIRQ) | BIT(TASKLET_SOFTIRQ));
        if (sk->sk_backlog.tail)
                __release_sock(sk);
 
@@ -2808,7 +2812,7 @@ void release_sock(struct sock *sk)
        sock_release_ownership(sk);
        if (waitqueue_active(&sk->sk_lock.wq))
                wake_up(&sk->sk_lock.wq);
-       spin_unlock_bh(&sk->sk_lock.slock);
+       spin_unlock_bh_mask(&sk->sk_lock.slock, bh);
 }
 EXPORT_SYMBOL(release_sock);
 
-- 
2.21.0

Reply via email to