Commit 65745da1 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue

Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2022-04-08

Alexander fixes a use after free issue with aRFS for ice driver.

Mateusz reverts a commit that introduced issues related to device
resets for iavf driver.

* '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue:
  Revert "iavf: Fix deadlock occurrence during resetting VF interface"
  ice: arfs: fix use-after-free when freeing @rx_cpu_rmap
====================

Link: https://lore.kernel.org/r/20220408163411.2415552-1-anthony.l.nguyen@intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents d6d9fc1d 7d59706d
...@@ -2871,7 +2871,6 @@ static void iavf_reset_task(struct work_struct *work) ...@@ -2871,7 +2871,6 @@ static void iavf_reset_task(struct work_struct *work)
running = adapter->state == __IAVF_RUNNING; running = adapter->state == __IAVF_RUNNING;
if (running) { if (running) {
netdev->flags &= ~IFF_UP;
netif_carrier_off(netdev); netif_carrier_off(netdev);
netif_tx_stop_all_queues(netdev); netif_tx_stop_all_queues(netdev);
adapter->link_up = false; adapter->link_up = false;
...@@ -2988,7 +2987,7 @@ static void iavf_reset_task(struct work_struct *work) ...@@ -2988,7 +2987,7 @@ static void iavf_reset_task(struct work_struct *work)
* to __IAVF_RUNNING * to __IAVF_RUNNING
*/ */
iavf_up_complete(adapter); iavf_up_complete(adapter);
netdev->flags |= IFF_UP;
iavf_irq_enable(adapter, true); iavf_irq_enable(adapter, true);
} else { } else {
iavf_change_state(adapter, __IAVF_DOWN); iavf_change_state(adapter, __IAVF_DOWN);
...@@ -3004,10 +3003,8 @@ static void iavf_reset_task(struct work_struct *work) ...@@ -3004,10 +3003,8 @@ static void iavf_reset_task(struct work_struct *work)
reset_err: reset_err:
mutex_unlock(&adapter->client_lock); mutex_unlock(&adapter->client_lock);
mutex_unlock(&adapter->crit_lock); mutex_unlock(&adapter->crit_lock);
if (running) { if (running)
iavf_change_state(adapter, __IAVF_RUNNING); iavf_change_state(adapter, __IAVF_RUNNING);
netdev->flags |= IFF_UP;
}
dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n"); dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n");
iavf_close(netdev); iavf_close(netdev);
} }
......
...@@ -577,7 +577,7 @@ void ice_free_cpu_rx_rmap(struct ice_vsi *vsi) ...@@ -577,7 +577,7 @@ void ice_free_cpu_rx_rmap(struct ice_vsi *vsi)
{ {
struct net_device *netdev; struct net_device *netdev;
if (!vsi || vsi->type != ICE_VSI_PF || !vsi->arfs_fltr_list) if (!vsi || vsi->type != ICE_VSI_PF)
return; return;
netdev = vsi->netdev; netdev = vsi->netdev;
...@@ -599,7 +599,7 @@ int ice_set_cpu_rx_rmap(struct ice_vsi *vsi) ...@@ -599,7 +599,7 @@ int ice_set_cpu_rx_rmap(struct ice_vsi *vsi)
int base_idx, i; int base_idx, i;
if (!vsi || vsi->type != ICE_VSI_PF) if (!vsi || vsi->type != ICE_VSI_PF)
return -EINVAL; return 0;
pf = vsi->back; pf = vsi->back;
netdev = vsi->netdev; netdev = vsi->netdev;
...@@ -636,7 +636,6 @@ void ice_remove_arfs(struct ice_pf *pf) ...@@ -636,7 +636,6 @@ void ice_remove_arfs(struct ice_pf *pf)
if (!pf_vsi) if (!pf_vsi)
return; return;
ice_free_cpu_rx_rmap(pf_vsi);
ice_clear_arfs(pf_vsi); ice_clear_arfs(pf_vsi);
} }
...@@ -653,9 +652,5 @@ void ice_rebuild_arfs(struct ice_pf *pf) ...@@ -653,9 +652,5 @@ void ice_rebuild_arfs(struct ice_pf *pf)
return; return;
ice_remove_arfs(pf); ice_remove_arfs(pf);
if (ice_set_cpu_rx_rmap(pf_vsi)) {
dev_err(ice_pf_to_dev(pf), "Failed to rebuild aRFS\n");
return;
}
ice_init_arfs(pf_vsi); ice_init_arfs(pf_vsi);
} }
...@@ -2689,6 +2689,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi) ...@@ -2689,6 +2689,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)
return; return;
vsi->irqs_ready = false; vsi->irqs_ready = false;
ice_free_cpu_rx_rmap(vsi);
ice_for_each_q_vector(vsi, i) { ice_for_each_q_vector(vsi, i) {
u16 vector = i + base; u16 vector = i + base;
int irq_num; int irq_num;
...@@ -2702,7 +2704,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi) ...@@ -2702,7 +2704,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)
continue; continue;
/* clear the affinity notifier in the IRQ descriptor */ /* clear the affinity notifier in the IRQ descriptor */
irq_set_affinity_notifier(irq_num, NULL); if (!IS_ENABLED(CONFIG_RFS_ACCEL))
irq_set_affinity_notifier(irq_num, NULL);
/* clear the affinity_mask in the IRQ descriptor */ /* clear the affinity_mask in the IRQ descriptor */
irq_set_affinity_hint(irq_num, NULL); irq_set_affinity_hint(irq_num, NULL);
......
...@@ -2510,6 +2510,13 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename) ...@@ -2510,6 +2510,13 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename)
irq_set_affinity_hint(irq_num, &q_vector->affinity_mask); irq_set_affinity_hint(irq_num, &q_vector->affinity_mask);
} }
err = ice_set_cpu_rx_rmap(vsi);
if (err) {
netdev_err(vsi->netdev, "Failed to setup CPU RMAP on VSI %u: %pe\n",
vsi->vsi_num, ERR_PTR(err));
goto free_q_irqs;
}
vsi->irqs_ready = true; vsi->irqs_ready = true;
return 0; return 0;
...@@ -3692,20 +3699,12 @@ static int ice_setup_pf_sw(struct ice_pf *pf) ...@@ -3692,20 +3699,12 @@ static int ice_setup_pf_sw(struct ice_pf *pf)
*/ */
ice_napi_add(vsi); ice_napi_add(vsi);
status = ice_set_cpu_rx_rmap(vsi);
if (status) {
dev_err(dev, "Failed to set CPU Rx map VSI %d error %d\n",
vsi->vsi_num, status);
goto unroll_napi_add;
}
status = ice_init_mac_fltr(pf); status = ice_init_mac_fltr(pf);
if (status) if (status)
goto free_cpu_rx_map; goto unroll_napi_add;
return 0; return 0;
free_cpu_rx_map:
ice_free_cpu_rx_rmap(vsi);
unroll_napi_add: unroll_napi_add:
ice_tc_indir_block_unregister(vsi); ice_tc_indir_block_unregister(vsi);
unroll_cfg_netdev: unroll_cfg_netdev:
...@@ -5167,7 +5166,6 @@ static int __maybe_unused ice_suspend(struct device *dev) ...@@ -5167,7 +5166,6 @@ static int __maybe_unused ice_suspend(struct device *dev)
continue; continue;
ice_vsi_free_q_vectors(pf->vsi[v]); ice_vsi_free_q_vectors(pf->vsi[v]);
} }
ice_free_cpu_rx_rmap(ice_get_main_vsi(pf));
ice_clear_interrupt_scheme(pf); ice_clear_interrupt_scheme(pf);
pci_save_state(pdev); pci_save_state(pdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment