From: Johannes Berg <johannes@sipsolutions.net>
To: netdev@vger.kernel.org
Cc: linux-wireless@vger.kernel.org
Subject: [PATCH 1/3] wireless extensions: make netns aware
Date: Wed, 24 Jun 2009 13:34:48 +0200 [thread overview]
Message-ID: <20090624113731.593760951@sipsolutions.net> (raw)
In-Reply-To: 20090624113447.441667549@sipsolutions.net
This makes wireless extensions netns aware. The
tasklet sending the events is converted to a work
struct so that we can rtnl_lock() in it.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
---
include/net/net_namespace.h | 3 ++
net/wireless/wext.c | 61 ++++++++++++++++++++------------------------
2 files changed, 32 insertions(+), 32 deletions(-)
--- wireless-testing.orig/include/net/net_namespace.h 2009-06-22 14:44:06.000000000 +0200
+++ wireless-testing/include/net/net_namespace.h 2009-06-22 14:46:22.000000000 +0200
@@ -78,6 +78,9 @@ struct net {
#ifdef CONFIG_XFRM
struct netns_xfrm xfrm;
#endif
+#ifdef CONFIG_WIRELESS_EXT
+ struct sk_buff_head wext_nlevents;
+#endif
struct net_generic *gen;
};
--- wireless-testing.orig/net/wireless/wext.c 2009-06-22 14:44:06.000000000 +0200
+++ wireless-testing/net/wireless/wext.c 2009-06-22 14:46:22.000000000 +0200
@@ -1250,48 +1250,48 @@ int compat_wext_handle_ioctl(struct net
}
#endif
-/************************* EVENT PROCESSING *************************/
-/*
- * Process events generated by the wireless layer or the driver.
- * Most often, the event will be propagated through rtnetlink
- */
+static int __net_init wext_pernet_init(struct net *net)
+{
+ skb_queue_head_init(&net->wext_nlevents);
+ return 0;
+}
-/* ---------------------------------------------------------------- */
-/*
- * Locking...
- * ----------
- *
- * Thanks to Herbert Xu <herbert@gondor.apana.org.au> for fixing
- * the locking issue in here and implementing this code !
- *
- * The issue : wireless_send_event() is often called in interrupt context,
- * while the Netlink layer can never be called in interrupt context.
- * The fully formed RtNetlink events are queued, and then a tasklet is run
- * to feed those to Netlink.
- * The skb_queue is interrupt safe, and its lock is not held while calling
- * Netlink, so there is no possibility of dealock.
- * Jean II
- */
+static void __net_exit wext_pernet_exit(struct net *net)
+{
+ skb_queue_purge(&net->wext_nlevents);
+}
-static struct sk_buff_head wireless_nlevent_queue;
+static struct pernet_operations wext_pernet_ops = {
+ .init = wext_pernet_init,
+ .exit = wext_pernet_exit,
+};
static int __init wireless_nlevent_init(void)
{
- skb_queue_head_init(&wireless_nlevent_queue);
+ return register_pernet_subsys(&wext_pernet_ops);
return 0;
}
subsys_initcall(wireless_nlevent_init);
-static void wireless_nlevent_process(unsigned long data)
+/* Process events generated by the wireless layer or the driver. */
+static void wireless_nlevent_process(struct work_struct *work)
{
struct sk_buff *skb;
+ struct net *net;
- while ((skb = skb_dequeue(&wireless_nlevent_queue)))
- rtnl_notify(skb, &init_net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
+ rtnl_lock();
+
+ for_each_net(net) {
+ while ((skb = skb_dequeue(&net->wext_nlevents)))
+ rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL,
+ GFP_KERNEL);
+ }
+
+ rtnl_unlock();
}
-static DECLARE_TASKLET(wireless_nlevent_tasklet, wireless_nlevent_process, 0);
+static DECLARE_WORK(wireless_nlevent_work, wireless_nlevent_process);
/* ---------------------------------------------------------------- */
/*
@@ -1341,9 +1341,6 @@ static void rtmsg_iwinfo(struct net_devi
struct sk_buff *skb;
int err;
- if (!net_eq(dev_net(dev), &init_net))
- return;
-
skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
if (!skb)
return;
@@ -1356,8 +1353,8 @@ static void rtmsg_iwinfo(struct net_devi
}
NETLINK_CB(skb).dst_group = RTNLGRP_LINK;
- skb_queue_tail(&wireless_nlevent_queue, skb);
- tasklet_schedule(&wireless_nlevent_tasklet);
+ skb_queue_tail(&dev_net(dev)->wext_nlevents, skb);
+ schedule_work(&wireless_nlevent_work);
}
/* ---------------------------------------------------------------- */
--
next prev parent reply other threads:[~2009-06-24 11:39 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-24 11:34 [PATCH 0/3] wireless extensions improvements Johannes Berg
2009-06-24 11:34 ` Johannes Berg [this message]
2009-06-24 11:34 ` [PATCH 2/3] wext: optimise, comment and fix event sending Johannes Berg
2009-06-24 11:34 ` [PATCH 3/3] net/compat/wext: send different messages to compat tasks Johannes Berg
2009-07-01 21:26 ` [PATCH 3/3 v3] " Johannes Berg
2009-07-15 16:08 ` David Miller
2009-06-25 23:18 ` [PATCH 0/3] wireless extensions improvements David Miller
2009-06-26 5:46 ` John W. Linville
2009-06-26 20:12 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090624113731.593760951@sipsolutions.net \
--to=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).