diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40e/i40e_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 1ccabeafa44c..2c5af6d4a6b1 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -6823,8 +6823,8 @@ void i40e_down(struct i40e_vsi *vsi)  	for (i = 0; i < vsi->num_queue_pairs; i++) {  		i40e_clean_tx_ring(vsi->tx_rings[i]);  		if (i40e_enabled_xdp_vsi(vsi)) { -			/* Make sure that in-progress ndo_xdp_xmit -			 * calls are completed. +			/* Make sure that in-progress ndo_xdp_xmit and +			 * ndo_xsk_wakeup calls are completed.  			 */  			synchronize_rcu();  			i40e_clean_tx_ring(vsi->xdp_rings[i]); @@ -12546,8 +12546,12 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi,  	old_prog = xchg(&vsi->xdp_prog, prog); -	if (need_reset) +	if (need_reset) { +		if (!prog) +			/* Wait until ndo_xsk_wakeup completes. */ +			synchronize_rcu();  		i40e_reset_and_rebuild(pf, true, true); +	}  	for (i = 0; i < vsi->num_queue_pairs; i++)  		WRITE_ONCE(vsi->rx_rings[i]->xdp_prog, vsi->xdp_prog); | 
