Patch "wext: fix message delay/ordering" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
wext: fix message delay/ordering
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
wext-fix-message-delay-ordering.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
8bf862739a7786ae72409220914df960a0aa80d8Mon Sep 17 00:00:00 2001
From: Johannes Berg <[email protected]>
Date: Wed, 27 Jan 2016 12:37:52 +0100
Subject: wext: fix message delay/ordering
From: Johannes Berg <[email protected]>
commit 8bf862739a7786ae72409220914df960a0aa80d8 upstream.
Beniamino reported that he was getting an RTM_NEWLINK message for a given interface, after the RTM_DELLINK for it. It turns out that the message is a wireless extensions message, which was sent because the interface had been connected and disconnection while it was deleted caused a wext message.
For its netlink messages, wext uses RTM_NEWLINK, but the message is without all the regular rtnetlink attributes, so "ip monitor link" prints just rudimentary information:
5: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default
link/ether 02:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
Deleted 5: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
link/ether 02:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff5: wlan1: <BROADCAST,MULTICAST,UP>
link/ether
(from my hwsim reproduction)
This can cause userspace to get confused since it doesn't expect an RTM_NEWLINK message after RTM_DELLINK.
The reason for this is that wext schedules a worker to send out the messages, and the scheduling delay can cause the messages to get out to userspace in different order.
To fix this, have wext register a netdevice notifier and flush out any pending messages when netdevice state changes. This fixes any ordering whenever the original message wasn't sent by a notifier itself.
--- net/wireless/wext-core.c | 51 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-)
net/wireless/wext-core.c +40 -11
@@ -342,6 +342,39 @@ static const int compat_event_type_size[/* IW event code */ +static void wireless_nlevent_flush (void ) +{ +struct sk_buff *skb; +struct net *net; + +ASSERT_RTNL (); + +for_each_net (net) { +while ((skb =skb_dequeue (&net->wext_nlevents))) +rtnl_notify (skb, net,0 ,RTNLGRP_LINK ,NULL , +GFP_KERNEL ); + } +} + +static int wext_netdev_notifier_call (struct notifier_block *nb, +unsigned long state,void *ptr) +{ +/* +* When a netdev changes state in any way, flush all pending messages +* to avoid them going out in a strange order, e.g. RTM_NEWLINK after +* RTM_DELLINK, or with IFF_UP after without IFF_UP during dev_close() +* or similar - all of which could otherwise happen due to delays from +* schedule_work(). +*/ +wireless_nlevent_flush (); + +return NOTIFY_OK ; +} + +static struct notifier_block wext_netdev_notifier = { + .notifier_call = wext_netdev_notifier_call, +}; +static int __net_init wext_pernet_init (struct net *net) {skb_queue_head_init (&net->wext_nlevents);
@@ -360,7 +393,12 @@ static struct pernet_operations wext_perstatic int __init wireless_nlevent_init (void ) { -return register_pernet_subsys (&wext_pernet_ops); +int err =register_pernet_subsys (&wext_pernet_ops); + +if (err) +return err; + +return register_netdevice_notifier (&wext_netdev_notifier); }subsys_initcall (wireless_nlevent_init);
@@ -368,17 +406,8 @@ subsys_initcall(wireless_nlevent_init);/* 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; -rtnl_lock (); - -for_each_net (net) { -while ((skb =skb_dequeue (&net->wext_nlevents))) -rtnl_notify (skb, net,0 ,RTNLGRP_LINK ,NULL , -GFP_KERNEL ); - } - +wireless_nlevent_flush ();rtnl_unlock (); }
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/mac80211-minstrel_ht-set-default-tx-aggregation-timeout-to-0.patch queue-3.14/wext-fix-message-delay-ordering.patch queue-3.14/mac80211-fix-use-of-uninitialised-values-in-rx-aggregation.patch