diff mbox

net-next/unix: BUG: using smp_processor_id() in preemptible

Message ID 20081123.173426.255648175.davem@davemloft.net
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

David Miller Nov. 24, 2008, 1:34 a.m. UTC
From: David Miller <davem@davemloft.net>
Date: Sun, 23 Nov 2008 17:20:14 -0800 (PST)

> From: Eric Dumazet <dada1@cosmosbay.com>
> Date: Sun, 23 Nov 2008 04:32:30 +0100
> 
> > [PATCH] net: make sock_prot_inuse_add() preempt safe
 ...
> Eric, you added this bug by starting to use this interface in
> situations where BH's were not disabled.
> 
> Ever existing use adhered to that rule.
> 
> If you therefore want to call this interface in new locations,
> you have to make sure those locations follow the rule too.

Here is what I commited to fix this bug.

net: Make sure BHs are disabled in sock_prot_inuse_add()

The rule of calling sock_prot_inuse_add() is that BHs must
be disabled.  Some new calls were added where this was not
true and this tiggers warnings as reported by Ilpo.

Fix this by adding explicit BH disabling around those call sites.

Signed-off-by: David S. Miller <davem@davemloft.net>
---
 net/netlink/af_netlink.c |    3 +++
 net/sctp/socket.c        |    4 ++++
 net/unix/af_unix.c       |    2 ++
 3 files changed, 9 insertions(+), 0 deletions(-)

Comments

Eric Dumazet Nov. 24, 2008, 5:51 a.m. UTC | #1
David Miller a écrit :
> From: David Miller <davem@davemloft.net>
> Date: Sun, 23 Nov 2008 17:20:14 -0800 (PST)
> 
>> From: Eric Dumazet <dada1@cosmosbay.com>
>> Date: Sun, 23 Nov 2008 04:32:30 +0100
>>
>>> [PATCH] net: make sock_prot_inuse_add() preempt safe
>  ...
>> Eric, you added this bug by starting to use this interface in
>> situations where BH's were not disabled.
>>
>> Ever existing use adhered to that rule.
>>
>> If you therefore want to call this interface in new locations,
>> you have to make sure those locations follow the rule too.
> 
> Here is what I commited to fix this bug.
> 
> net: Make sure BHs are disabled in sock_prot_inuse_add()
> 
> The rule of calling sock_prot_inuse_add() is that BHs must
> be disabled.  Some new calls were added where this was not
> true and this tiggers warnings as reported by Ilpo.
> 
> Fix this by adding explicit BH disabling around those call sites.
> 
> Signed-off-by: David S. Miller <davem@davemloft.net>
> ---
>  net/netlink/af_netlink.c |    3 +++
>  net/sctp/socket.c        |    4 ++++
>  net/unix/af_unix.c       |    2 ++
>  3 files changed, 9 insertions(+), 0 deletions(-)

Hello David

Thanks for working on this during my sleep ;)


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index a2071dc..c7d7657 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -452,7 +452,10 @@  static int netlink_create(struct net *net, struct socket *sock, int protocol)
 	if (err < 0)
 		goto out_module;
 
+	local_bh_disable();
 	sock_prot_inuse_add(net, &netlink_proto, 1);
+	local_bh_enable();
+
 	nlk = nlk_sk(sock->sk);
 	nlk->module = module;
 out:
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 0c70eff..f03af84 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -3614,7 +3614,11 @@  SCTP_STATIC int sctp_init_sock(struct sock *sk)
 
 	SCTP_DBG_OBJCNT_INC(sock);
 	atomic_inc(&sctp_sockets_allocated);
+
+	local_bh_disable();
 	sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
+	local_bh_enable();
+
 	return 0;
 }
 
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index e1ca8f7..a45a9f7 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -361,7 +361,9 @@  static void unix_sock_destructor(struct sock *sk)
 		unix_release_addr(u->addr);
 
 	atomic_dec(&unix_nr_socks);
+	local_bh_disable();
 	sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
+	local_bh_enable();
 #ifdef UNIX_REFCNT_DEBUG
 	printk(KERN_DEBUG "UNIX %p is destroyed, %d are still alive.\n", sk,
 		atomic_read(&unix_nr_socks));