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 <da...@davemloft.net>
Signed-off-by: Frederic Weisbecker <frede...@kernel.org>
Cc: Mauro Carvalho Chehab <mchehab+sams...@kernel.org>
Cc: Joel Fernandes <j...@joelfernandes.org>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Pavan Kondeti <pkond...@codeaurora.org>
Cc: Paul E . McKenney <paul...@linux.vnet.ibm.com>
Cc: David S . Miller <da...@davemloft.net>
Cc: Ingo Molnar <mi...@kernel.org>
Cc: Sebastian Andrzej Siewior <bige...@linutronix.de>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Peter Zijlstra <pet...@infradead.org>
---
 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