Skip to content

Commit 21b52fe

Browse files
vladimirolteandavem330
authored andcommitted
net: dsa: sja1105: fix broken backpressure in .port_fdb_dump
rtnl_fdb_dump() has logic to split a dump of PF_BRIDGE neighbors into multiple netlink skbs if the buffer provided by user space is too small (one buffer will typically handle a few hundred FDB entries). When the current buffer becomes full, nlmsg_put() in dsa_slave_port_fdb_do_dump() returns -EMSGSIZE and DSA saves the index of the last dumped FDB entry, returns to rtnl_fdb_dump() up to that point, and then the dump resumes on the same port with a new skb, and FDB entries up to the saved index are simply skipped. Since dsa_slave_port_fdb_do_dump() is pointed to by the "cb" passed to drivers, then drivers must check for the -EMSGSIZE error code returned by it. Otherwise, when a netlink skb becomes full, DSA will no longer save newly dumped FDB entries to it, but the driver will continue dumping. So FDB entries will be missing from the dump. Fix the broken backpressure by propagating the "cb" return code and allow rtnl_fdb_dump() to restart the FDB dump with a new skb. Fixes: 291d1e7 ("net: dsa: sja1105: Add support for FDB and MDB management") Signed-off-by: Vladimir Oltean <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 871a73a commit 21b52fe

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

drivers/net/dsa/sja1105/sja1105_main.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1635,7 +1635,9 @@ static int sja1105_fdb_dump(struct dsa_switch *ds, int port,
16351635
/* We need to hide the dsa_8021q VLANs from the user. */
16361636
if (priv->vlan_state == SJA1105_VLAN_UNAWARE)
16371637
l2_lookup.vlanid = 0;
1638-
cb(macaddr, l2_lookup.vlanid, l2_lookup.lockeds, data);
1638+
rc = cb(macaddr, l2_lookup.vlanid, l2_lookup.lockeds, data);
1639+
if (rc)
1640+
return rc;
16391641
}
16401642
return 0;
16411643
}

0 commit comments

Comments
 (0)