|
@@ -2382,8 +2382,11 @@ EXPORT_SYMBOL(netdev_set_num_tc);
|
|
|
*/
|
|
|
int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
|
|
|
{
|
|
|
+ bool disabling;
|
|
|
int rc;
|
|
|
|
|
|
+ disabling = txq < dev->real_num_tx_queues;
|
|
|
+
|
|
|
if (txq < 1 || txq > dev->num_tx_queues)
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -2399,15 +2402,19 @@ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int 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);
|
|
|
#ifdef CONFIG_XPS
|
|
|
netif_reset_xps_queues_gt(dev, txq);
|
|
|
#endif
|
|
|
}
|
|
|
+ } else {
|
|
|
+ dev->real_num_tx_queues = txq;
|
|
|
}
|
|
|
|
|
|
- dev->real_num_tx_queues = txq;
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(netif_set_real_num_tx_queues);
|