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