Commit 65745da1 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files
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.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents d6d9fc1d 7d59706d
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -2871,7 +2871,6 @@ static void iavf_reset_task(struct work_struct *work)
	running = adapter->state == __IAVF_RUNNING;

	if (running) {
		netdev->flags &= ~IFF_UP;
		netif_carrier_off(netdev);
		netif_tx_stop_all_queues(netdev);
		adapter->link_up = false;
@@ -2988,7 +2987,7 @@ static void iavf_reset_task(struct work_struct *work)
		 * to __IAVF_RUNNING
		 */
		iavf_up_complete(adapter);
		netdev->flags |= IFF_UP;

		iavf_irq_enable(adapter, true);
	} else {
		iavf_change_state(adapter, __IAVF_DOWN);
@@ -3004,10 +3003,8 @@ static void iavf_reset_task(struct work_struct *work)
reset_err:
	mutex_unlock(&adapter->client_lock);
	mutex_unlock(&adapter->crit_lock);
	if (running) {
	if (running)
		iavf_change_state(adapter, __IAVF_RUNNING);
		netdev->flags |= IFF_UP;
	}
	dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n");
	iavf_close(netdev);
}
+2 −7
Original line number Diff line number Diff line
@@ -577,7 +577,7 @@ void ice_free_cpu_rx_rmap(struct ice_vsi *vsi)
{
	struct net_device *netdev;

	if (!vsi || vsi->type != ICE_VSI_PF || !vsi->arfs_fltr_list)
	if (!vsi || vsi->type != ICE_VSI_PF)
		return;

	netdev = vsi->netdev;
@@ -599,7 +599,7 @@ int ice_set_cpu_rx_rmap(struct ice_vsi *vsi)
	int base_idx, i;

	if (!vsi || vsi->type != ICE_VSI_PF)
		return -EINVAL;
		return 0;

	pf = vsi->back;
	netdev = vsi->netdev;
@@ -636,7 +636,6 @@ void ice_remove_arfs(struct ice_pf *pf)
	if (!pf_vsi)
		return;

	ice_free_cpu_rx_rmap(pf_vsi);
	ice_clear_arfs(pf_vsi);
}

@@ -653,9 +652,5 @@ void ice_rebuild_arfs(struct ice_pf *pf)
		return;

	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);
}
+4 −1
Original line number Diff line number Diff line
@@ -2689,6 +2689,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)
		return;

	vsi->irqs_ready = false;
	ice_free_cpu_rx_rmap(vsi);

	ice_for_each_q_vector(vsi, i) {
		u16 vector = i + base;
		int irq_num;
@@ -2702,6 +2704,7 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)
			continue;

		/* clear the affinity notifier in the IRQ descriptor */
		if (!IS_ENABLED(CONFIG_RFS_ACCEL))
			irq_set_affinity_notifier(irq_num, NULL);

		/* clear the affinity_mask in the IRQ descriptor */
+8 −10
Original line number Diff line number Diff line
@@ -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);
	}

	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;
	return 0;

@@ -3692,20 +3699,12 @@ static int ice_setup_pf_sw(struct ice_pf *pf)
	 */
	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);
	if (status)
		goto free_cpu_rx_map;
		goto unroll_napi_add;

	return 0;

free_cpu_rx_map:
	ice_free_cpu_rx_rmap(vsi);
unroll_napi_add:
	ice_tc_indir_block_unregister(vsi);
unroll_cfg_netdev:
@@ -5167,7 +5166,6 @@ static int __maybe_unused ice_suspend(struct device *dev)
			continue;
		ice_vsi_free_q_vectors(pf->vsi[v]);
	}
	ice_free_cpu_rx_rmap(ice_get_main_vsi(pf));
	ice_clear_interrupt_scheme(pf);

	pci_save_state(pdev);