sfc: replace asynchronous filter operations
Instead of having an efx->type->filter_rfs_insert() method, just use workitems with a worker function that calls efx->type->filter_insert(). The only user of this is efx_filter_rfs(), which now queues a call to efx_filter_rfs_work(). Similarly, efx_filter_rfs_expire() is now a worker function called on a new channel->filter_work work_struct, so the method efx->type->filter_rfs_expire_one() is no longer called in atomic context. We also add a new mutex efx->rps_mutex to protect the RPS state (efx-> rps_expire_channel, efx->rps_expire_index, and channel->rps_flow_id) so that the taking of efx->filter_lock can be moved to efx->type->filter_rfs_expire_one(). Thus, all filter table functions are now called in a sleepable context, allowing them to use sleeping locks in a future patch. Signed-off-by: Edward Cree <ecree@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
c709002c23
commit
3af0f34290
@@ -340,7 +340,10 @@ static int efx_poll(struct napi_struct *napi, int budget)
|
||||
efx_update_irq_mod(efx, channel);
|
||||
}
|
||||
|
||||
efx_filter_rfs_expire(channel);
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
/* Perhaps expire some ARFS filters */
|
||||
schedule_work(&channel->filter_work);
|
||||
#endif
|
||||
|
||||
/* There is no race here; although napi_disable() will
|
||||
* only wait for napi_complete(), this isn't a problem
|
||||
@@ -470,6 +473,10 @@ efx_alloc_channel(struct efx_nic *efx, int i, struct efx_channel *old_channel)
|
||||
tx_queue->channel = channel;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
INIT_WORK(&channel->filter_work, efx_filter_rfs_expire);
|
||||
#endif
|
||||
|
||||
rx_queue = &channel->rx_queue;
|
||||
rx_queue->efx = efx;
|
||||
timer_setup(&rx_queue->slow_fill, efx_rx_slow_fill, 0);
|
||||
@@ -512,6 +519,9 @@ efx_copy_channel(const struct efx_channel *old_channel)
|
||||
rx_queue->buffer = NULL;
|
||||
memset(&rx_queue->rxd, 0, sizeof(rx_queue->rxd));
|
||||
timer_setup(&rx_queue->slow_fill, efx_rx_slow_fill, 0);
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
INIT_WORK(&channel->filter_work, efx_filter_rfs_expire);
|
||||
#endif
|
||||
|
||||
return channel;
|
||||
}
|
||||
@@ -3012,6 +3022,9 @@ static int efx_init_struct(struct efx_nic *efx,
|
||||
efx->num_mac_stats = MC_CMD_MAC_NSTATS;
|
||||
BUILD_BUG_ON(MC_CMD_MAC_NSTATS - 1 != MC_CMD_MAC_GENERATION_END);
|
||||
mutex_init(&efx->mac_lock);
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
mutex_init(&efx->rps_mutex);
|
||||
#endif
|
||||
efx->phy_op = &efx_dummy_phy_operations;
|
||||
efx->mdio.dev = net_dev;
|
||||
INIT_WORK(&efx->mac_work, efx_mac_work);
|
||||
|
Reference in New Issue
Block a user