git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
net: fix race on decreasing number of TX queues
[pandora-kernel.git]
/
net
/
core
/
dev.c
diff --git
a/net/core/dev.c
b/net/core/dev.c
index
bb7a0cc
..
56a6ad8
100644
(file)
--- a/
net/core/dev.c
+++ b/
net/core/dev.c
@@
-1750,8
+1750,11
@@
static void netif_setup_tc(struct net_device *dev, unsigned int txq)
*/
int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
{
*/
int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
{
+ bool disabling;
int rc;
int rc;
+ disabling = txq < dev->real_num_tx_queues;
+
if (txq < 1 || txq > dev->num_tx_queues)
return -EINVAL;
if (txq < 1 || txq > dev->num_tx_queues)
return -EINVAL;
@@
-1767,11
+1770,16
@@
int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
if (dev->num_tc)
netif_setup_tc(dev, txq);
if (dev->num_tc)
netif_setup_tc(dev, txq);
- if (txq < dev->real_num_tx_queues)
+ dev->real_num_tx_queues = txq;
+
+ if (disabling) {
+ synchronize_net();
qdisc_reset_all_tx_gt(dev, txq);
qdisc_reset_all_tx_gt(dev, txq);
+ }
+ } else {
+ dev->real_num_tx_queues = txq;
}
}
- dev->real_num_tx_queues = txq;
return 0;
}
EXPORT_SYMBOL(netif_set_real_num_tx_queues);
return 0;
}
EXPORT_SYMBOL(netif_set_real_num_tx_queues);