Skip to content

Commit d9c0103

Browse files
committed
Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2022-09-02 (i40e, iavf) This series contains updates to i40e and iavf drivers. Przemyslaw adds reset to ADQ configuration to allow for setting of rate limit beyond TC0 for i40e. Ivan Vecera does not free client on failure to open which could cause NULL pointer dereference to occur on i40e. He also detaches device during reset to prevent NDO calls with could cause races for iavf. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents cf5c15d + aa626da commit d9c0103

4 files changed

Lines changed: 20 additions & 5 deletions

File tree

drivers/net/ethernet/intel/i40e/i40e_client.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ void i40e_notify_client_of_netdev_close(struct i40e_vsi *vsi, bool reset)
177177
"Cannot locate client instance close routine\n");
178178
return;
179179
}
180+
if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) {
181+
dev_dbg(&pf->pdev->dev, "Client is not open, abort close\n");
182+
return;
183+
}
180184
cdev->client->ops->close(&cdev->lan_info, cdev->client, reset);
181185
clear_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state);
182186
i40e_client_release_qvlist(&cdev->lan_info);
@@ -429,7 +433,6 @@ void i40e_client_subtask(struct i40e_pf *pf)
429433
/* Remove failed client instance */
430434
clear_bit(__I40E_CLIENT_INSTANCE_OPENED,
431435
&cdev->state);
432-
i40e_client_del_instance(pf);
433436
return;
434437
}
435438
}

drivers/net/ethernet/intel/i40e/i40e_main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6659,6 +6659,9 @@ static int i40e_configure_queue_channels(struct i40e_vsi *vsi)
66596659
vsi->tc_seid_map[i] = ch->seid;
66606660
}
66616661
}
6662+
6663+
/* reset to reconfigure TX queue contexts */
6664+
i40e_do_reset(vsi->back, I40E_PF_RESET_FLAG, true);
66626665
return ret;
66636666

66646667
err_free:

drivers/net/ethernet/intel/i40e/i40e_txrx.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3688,7 +3688,8 @@ u16 i40e_lan_select_queue(struct net_device *netdev,
36883688
u8 prio;
36893689

36903690
/* is DCB enabled at all? */
3691-
if (vsi->tc_config.numtc == 1)
3691+
if (vsi->tc_config.numtc == 1 ||
3692+
i40e_is_tc_mqprio_enabled(vsi->back))
36923693
return netdev_pick_tx(netdev, skb, sb_dev);
36933694

36943695
prio = skb->priority;

drivers/net/ethernet/intel/iavf/iavf_main.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2877,14 +2877,19 @@ static void iavf_reset_task(struct work_struct *work)
28772877
int i = 0, err;
28782878
bool running;
28792879

2880+
/* Detach interface to avoid subsequent NDO callbacks */
2881+
rtnl_lock();
2882+
netif_device_detach(netdev);
2883+
rtnl_unlock();
2884+
28802885
/* When device is being removed it doesn't make sense to run the reset
28812886
* task, just return in such a case.
28822887
*/
28832888
if (!mutex_trylock(&adapter->crit_lock)) {
28842889
if (adapter->state != __IAVF_REMOVE)
28852890
queue_work(iavf_wq, &adapter->reset_task);
28862891

2887-
return;
2892+
goto reset_finish;
28882893
}
28892894

28902895
while (!mutex_trylock(&adapter->client_lock))
@@ -2954,7 +2959,6 @@ static void iavf_reset_task(struct work_struct *work)
29542959

29552960
if (running) {
29562961
netif_carrier_off(netdev);
2957-
netif_tx_stop_all_queues(netdev);
29582962
adapter->link_up = false;
29592963
iavf_napi_disable_all(adapter);
29602964
}
@@ -3084,7 +3088,7 @@ static void iavf_reset_task(struct work_struct *work)
30843088
mutex_unlock(&adapter->client_lock);
30853089
mutex_unlock(&adapter->crit_lock);
30863090

3087-
return;
3091+
goto reset_finish;
30883092
reset_err:
30893093
if (running) {
30903094
set_bit(__IAVF_VSI_DOWN, adapter->vsi.state);
@@ -3095,6 +3099,10 @@ static void iavf_reset_task(struct work_struct *work)
30953099
mutex_unlock(&adapter->client_lock);
30963100
mutex_unlock(&adapter->crit_lock);
30973101
dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n");
3102+
reset_finish:
3103+
rtnl_lock();
3104+
netif_device_attach(netdev);
3105+
rtnl_unlock();
30983106
}
30993107

31003108
/**

0 commit comments

Comments
 (0)