mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02:00
eth: nfp: drop the replaced rule from the list when reprogramming fails
nfp_net_fs_add() replaces an existing rule by deleting it from the
hardware, decrementing nn->fs.count and programming the new one. If
nfp_net_fs_add_hw() fails the old entry stays on nn->fs.list - only the
success path reaches list_replace() - so the list is one longer than
nn->fs.count, and it advertises a rule whose hardware entry has already
been torn down.
nn->fs.count is what ETHTOOL_GRXCLSRLCNT reports, so userspace then sizes
its buffer one entry short of what the GRXCLSRLALL walk wants to write.
That used to overwrite one u32 past the allocation; since the walk is
bounded it is a permanent -EMSGSIZE instead, as nothing ever resyncs the
counter.
Fixes: 9eb03bb1c0 ("nfp: add ethtool flow steering callbacks")
Reviewed-by: Joe Damato <joe@dama.to>
Link: https://patch.msgid.link/20260903032611.3000029-4-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
f1986bf87b
commit
108bb2142e
|
|
@ -1703,8 +1703,14 @@ static int nfp_net_fs_add(struct nfp_net *nn, struct ethtool_rxnfc *cmd)
|
|||
|
||||
nn->fs.count--;
|
||||
err = nfp_net_fs_add_hw(nn, new);
|
||||
if (err)
|
||||
if (err) {
|
||||
/* mbox broken, adding the old rule back will
|
||||
* likely also fail.
|
||||
*/
|
||||
list_del(&entry->node);
|
||||
kfree(entry);
|
||||
goto err;
|
||||
}
|
||||
|
||||
nn->fs.count++;
|
||||
list_replace(&entry->node, &new->node);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user