]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/net/ethernet/intel/i40e/i40e_main.c
net/i40e: Fix concurrency issues between config flow and XSK
[linux.git] / drivers / net / ethernet / intel / i40e / i40e_main.c
index 1ccabeafa44c4622b48167de77f8151e03d16fa9..2c5af6d4a6b1c641ea2c47f44469a530df363850 100644 (file)
@@ -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);