ixgbe: Add function for setting XPS queue mapping
authorAlexander Duyck <alexander.h.duyck@intel.com>
Sat, 12 Jan 2013 06:33:31 +0000 (06:33 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 16 Feb 2013 05:52:03 +0000 (21:52 -0800)
This change adds support for ixgbe to configure the XPS queue mapping on
load.  The result of this change is that on open we will now be resetting
the number of Tx queues, and then setting the default configuration for XPS
based on if ATR is enabled or disabled.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Reviewed-by: John Fastabend <john.r.fastabend@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index 4a2831c45231daeb39445433cb7e911437c470cd..5213563e4cf8831af0d071f899fb3f0e7be363d1 100644 (file)
@@ -201,6 +201,7 @@ struct ixgbe_rx_queue_stats {
 
 enum ixgbe_ring_state_t {
        __IXGBE_TX_FDIR_INIT_DONE,
+       __IXGBE_TX_XPS_INIT_DONE,
        __IXGBE_TX_DETECT_HANG,
        __IXGBE_HANG_CHECK_ARMED,
        __IXGBE_RX_RSC_ENABLED,
index 9fafa38009f90a717653c0d3d7dce8c7795efbc3..ef5f7a678ce14214eff82689efd4d999fc7d926b 100644 (file)
@@ -771,19 +771,23 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter,
 {
        struct ixgbe_q_vector *q_vector;
        struct ixgbe_ring *ring;
-       int node = -1;
+       int node = NUMA_NO_NODE;
        int cpu = -1;
        int ring_count, size;
+       u8 tcs = netdev_get_num_tc(adapter->netdev);
 
        ring_count = txr_count + rxr_count;
        size = sizeof(struct ixgbe_q_vector) +
               (sizeof(struct ixgbe_ring) * ring_count);
 
        /* customize cpu for Flow Director mapping */
-       if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) {
-               if (cpu_online(v_idx)) {
-                       cpu = v_idx;
-                       node = cpu_to_node(cpu);
+       if ((tcs <= 1) && !(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) {
+               u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
+               if (rss_i > 1 && adapter->atr_sample_rate) {
+                       if (cpu_online(v_idx)) {
+                               cpu = v_idx;
+                               node = cpu_to_node(cpu);
+                       }
                }
        }
 
index 5fd16670482e90dbf336c234c2b2160b4f24775f..16c9858f7dcf7185cb6aa50365c4b659ec570391 100644 (file)
@@ -2813,6 +2813,16 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,
                ring->atr_sample_rate = 0;
        }
 
+       /* initialize XPS */
+       if (!test_and_set_bit(__IXGBE_TX_XPS_INIT_DONE, &ring->state)) {
+               struct ixgbe_q_vector *q_vector = ring->q_vector;
+
+               if (q_vector)
+                       netif_set_xps_queue(adapter->netdev,
+                                           &q_vector->affinity_mask,
+                                           ring->queue_index);
+       }
+
        clear_bit(__IXGBE_HANG_CHECK_ARMED, &ring->state);
 
        /* enable queue */