Message ID | 20240819100606.15383-6-larysa.zaremba@intel.com |
---|---|
State | Changes Requested |
Delegated to: | Anthony Nguyen |
Headers | show |
Series | ice: fix synchronization between .ndo_bpf() and reset | expand |
On Mon, Aug 19, 2024 at 12:05:42PM +0200, Larysa Zaremba wrote: > Locking used in ice_qp_ena() and ice_qp_dis() does pretty much nothing, > because ICE_CFG_BUSY is a state flag that is supposed to be set in a PF > state, not VSI one. Therefore it does not protect the queue pair from > e.g. reset. > > Despite being useless, it still can deadlock the unfortunate functions that > have fell into the same ICE_CFG_BUSY-VSI trap. This happens if ice_qp_ena > returns an error. I believe the last sentence is not valid after our recent fixes around xsk and tx timeouts. > > Remove ICE_CFG_BUSY locking from ice_qp_dis() and ice_qp_ena(). > > Fixes: 2d4238f55697 ("ice: Add support for AF_XDP") > Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> > Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> > Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com> > Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com> Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> > --- > drivers/net/ethernet/intel/ice/ice_xsk.c | 9 --------- > 1 file changed, 9 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.c b/drivers/net/ethernet/intel/ice/ice_xsk.c > index 8693509efbe7..5dee829bfc47 100644 > --- a/drivers/net/ethernet/intel/ice/ice_xsk.c > +++ b/drivers/net/ethernet/intel/ice/ice_xsk.c > @@ -165,7 +165,6 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx) > struct ice_q_vector *q_vector; > struct ice_tx_ring *tx_ring; > struct ice_rx_ring *rx_ring; > - int timeout = 50; > int fail = 0; > int err; > > @@ -176,13 +175,6 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx) > rx_ring = vsi->rx_rings[q_idx]; > q_vector = rx_ring->q_vector; > > - while (test_and_set_bit(ICE_CFG_BUSY, vsi->state)) { > - timeout--; > - if (!timeout) > - return -EBUSY; > - usleep_range(1000, 2000); > - } > - > synchronize_net(); > netif_carrier_off(vsi->netdev); > netif_tx_stop_queue(netdev_get_tx_queue(vsi->netdev, q_idx)); > @@ -261,7 +253,6 @@ static int ice_qp_ena(struct ice_vsi *vsi, u16 q_idx) > netif_tx_start_queue(netdev_get_tx_queue(vsi->netdev, q_idx)); > netif_carrier_on(vsi->netdev); > } > - clear_bit(ICE_CFG_BUSY, vsi->state); > > return fail; > } > -- > 2.43.0 >
On Thu, Aug 22, 2024 at 01:43:50PM +0200, Maciej Fijalkowski wrote: > On Mon, Aug 19, 2024 at 12:05:42PM +0200, Larysa Zaremba wrote: > > Locking used in ice_qp_ena() and ice_qp_dis() does pretty much nothing, > > because ICE_CFG_BUSY is a state flag that is supposed to be set in a PF > > state, not VSI one. Therefore it does not protect the queue pair from > > e.g. reset. > > > > Despite being useless, it still can deadlock the unfortunate functions that > > have fell into the same ICE_CFG_BUSY-VSI trap. This happens if ice_qp_ena > > returns an error. > > I believe the last sentence is not valid after our recent fixes around xsk > and tx timeouts. > Yes, this is no longer valid, I need to remove this. > > > > Remove ICE_CFG_BUSY locking from ice_qp_dis() and ice_qp_ena(). > > > > Fixes: 2d4238f55697 ("ice: Add support for AF_XDP") > > Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> > > Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> > > Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com> > > Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com> > > Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> > > > --- > > drivers/net/ethernet/intel/ice/ice_xsk.c | 9 --------- > > 1 file changed, 9 deletions(-) > > > > diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.c b/drivers/net/ethernet/intel/ice/ice_xsk.c > > index 8693509efbe7..5dee829bfc47 100644 > > --- a/drivers/net/ethernet/intel/ice/ice_xsk.c > > +++ b/drivers/net/ethernet/intel/ice/ice_xsk.c > > @@ -165,7 +165,6 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx) > > struct ice_q_vector *q_vector; > > struct ice_tx_ring *tx_ring; > > struct ice_rx_ring *rx_ring; > > - int timeout = 50; > > int fail = 0; > > int err; > > > > @@ -176,13 +175,6 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx) > > rx_ring = vsi->rx_rings[q_idx]; > > q_vector = rx_ring->q_vector; > > > > - while (test_and_set_bit(ICE_CFG_BUSY, vsi->state)) { > > - timeout--; > > - if (!timeout) > > - return -EBUSY; > > - usleep_range(1000, 2000); > > - } > > - > > synchronize_net(); > > netif_carrier_off(vsi->netdev); > > netif_tx_stop_queue(netdev_get_tx_queue(vsi->netdev, q_idx)); > > @@ -261,7 +253,6 @@ static int ice_qp_ena(struct ice_vsi *vsi, u16 q_idx) > > netif_tx_start_queue(netdev_get_tx_queue(vsi->netdev, q_idx)); > > netif_carrier_on(vsi->netdev); > > } > > - clear_bit(ICE_CFG_BUSY, vsi->state); > > > > return fail; > > } > > -- > > 2.43.0 > >
diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.c b/drivers/net/ethernet/intel/ice/ice_xsk.c index 8693509efbe7..5dee829bfc47 100644 --- a/drivers/net/ethernet/intel/ice/ice_xsk.c +++ b/drivers/net/ethernet/intel/ice/ice_xsk.c @@ -165,7 +165,6 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx) struct ice_q_vector *q_vector; struct ice_tx_ring *tx_ring; struct ice_rx_ring *rx_ring; - int timeout = 50; int fail = 0; int err; @@ -176,13 +175,6 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx) rx_ring = vsi->rx_rings[q_idx]; q_vector = rx_ring->q_vector; - while (test_and_set_bit(ICE_CFG_BUSY, vsi->state)) { - timeout--; - if (!timeout) - return -EBUSY; - usleep_range(1000, 2000); - } - synchronize_net(); netif_carrier_off(vsi->netdev); netif_tx_stop_queue(netdev_get_tx_queue(vsi->netdev, q_idx)); @@ -261,7 +253,6 @@ static int ice_qp_ena(struct ice_vsi *vsi, u16 q_idx) netif_tx_start_queue(netdev_get_tx_queue(vsi->netdev, q_idx)); netif_carrier_on(vsi->netdev); } - clear_bit(ICE_CFG_BUSY, vsi->state); return fail; }