mirror of https://gitee.com/openkylin/linux.git
sfc: return a better error if filter insertion collides with MC reboot
If some other operation gets the MCDI lock ahead of us and performs an MC reboot, then our attempt to insert the filter will fail with EINVAL, because the destination VI (spec->dmaq_id, MC_CMD_FILTER_OP_IN_RX_QUEUE) does not exist. But the caller's request (which might e.g. be an ethtool ntuple request from userland) isn't invalid, it just got unlucky; so return EAGAIN. Signed-off-by: Edward Cree <ecree@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fc7a6c287f
commit
31b8429552
|
@ -4301,6 +4301,7 @@ static s32 efx_ef10_filter_insert(struct efx_nic *efx,
|
||||||
bool replace_equal)
|
bool replace_equal)
|
||||||
{
|
{
|
||||||
DECLARE_BITMAP(mc_rem_map, EFX_EF10_FILTER_SEARCH_LIMIT);
|
DECLARE_BITMAP(mc_rem_map, EFX_EF10_FILTER_SEARCH_LIMIT);
|
||||||
|
struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
||||||
struct efx_ef10_filter_table *table;
|
struct efx_ef10_filter_table *table;
|
||||||
struct efx_filter_spec *saved_spec;
|
struct efx_filter_spec *saved_spec;
|
||||||
struct efx_rss_context *ctx = NULL;
|
struct efx_rss_context *ctx = NULL;
|
||||||
|
@ -4427,6 +4428,12 @@ static s32 efx_ef10_filter_insert(struct efx_nic *efx,
|
||||||
rc = efx_ef10_filter_push(efx, spec, &table->entry[ins_index].handle,
|
rc = efx_ef10_filter_push(efx, spec, &table->entry[ins_index].handle,
|
||||||
ctx, replacing);
|
ctx, replacing);
|
||||||
|
|
||||||
|
if (rc == -EINVAL && nic_data->must_realloc_vis)
|
||||||
|
/* The MC rebooted under us, causing it to reject our filter
|
||||||
|
* insertion as pointing to an invalid VI (spec->dmaq_id).
|
||||||
|
*/
|
||||||
|
rc = -EAGAIN;
|
||||||
|
|
||||||
/* Finalise the software table entry */
|
/* Finalise the software table entry */
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
if (replacing) {
|
if (replacing) {
|
||||||
|
|
Loading…
Reference in New Issue