sfc: change ARFS expiry mechanism
The old rfs_filters_added method for determining the quota could potentially allow the NIC to become filled with old filters, which never get tested for expiry. Instead, explicitly make expiry check work depend on the number of filters installed, and don't count checking slots without filters in as doing work. This guarantees that each filter will be checked for expiry at least once every thirty seconds (assuming the channel to which it belongs is NAPI polling actively) regardless of fill level. Signed-off-by: Edward Cree <ecree@solarflare.com> Tested-by: David Ahern <dahern@digitalocean.com> Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
This commit is contained in:

committed by
Jakub Kicinski

parent
c4f2cbd376
commit
8490e75cdb
@@ -166,15 +166,16 @@ static inline s32 efx_filter_get_rx_ids(struct efx_nic *efx,
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
|
||||
u16 rxq_index, u32 flow_id);
|
||||
bool __efx_filter_rfs_expire(struct efx_nic *efx, unsigned quota);
|
||||
bool __efx_filter_rfs_expire(struct efx_channel *channel, unsigned int quota);
|
||||
static inline void efx_filter_rfs_expire(struct work_struct *data)
|
||||
{
|
||||
struct efx_channel *channel = container_of(data, struct efx_channel,
|
||||
filter_work);
|
||||
unsigned int time = jiffies - channel->rfs_last_expiry, quota;
|
||||
|
||||
if (channel->rfs_filters_added >= 60 &&
|
||||
__efx_filter_rfs_expire(channel->efx, 100))
|
||||
channel->rfs_filters_added -= 60;
|
||||
quota = channel->rfs_filter_count * time / (30 * HZ);
|
||||
if (quota > 20 && __efx_filter_rfs_expire(channel, min(channel->rfs_filter_count, quota)))
|
||||
channel->rfs_last_expiry += time;
|
||||
}
|
||||
#define efx_filter_rfs_enabled() 1
|
||||
#else
|
||||
|
Reference in New Issue
Block a user