I got plenty of these from sock_prot_inuse_add: BUG: using smp_processor_id() in preemptible [00000000] code: rcS/1146 caller is sock_prot_inuse_add+0x24/0x42 Pid: 1146, comm: rcS Not tainted 2.6.28-rc6-01121-g89a2f15 #76 Call Trace: [<ffffffff80365767>] debug_smp_processor_id+0xd3/0xe8 [<ffffffff80485a0f>] sock_prot_inuse_add+0x24/0x42 [<ffffffff80514cdd>] unix_create1+0x161/0x176 [<ffffffff80514d52>] unix_create+0x60/0x6b [<ffffffff80483f66>] __sock_create+0x144/0x1bd [<ffffffff80483edb>] ? __sock_create+0xb9/0x1bd [<ffffffff8048402d>] sock_create+0x2d/0x2f [<ffffffff80484274>] sys_socket+0x29/0x5b [<ffffffff8020c10a>] system_call_fastpath+0x16/0x1b -- i. --
Thanks Ilpo for this report I guess the following is necessary. Once Christopher and Rusty work on percpu variables is finished, the preempt_enable()/disable() wont be necessary anymore, so its a temporary workaround anyway. [PATCH] net: make sock_prot_inuse_add() preempt safe Ilpo J=E4rvinen reported that commit a8076d8db98de6da61394b2e942320e46126= 43ac (net: af_unix should update its inuse counter) was triggering a warning in smp_processor_id(), being called in a preemptible code. Fix is to make sock_prot_inuse_add() safe in this regard. This fix can be reverted when new percpu infrastructure is ready, allowing a cpu to safely do a increment/decrement on a percpu var. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
On Sun, 23 Nov 2008, Eric Dumazet wrote: > Ilpo J
From: Eric Dumazet <dada1@cosmosbay.com> 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. Making it expensive for all the existing cases which were already safe, is not the way to fix this. And saying some future not-merged change justifies this added cost is besides the point. What is valid is getting rid of the BH disables you need to add to net/unix/af_unix.c et al.'s call sites, once those percpu patches are added. Not the other way around. --
From: David Miller <davem@davemloft.net> 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(-) 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)); -- 1.5.6.5 --
Hello David Thanks for working on this during my sleep ;) --
I believe some bits are missing Ilpo report was about unix_create1() being preemptable for example Thanks [PATCH] 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, or moving sock_prot_inuse_add() call inside an existing BH disabled section. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> --- net/ipv4/inet_hashtables.c | 2 +- net/packet/af_packet.c | 4 ++-- net/unix/af_unix.c | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-)
From: Eric Dumazet <dada1@cosmosbay.com> Thanks for catching that oversight, applied. --
On Mon, 24 Nov 2008, Eric Dumazet wrote: > David Miller a
