Netdev Archive on
help / color / mirror / Atom feed
From: Vladimir Oltean <>
To:, Jakub Kicinski <>,
	"David S. Miller" <>
Cc: Florian Fainelli <>,
	Andrew Lunn <>,
	Vivien Didelot <>,
	Vladimir Oltean <>,
	Kurt Kanzenbach <>,
	Hauke Mehrtens <>,
	Egil Hjelmeland <>
Subject: [PATCH net 1/4] net: dsa: hellcreek: fix broken backpressure in .port_fdb_dump
Date: Tue, 10 Aug 2021 14:19:53 +0300	[thread overview]
Message-ID: <> (raw)
In-Reply-To: <>

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: e4b27ebc780f ("net: dsa: Add DSA driver for Hirschmann Hellcreek switches")
Signed-off-by: Vladimir Oltean <>
 drivers/net/dsa/hirschmann/hellcreek.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/dsa/hirschmann/hellcreek.c b/drivers/net/dsa/hirschmann/hellcreek.c
index 9fdcc4bde480..5c54ae1be62c 100644
--- a/drivers/net/dsa/hirschmann/hellcreek.c
+++ b/drivers/net/dsa/hirschmann/hellcreek.c
@@ -912,6 +912,7 @@ static int hellcreek_fdb_dump(struct dsa_switch *ds, int port,
 	struct hellcreek *hellcreek = ds->priv;
 	u16 entries;
+	int ret = 0;
 	size_t i;
@@ -943,12 +944,14 @@ static int hellcreek_fdb_dump(struct dsa_switch *ds, int port,
 		if (!(entry.portmask & BIT(port)))
-		cb(entry.mac, 0, entry.is_static, data);
+		ret = cb(entry.mac, 0, entry.is_static, data);
+		if (ret)
+			break;
-	return 0;
+	return ret;
 static int hellcreek_vlan_filtering(struct dsa_switch *ds, int port,

  reply	other threads:[~2021-08-10 11:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-10 11:19 [PATCH net 0/4] Fix broken backpressure during FDB dump in DSA drivers Vladimir Oltean
2021-08-10 11:19 ` Vladimir Oltean [this message]
2021-08-10 11:39   ` [PATCH net 1/4] net: dsa: hellcreek: fix broken backpressure in .port_fdb_dump Kurt Kanzenbach
2021-08-10 11:19 ` [PATCH net 2/4] net: dsa: lan9303: " Vladimir Oltean
2021-08-10 11:19 ` [PATCH net 3/4] net: dsa: lantiq: " Vladimir Oltean
2021-08-10 11:19 ` [PATCH net 4/4] net: dsa: sja1105: " Vladimir Oltean
2021-08-10 12:20 ` [PATCH net 0/4] Fix broken backpressure during FDB dump in DSA drivers patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \ \ \ \ \ \ \ \ \ \ \ \ \
    --subject='Re: [PATCH net 1/4] net: dsa: hellcreek: fix broken backpressure in .port_fdb_dump' \

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).