ixgbevf: Set the netdev number of Tx queues
authorGreg Rose <gregory.v.rose@intel.com>
Wed, 3 Oct 2012 00:57:23 +0000 (00:57 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 9 Oct 2012 09:08:39 +0000 (02:08 -0700)
The driver was not setting the number of real Tx queues in the net_device
structure.  This caused some serious issues such as Tx hangs and extremely
poor performance with some usages of the driver.

The issue is best observed by running:

iperf -c <host> -P <n>

Where n is greater than one.  The greater the value of n the more likely
the problem is to show up.

Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

index 0ee9bd4819f444b392d087403da514db125af0bd..de1ad506665d6a33c223c8a73fbada54f39df832 100644 (file)
@@ -1747,6 +1747,7 @@ err_tx_ring_allocation:
  **/
 static int ixgbevf_set_interrupt_capability(struct ixgbevf_adapter *adapter)
 {
+       struct net_device *netdev = adapter->netdev;
        int err = 0;
        int vector, v_budget;
 
@@ -1775,6 +1776,12 @@ static int ixgbevf_set_interrupt_capability(struct ixgbevf_adapter *adapter)
 
        ixgbevf_acquire_msix_vectors(adapter, v_budget);
 
+       err = netif_set_real_num_tx_queues(netdev, adapter->num_tx_queues);
+       if (err)
+               goto out;
+
+       err = netif_set_real_num_rx_queues(netdev, adapter->num_rx_queues);
+
 out:
        return err;
 }