Message ID | 38c7df29-b013-7408-90aa-ed4c3797df34@solarflare.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | sfc: more EF100 fixes | expand |
On Tue, 18 Aug 2020 13:43:57 +0100 Edward Cree <ecree@solarflare.com> wrote: > When downing and upping the ef100 filter table, we need to take a > write lock on efx->filter_sem, not just a read lock, because we may > kfree() the table pointers. > Without this, resets cause a WARN_ON from > efx_rwsem_assert_write_locked(). > > Fixes: a9dc3d5612ce ("sfc_ef100: RX filter table management and > related gubbins") > Signed-off-by: Edward Cree <ecree@solarflare.com> Fix makes sense Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c index b8a7e9ed7913..19fe86b3b316 100644 --- a/drivers/net/ethernet/sfc/ef100_nic.c +++ b/drivers/net/ethernet/sfc/ef100_nic.c @@ -431,18 +431,18 @@ static int ef100_reset(struct efx_nic *efx, enum reset_type reset_type) /* A RESET_TYPE_ALL will cause filters to be removed, so we remove filters * and reprobe after reset to avoid removing filters twice */ - down_read(&efx->filter_sem); + down_write(&efx->filter_sem); ef100_filter_table_down(efx); - up_read(&efx->filter_sem); + up_write(&efx->filter_sem); rc = efx_mcdi_reset(efx, reset_type); if (rc) return rc; netif_device_attach(efx->net_dev); - down_read(&efx->filter_sem); + down_write(&efx->filter_sem); rc = ef100_filter_table_up(efx); - up_read(&efx->filter_sem); + up_write(&efx->filter_sem); if (rc) return rc;
When downing and upping the ef100 filter table, we need to take a write lock on efx->filter_sem, not just a read lock, because we may kfree() the table pointers. Without this, resets cause a WARN_ON from efx_rwsem_assert_write_locked(). Fixes: a9dc3d5612ce ("sfc_ef100: RX filter table management and related gubbins") Signed-off-by: Edward Cree <ecree@solarflare.com> --- drivers/net/ethernet/sfc/ef100_nic.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)