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

