sfc: limit ARFS workitems in flight per channel
authorEdward Cree <ecree@solarflare.com>
Fri, 13 Apr 2018 18:18:09 +0000 (19:18 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 14 Apr 2018 19:39:53 +0000 (15:39 -0400)
commitf993740ee05821307eca03d23d468895740450f8
treeb44c9774d72109d8c8ec693b9e55dd6144eb6cc0
parenta7f80189e41c96c0c6210e9198a31859c91eb3e5
sfc: limit ARFS workitems in flight per channel

A misconfigured system (e.g. with all interrupts affinitised to all CPUs)
 may produce a storm of ARFS steering events.  With the existing sfc ARFS
 implementation, that could create a backlog of workitems that grinds the
 system to a halt.  To prevent this, limit the number of workitems that
 may be in flight for a given SFC device to 8 (EFX_RPS_MAX_IN_FLIGHT), and
 return EBUSY from our ndo_rx_flow_steer method if the limit is reached.
Given this limit, also store the workitems in an array of slots within the
 struct efx_nic, rather than dynamically allocating for each request.
The limit should not negatively impact performance, because it is only
 likely to be hit in cases where ARFS will be ineffective anyway.

Signed-off-by: Edward Cree <ecree@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sfc/net_driver.h
drivers/net/ethernet/sfc/rx.c