From b8bf32c427cf8415752395d03cdeb4512926ce4a Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Tue, 8 Aug 2006 23:54:22 -0400 Subject: [PATCH] --- yaml --- r: 35135 b: refs/heads/master c: d15064aa94f44a17bfc052f5b748f5e240735551 h: refs/heads/master i: 35133: 1ff1a07abacb5ef389252cb69943bd55a9d2f0e5 35131: c1910901673866ea64a16f43fe7e65893dea4aa2 35127: cbf85133dbf7033669d5e08899df365d7e46b1b4 35119: d1b733e9e35becc5782f60fa6367eb3c53d45221 35103: e8c716f576c607dcd314650f89d0fcaf23d168a0 35071: fd9a325d85b462bfedca5f701aad49bf6cf480a7 v: v3 --- [refs] | 2 +- trunk/net/core/wireless.c | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 928b5e7a8538..90aab0c10cdc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e27cdba53b8ad5c12c9281b3737e07f2a536c3a2 +refs/heads/master: d15064aa94f44a17bfc052f5b748f5e240735551 diff --git a/trunk/net/core/wireless.c b/trunk/net/core/wireless.c index d2bc72d318f7..de0bde4b51dd 100644 --- a/trunk/net/core/wireless.c +++ b/trunk/net/core/wireless.c @@ -82,6 +82,7 @@ #include /* for __init */ #include /* ARPHRD_ETHER */ #include /* compare_ether_addr */ +#include #include /* Pretty obvious */ #include /* New driver API */ @@ -1842,6 +1843,18 @@ int wireless_rtnetlink_set(struct net_device * dev, */ #ifdef WE_EVENT_RTNETLINK +static struct sk_buff_head wireless_nlevent_queue; + +static void wireless_nlevent_process(unsigned long data) +{ + struct sk_buff *skb; + + while ((skb = skb_dequeue(&wireless_nlevent_queue))) + netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_ATOMIC); +} + +static DECLARE_TASKLET(wireless_nlevent_tasklet, wireless_nlevent_process, 0); + /* ---------------------------------------------------------------- */ /* * Fill a rtnetlink message with our event data. @@ -1904,8 +1917,17 @@ static inline void rtmsg_iwinfo(struct net_device * dev, return; } NETLINK_CB(skb).dst_group = RTNLGRP_LINK; - netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_ATOMIC); + skb_queue_tail(&wireless_nlevent_queue, skb); + tasklet_schedule(&wireless_nlevent_tasklet); +} + +static int __init wireless_nlevent_init(void) +{ + skb_queue_head_init(&wireless_nlevent_queue); + return 0; } + +subsys_initcall(wireless_nlevent_init); #endif /* WE_EVENT_RTNETLINK */ /* ---------------------------------------------------------------- */