Merge branch '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says:
====================
Intel Wired LAN Driver Updates 2024-03-01 (ixgbe, i40e, ice)
This series contains updates to ixgbe, i40e, and ice drivers.
Maciej corrects disable flow for ixgbe, i40e, and ice drivers which could
cause non-functional interface with AF_XDP.
Michal restores host configuration when changing MSI-X count for VFs on
ice driver.
* '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue:
ice: reconfig host after changing MSI-X on VF
ice: reorder disabling IRQ and NAPI in ice_qp_dis
i40e: disable NAPI right after disabling irqs when handling xsk_pool
ixgbe: {dis, en}able irqs in ixgbe_txrx_ring_{dis, en}able
====================
Link: https://lore.kernel.org/r/20240301192549.2993798-1-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -13560,9 +13560,9 @@ int i40e_queue_pair_disable(struct i40e_vsi *vsi, int queue_pair)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
i40e_queue_pair_disable_irq(vsi, queue_pair);
|
i40e_queue_pair_disable_irq(vsi, queue_pair);
|
||||||
|
i40e_queue_pair_toggle_napi(vsi, queue_pair, false /* off */);
|
||||||
err = i40e_queue_pair_toggle_rings(vsi, queue_pair, false /* off */);
|
err = i40e_queue_pair_toggle_rings(vsi, queue_pair, false /* off */);
|
||||||
i40e_clean_rx_ring(vsi->rx_rings[queue_pair]);
|
i40e_clean_rx_ring(vsi->rx_rings[queue_pair]);
|
||||||
i40e_queue_pair_toggle_napi(vsi, queue_pair, false /* off */);
|
|
||||||
i40e_queue_pair_clean_rings(vsi, queue_pair);
|
i40e_queue_pair_clean_rings(vsi, queue_pair);
|
||||||
i40e_queue_pair_reset_stats(vsi, queue_pair);
|
i40e_queue_pair_reset_stats(vsi, queue_pair);
|
||||||
|
|
||||||
|
|||||||
@@ -1068,6 +1068,7 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count)
|
|||||||
struct ice_pf *pf = pci_get_drvdata(pdev);
|
struct ice_pf *pf = pci_get_drvdata(pdev);
|
||||||
u16 prev_msix, prev_queues, queues;
|
u16 prev_msix, prev_queues, queues;
|
||||||
bool needs_rebuild = false;
|
bool needs_rebuild = false;
|
||||||
|
struct ice_vsi *vsi;
|
||||||
struct ice_vf *vf;
|
struct ice_vf *vf;
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
@@ -1102,6 +1103,10 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count)
|
|||||||
if (!vf)
|
if (!vf)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
|
vsi = ice_get_vf_vsi(vf);
|
||||||
|
if (!vsi)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
prev_msix = vf->num_msix;
|
prev_msix = vf->num_msix;
|
||||||
prev_queues = vf->num_vf_qs;
|
prev_queues = vf->num_vf_qs;
|
||||||
|
|
||||||
@@ -1122,7 +1127,7 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count)
|
|||||||
if (vf->first_vector_idx < 0)
|
if (vf->first_vector_idx < 0)
|
||||||
goto unroll;
|
goto unroll;
|
||||||
|
|
||||||
if (ice_vf_reconfig_vsi(vf)) {
|
if (ice_vf_reconfig_vsi(vf) || ice_vf_init_host_cfg(vf, vsi)) {
|
||||||
/* Try to rebuild with previous values */
|
/* Try to rebuild with previous values */
|
||||||
needs_rebuild = true;
|
needs_rebuild = true;
|
||||||
goto unroll;
|
goto unroll;
|
||||||
@@ -1148,8 +1153,10 @@ unroll:
|
|||||||
if (vf->first_vector_idx < 0)
|
if (vf->first_vector_idx < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (needs_rebuild)
|
if (needs_rebuild) {
|
||||||
ice_vf_reconfig_vsi(vf);
|
ice_vf_reconfig_vsi(vf);
|
||||||
|
ice_vf_init_host_cfg(vf, vsi);
|
||||||
|
}
|
||||||
|
|
||||||
ice_ena_vf_mappings(vf);
|
ice_ena_vf_mappings(vf);
|
||||||
ice_put_vf(vf);
|
ice_put_vf(vf);
|
||||||
|
|||||||
@@ -179,6 +179,10 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx)
|
|||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
usleep_range(1000, 2000);
|
usleep_range(1000, 2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ice_qvec_dis_irq(vsi, rx_ring, q_vector);
|
||||||
|
ice_qvec_toggle_napi(vsi, q_vector, false);
|
||||||
|
|
||||||
netif_tx_stop_queue(netdev_get_tx_queue(vsi->netdev, q_idx));
|
netif_tx_stop_queue(netdev_get_tx_queue(vsi->netdev, q_idx));
|
||||||
|
|
||||||
ice_fill_txq_meta(vsi, tx_ring, &txq_meta);
|
ice_fill_txq_meta(vsi, tx_ring, &txq_meta);
|
||||||
@@ -195,13 +199,10 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
ice_qvec_dis_irq(vsi, rx_ring, q_vector);
|
|
||||||
|
|
||||||
err = ice_vsi_ctrl_one_rx_ring(vsi, false, q_idx, true);
|
err = ice_vsi_ctrl_one_rx_ring(vsi, false, q_idx, true);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
ice_qvec_toggle_napi(vsi, q_vector, false);
|
|
||||||
ice_qp_clean_rings(vsi, q_idx);
|
ice_qp_clean_rings(vsi, q_idx);
|
||||||
ice_qp_reset_stats(vsi, q_idx);
|
ice_qp_reset_stats(vsi, q_idx);
|
||||||
|
|
||||||
@@ -259,11 +260,11 @@ static int ice_qp_ena(struct ice_vsi *vsi, u16 q_idx)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
clear_bit(ICE_CFG_BUSY, vsi->state);
|
|
||||||
ice_qvec_toggle_napi(vsi, q_vector, true);
|
ice_qvec_toggle_napi(vsi, q_vector, true);
|
||||||
ice_qvec_ena_irq(vsi, q_vector);
|
ice_qvec_ena_irq(vsi, q_vector);
|
||||||
|
|
||||||
netif_tx_start_queue(netdev_get_tx_queue(vsi->netdev, q_idx));
|
netif_tx_start_queue(netdev_get_tx_queue(vsi->netdev, q_idx));
|
||||||
|
clear_bit(ICE_CFG_BUSY, vsi->state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2939,8 +2939,8 @@ static void ixgbe_check_lsc(struct ixgbe_adapter *adapter)
|
|||||||
static inline void ixgbe_irq_enable_queues(struct ixgbe_adapter *adapter,
|
static inline void ixgbe_irq_enable_queues(struct ixgbe_adapter *adapter,
|
||||||
u64 qmask)
|
u64 qmask)
|
||||||
{
|
{
|
||||||
u32 mask;
|
|
||||||
struct ixgbe_hw *hw = &adapter->hw;
|
struct ixgbe_hw *hw = &adapter->hw;
|
||||||
|
u32 mask;
|
||||||
|
|
||||||
switch (hw->mac.type) {
|
switch (hw->mac.type) {
|
||||||
case ixgbe_mac_82598EB:
|
case ixgbe_mac_82598EB:
|
||||||
@@ -10524,6 +10524,44 @@ static void ixgbe_reset_rxr_stats(struct ixgbe_ring *rx_ring)
|
|||||||
memset(&rx_ring->rx_stats, 0, sizeof(rx_ring->rx_stats));
|
memset(&rx_ring->rx_stats, 0, sizeof(rx_ring->rx_stats));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ixgbe_irq_disable_single - Disable single IRQ vector
|
||||||
|
* @adapter: adapter structure
|
||||||
|
* @ring: ring index
|
||||||
|
**/
|
||||||
|
static void ixgbe_irq_disable_single(struct ixgbe_adapter *adapter, u32 ring)
|
||||||
|
{
|
||||||
|
struct ixgbe_hw *hw = &adapter->hw;
|
||||||
|
u64 qmask = BIT_ULL(ring);
|
||||||
|
u32 mask;
|
||||||
|
|
||||||
|
switch (adapter->hw.mac.type) {
|
||||||
|
case ixgbe_mac_82598EB:
|
||||||
|
mask = qmask & IXGBE_EIMC_RTX_QUEUE;
|
||||||
|
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, mask);
|
||||||
|
break;
|
||||||
|
case ixgbe_mac_82599EB:
|
||||||
|
case ixgbe_mac_X540:
|
||||||
|
case ixgbe_mac_X550:
|
||||||
|
case ixgbe_mac_X550EM_x:
|
||||||
|
case ixgbe_mac_x550em_a:
|
||||||
|
mask = (qmask & 0xFFFFFFFF);
|
||||||
|
if (mask)
|
||||||
|
IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
|
||||||
|
mask = (qmask >> 32);
|
||||||
|
if (mask)
|
||||||
|
IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||||
|
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED)
|
||||||
|
synchronize_irq(adapter->msix_entries[ring].vector);
|
||||||
|
else
|
||||||
|
synchronize_irq(adapter->pdev->irq);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ixgbe_txrx_ring_disable - Disable Rx/Tx/XDP Tx rings
|
* ixgbe_txrx_ring_disable - Disable Rx/Tx/XDP Tx rings
|
||||||
* @adapter: adapter structure
|
* @adapter: adapter structure
|
||||||
@@ -10540,6 +10578,11 @@ void ixgbe_txrx_ring_disable(struct ixgbe_adapter *adapter, int ring)
|
|||||||
tx_ring = adapter->tx_ring[ring];
|
tx_ring = adapter->tx_ring[ring];
|
||||||
xdp_ring = adapter->xdp_ring[ring];
|
xdp_ring = adapter->xdp_ring[ring];
|
||||||
|
|
||||||
|
ixgbe_irq_disable_single(adapter, ring);
|
||||||
|
|
||||||
|
/* Rx/Tx/XDP Tx share the same napi context. */
|
||||||
|
napi_disable(&rx_ring->q_vector->napi);
|
||||||
|
|
||||||
ixgbe_disable_txr(adapter, tx_ring);
|
ixgbe_disable_txr(adapter, tx_ring);
|
||||||
if (xdp_ring)
|
if (xdp_ring)
|
||||||
ixgbe_disable_txr(adapter, xdp_ring);
|
ixgbe_disable_txr(adapter, xdp_ring);
|
||||||
@@ -10548,9 +10591,6 @@ void ixgbe_txrx_ring_disable(struct ixgbe_adapter *adapter, int ring)
|
|||||||
if (xdp_ring)
|
if (xdp_ring)
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
|
|
||||||
/* Rx/Tx/XDP Tx share the same napi context. */
|
|
||||||
napi_disable(&rx_ring->q_vector->napi);
|
|
||||||
|
|
||||||
ixgbe_clean_tx_ring(tx_ring);
|
ixgbe_clean_tx_ring(tx_ring);
|
||||||
if (xdp_ring)
|
if (xdp_ring)
|
||||||
ixgbe_clean_tx_ring(xdp_ring);
|
ixgbe_clean_tx_ring(xdp_ring);
|
||||||
@@ -10578,9 +10618,6 @@ void ixgbe_txrx_ring_enable(struct ixgbe_adapter *adapter, int ring)
|
|||||||
tx_ring = adapter->tx_ring[ring];
|
tx_ring = adapter->tx_ring[ring];
|
||||||
xdp_ring = adapter->xdp_ring[ring];
|
xdp_ring = adapter->xdp_ring[ring];
|
||||||
|
|
||||||
/* Rx/Tx/XDP Tx share the same napi context. */
|
|
||||||
napi_enable(&rx_ring->q_vector->napi);
|
|
||||||
|
|
||||||
ixgbe_configure_tx_ring(adapter, tx_ring);
|
ixgbe_configure_tx_ring(adapter, tx_ring);
|
||||||
if (xdp_ring)
|
if (xdp_ring)
|
||||||
ixgbe_configure_tx_ring(adapter, xdp_ring);
|
ixgbe_configure_tx_ring(adapter, xdp_ring);
|
||||||
@@ -10589,6 +10626,11 @@ void ixgbe_txrx_ring_enable(struct ixgbe_adapter *adapter, int ring)
|
|||||||
clear_bit(__IXGBE_TX_DISABLED, &tx_ring->state);
|
clear_bit(__IXGBE_TX_DISABLED, &tx_ring->state);
|
||||||
if (xdp_ring)
|
if (xdp_ring)
|
||||||
clear_bit(__IXGBE_TX_DISABLED, &xdp_ring->state);
|
clear_bit(__IXGBE_TX_DISABLED, &xdp_ring->state);
|
||||||
|
|
||||||
|
/* Rx/Tx/XDP Tx share the same napi context. */
|
||||||
|
napi_enable(&rx_ring->q_vector->napi);
|
||||||
|
ixgbe_irq_enable_queues(adapter, BIT_ULL(ring));
|
||||||
|
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user