diff options
| author | Takashi Iwai <[email protected]> | 2017-11-01 16:43:20 +0000 |
|---|---|---|
| committer | Takashi Iwai <[email protected]> | 2017-11-01 16:43:20 +0000 |
| commit | a53a0ab8ff725672fcb47bb9a5ef75fce45679d0 (patch) | |
| tree | 75cdea78f27fdd569d72cea0b7837bbcc8d871f7 /net/core/sock_reuseport.c | |
| parent | ALSA: seq: Fix nested rwsem annotation for lockdep splat (diff) | |
| parent | Merge remote-tracking branches 'asoc/fix/topology', 'asoc/fix/adau17x1', 'aso... (diff) | |
| download | kernel-a53a0ab8ff725672fcb47bb9a5ef75fce45679d0.tar.gz kernel-a53a0ab8ff725672fcb47bb9a5ef75fce45679d0.zip | |
Merge tag 'asoc-fix-v4.14-rc7' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Fixes for v4.14
A bunch of fixes here, mostly device specific ones (the biggest one
being the revert of the hotword support for rt5514), with a couple of
core fixes for potential issues with corrupted or otherwise invalid
topology files.
Diffstat (limited to 'net/core/sock_reuseport.c')
| -rw-r--r-- | net/core/sock_reuseport.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/core/sock_reuseport.c b/net/core/sock_reuseport.c index eed1ebf7f29d..b1e0dbea1e8c 100644 --- a/net/core/sock_reuseport.c +++ b/net/core/sock_reuseport.c @@ -36,9 +36,14 @@ int reuseport_alloc(struct sock *sk) * soft irq of receive path or setsockopt from process context */ spin_lock_bh(&reuseport_lock); - WARN_ONCE(rcu_dereference_protected(sk->sk_reuseport_cb, - lockdep_is_held(&reuseport_lock)), - "multiple allocations for the same socket"); + + /* Allocation attempts can occur concurrently via the setsockopt path + * and the bind/hash path. Nothing to do when we lose the race. + */ + if (rcu_dereference_protected(sk->sk_reuseport_cb, + lockdep_is_held(&reuseport_lock))) + goto out; + reuse = __reuseport_alloc(INIT_SOCKS); if (!reuse) { spin_unlock_bh(&reuseport_lock); @@ -49,6 +54,7 @@ int reuseport_alloc(struct sock *sk) reuse->num_socks = 1; rcu_assign_pointer(sk->sk_reuseport_cb, reuse); +out: spin_unlock_bh(&reuseport_lock); return 0; |
