Skip to content

Commit

Permalink
fm10k: initialize xps at driver load
Browse files Browse the repository at this point in the history
Similar to ixgbe and i40e, initialize XPS on driver load so that we can
take advantage of this kernel feature.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Bruce Allan <bruce.w.allan@intel.com>
Tested-by: Krishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
  • Loading branch information
Jacob Keller authored and Jeff Kirsher committed Dec 13, 2015
1 parent 3d02b3d commit 504b0fd
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
3 changes: 3 additions & 0 deletions drivers/net/ethernet/intel/fm10k/fm10k.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include <linux/types.h>
#include <linux/etherdevice.h>
#include <linux/cpumask.h>
#include <linux/rtnetlink.h>
#include <linux/if_vlan.h>
#include <linux/pci.h>
Expand Down Expand Up @@ -66,6 +67,7 @@ struct fm10k_l2_accel {
enum fm10k_ring_state_t {
__FM10K_TX_DETECT_HANG,
__FM10K_HANG_CHECK_ARMED,
__FM10K_TX_XPS_INIT_DONE,
};

#define check_for_tx_hang(ring) \
Expand Down Expand Up @@ -209,6 +211,7 @@ struct fm10k_q_vector {
struct fm10k_ring_container rx, tx;

struct napi_struct napi;
cpumask_t affinity_mask;
char name[IFNAMSIZ + 9];

#ifdef CONFIG_DEBUG_FS
Expand Down
18 changes: 16 additions & 2 deletions drivers/net/ethernet/intel/fm10k/fm10k_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,13 @@ static void fm10k_configure_tx_ring(struct fm10k_intfc *interface,
fm10k_write_reg(hw, FM10K_PFVTCTL(reg_idx),
FM10K_PFVTCTL_FTAG_DESC_ENABLE);

/* Initialize XPS */
if (!test_and_set_bit(__FM10K_TX_XPS_INIT_DONE, &ring->state) &&
ring->q_vector)
netif_set_xps_queue(ring->netdev,
&ring->q_vector->affinity_mask,
ring->queue_index);

/* enable queue */
fm10k_write_reg(hw, FM10K_TXDCTL(reg_idx), txdctl);
}
Expand Down Expand Up @@ -1488,8 +1495,10 @@ void fm10k_qv_free_irq(struct fm10k_intfc *interface)
if (!q_vector->tx.count && !q_vector->rx.count)
continue;

/* disable interrupts */
/* clear the affinity_mask in the IRQ descriptor */
irq_set_affinity_hint(entry->vector, NULL);

/* disable interrupts */
writel(FM10K_ITR_MASK_SET, q_vector->itr);

free_irq(entry->vector, q_vector);
Expand Down Expand Up @@ -1547,6 +1556,9 @@ int fm10k_qv_request_irq(struct fm10k_intfc *interface)
goto err_out;
}

/* assign the mask for this irq */
irq_set_affinity_hint(entry->vector, &q_vector->affinity_mask);

/* Enable q_vector */
writel(FM10K_ITR_ENABLE, q_vector->itr);

Expand All @@ -1567,8 +1579,10 @@ int fm10k_qv_request_irq(struct fm10k_intfc *interface)
if (!q_vector->tx.count && !q_vector->rx.count)
continue;

/* disable interrupts */
/* clear the affinity_mask in the IRQ descriptor */
irq_set_affinity_hint(entry->vector, NULL);

/* disable interrupts */
writel(FM10K_ITR_MASK_SET, q_vector->itr);

free_irq(entry->vector, q_vector);
Expand Down

0 comments on commit 504b0fd

Please sign in to comment.