[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1476946352-15770-1-git-send-email-xiyou.wangcong@gmail.com>
Date: Wed, 19 Oct 2016 23:52:32 -0700
From: Cong Wang <xiyou.wangcong@...il.com>
To: netdev@...r.kernel.org
Cc: sds@...ho.nsa.gov, e@...draz.com, paul@...l-moore.com,
Cong Wang <xiyou.wangcong@...il.com>
Subject: [Patch net] net: saving irq context for peernet2id()
A kernel warning inside __local_bh_enable_ip() was reported by people
running SELinux, this is caused due to some SELinux functions
(indirectly) call peernet2id() with IRQ disabled in process context,
when we re-enable BH with IRQ disabled kernel complains. Shut up this
warning by saving IRQ context in peernet2id(), BH is still implicitly
disabled.
Fixes: bc51dddf98c9 ("netns: avoid disabling irq for netns id")
Reported-by: Stephen Smalley <sds@...ho.nsa.gov>
Reported-by: Elad Raz <e@...draz.com>
Tested-by: Paul Moore <paul@...l-moore.com>
Signed-off-by: Cong Wang <xiyou.wangcong@...il.com>
---
net/core/net_namespace.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 989434f..17b52a2 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -230,11 +230,16 @@ int peernet2id_alloc(struct net *net, struct net *peer)
/* This function returns, if assigned, the id of a peer netns. */
int peernet2id(struct net *net, struct net *peer)
{
+ unsigned long flags;
int id;
- spin_lock_bh(&net->nsid_lock);
+ /* This is ugly, technically we only need to disable BH, however some
+ * callers (indirectly) call this with IRQ disabled, which implies
+ * that we should save the IRQ context here.
+ */
+ spin_lock_irqsave(&net->nsid_lock, flags);
id = __peernet2id(net, peer);
- spin_unlock_bh(&net->nsid_lock);
+ spin_unlock_irqrestore(&net->nsid_lock, flags);
return id;
}
EXPORT_SYMBOL(peernet2id);
--
2.1.0
Powered by blists - more mailing lists