From: Joseph Huang <joseph.huang.2024@gmail.com>
To: Nikolay Aleksandrov <razor@blackwall.org>,
Joseph Huang <Joseph.Huang@garmin.com>,
netdev@vger.kernel.org
Cc: Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Roopa Prabhu <roopa@nvidia.com>, Simon Horman <horms@kernel.org>,
linux-kernel@vger.kernel.org, bridge@lists.linux.dev
Subject: Re: [Patch net-next 2/3] net: bridge: mcast: Notify on offload flag change
Date: Mon, 31 Mar 2025 16:11:50 -0400 [thread overview]
Message-ID: <5d93f576-1d27-4d3f-8b37-0b2127260cca@gmail.com> (raw)
In-Reply-To: <d9a8d030-7cac-4f5f-b422-1bae7f08c74f@blackwall.org>
On 3/21/2025 4:47 AM, Nikolay Aleksandrov wrote:
>> diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c
>> index 68dccc2ff7b1..5b09cfcdf3f3 100644
>> --- a/net/bridge/br_switchdev.c
>> +++ b/net/bridge/br_switchdev.c
>> @@ -504,20 +504,41 @@ static void br_switchdev_mdb_complete(struct net_device *dev, int err, void *pri
>> struct net_bridge_mdb_entry *mp;
>> struct net_bridge_port *port = data->port;
>> struct net_bridge *br = port->br;
>> + bool offload_changed = false;
>> + bool failed_changed = false;
>> + u8 notify;
>>
>> spin_lock_bh(&br->multicast_lock);
>> mp = br_mdb_ip_get(br, &data->ip);
>> if (!mp)
>> goto out;
>> +
>> + notify = br->multicast_ctx.multicast_mdb_notify_on_flag_change;
>
> let's not waste cycles if there was an error and notify == 0, please keep the original
> code path and avoid walking over the group ports.
But we do want to keep the error flag so that the error shows up in
'bridge mdb show', right? Notify should only affect the real-time
notifications, and not the error status itself.
>
>> +
>> for (pp = &mp->ports; (p = mlock_dereference(*pp, br)) != NULL;
>> pp = &p->next) {
>> if (p->key.port != port)
>> continue;
>>
>> - if (err)
>> + if (err) {
>> + if (!(p->flags & MDB_PG_FLAGS_OFFLOAD_FAILED))
>> + failed_changed = true;
>> p->flags |= MDB_PG_FLAGS_OFFLOAD_FAILED;
>> - else
>> + } else {
>> + if (!(p->flags & MDB_PG_FLAGS_OFFLOAD))
>> + offload_changed = true;
>> p->flags |= MDB_PG_FLAGS_OFFLOAD;
>> + }
>> +
>> + if (notify == MDB_NOTIFY_ON_FLAG_CHANGE_DISABLE ||
>> + (!offload_changed && !failed_changed))
>> + continue;
>> +
>> + if (notify == MDB_NOTIFY_ON_FLAG_CHANGE_FAIL_ONLY &&
>> + !failed_changed)
>> + continue;
>> +
>> + br_mdb_flag_change_notify(br->dev, mp, p);
>
> This looks like a mess.. First you need to manage these flags properly as I wrote in my
> other reply, they must be mutually exclusive and you can do this in a helper. Also
> please read the old flags in the beginning, then check what flags changed, make a mask
> what flags are for notifications (again can come from a helper, it can be generated when
> the option changes so you don't compute it every time) and decide what to do if any of
> those flags changed.
> Note you have to keep proper flags state regardless of the notify option.
>
>> }
>> out:
>> spin_unlock_bh(&br->multicast_lock);
>
How does this look:
--- a/net/bridge/br_switchdev.c
+++ b/net/bridge/br_switchdev.c
@@ -496,6 +496,21 @@ struct br_switchdev_mdb_complete_info {
struct br_ip ip;
};
+static void br_multicast_set_pg_offload_flags(int err,
+ struct
net_bridge_port_group *p)
+{
+ p->flags &= ~(MDB_PG_FLAGS_OFFLOAD | MDB_PG_FLAGS_OFFLOAD_FAILED);
+ p->flags |= (err ? MDB_PG_FLAGS_OFFLOAD_FAILED :
MDB_PG_FLAGS_OFFLOAD);
+}
+
+static bool br_multicast_should_notify(struct net_bridge *br,
+ u8 old_flags, u8 new_flags)
+{
+ return (br_boolopt_get(br,
BR_BOOLOPT_FAILED_OFFLOAD_NOTIFICATION) &&
+ ((old_flags & MDB_PG_FLAGS_OFFLOAD_FAILED) !=
+ (new_flags & MDB_PG_FLAGS_OFFLOAD_FAILED)));
+}
+
static void br_switchdev_mdb_complete(struct net_device *dev, int err,
void *priv)
{
struct br_switchdev_mdb_complete_info *data = priv;
@@ -504,23 +519,25 @@ static void br_switchdev_mdb_complete(struct
net_device *dev, int err, void *pri
struct net_bridge_mdb_entry *mp;
struct net_bridge_port *port = data->port;
struct net_bridge *br = port->br;
-
- if (err)
- goto err;
+ u8 old_flags;
spin_lock_bh(&br->multicast_lock);
mp = br_mdb_ip_get(br, &data->ip);
if (!mp)
goto out;
for (pp = &mp->ports; (p = mlock_dereference(*pp, br)) != NULL;
pp = &p->next) {
if (p->key.port != port)
continue;
- p->flags |= MDB_PG_FLAGS_OFFLOAD;
+
+ old_flags = p->flags;
+ br_multicast_set_pg_offload_flags(err, p);
+ if (br_multicast_should_notify(br, old_flags, p->flags))
+ br_mdb_flag_change_notify(br->dev, mp, p);
}
out:
spin_unlock_bh(&br->multicast_lock);
-err:
kfree(priv);
}
Thanks,
Joseph
next prev parent reply other threads:[~2025-03-31 20:11 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-18 22:42 [Patch net-next 0/3] Add support for mdb offload failure notification Joseph Huang
2025-03-18 22:42 ` [Patch net-next 1/3] net: bridge: mcast: Add offload failed mdb flag Joseph Huang
2025-03-21 8:19 ` Nikolay Aleksandrov
2025-03-26 22:38 ` Joseph Huang
2025-03-27 22:52 ` Nikolay Aleksandrov
2025-03-28 15:53 ` Joseph Huang
2025-03-31 12:51 ` Nikolay Aleksandrov
2025-03-18 22:42 ` [Patch net-next 2/3] net: bridge: mcast: Notify on offload flag change Joseph Huang
2025-03-21 8:47 ` Nikolay Aleksandrov
2025-03-31 20:11 ` Joseph Huang [this message]
2025-04-01 12:49 ` Nikolay Aleksandrov
2025-04-01 13:37 ` Nikolay Aleksandrov
2025-03-18 22:42 ` [Patch net-next 3/3] net: bridge: Add notify on flag change netlink i/f Joseph Huang
2025-03-20 6:17 ` [Patch net-next 0/3] Add support for mdb offload failure notification Nikolay Aleksandrov
2025-03-20 21:14 ` Joseph Huang
2025-03-21 8:47 ` Nikolay Aleksandrov
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:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5d93f576-1d27-4d3f-8b37-0b2127260cca@gmail.com \
--to=joseph.huang.2024@gmail.com \
--cc=Joseph.Huang@garmin.com \
--cc=andrew+netdev@lunn.ch \
--cc=bridge@lists.linux.dev \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=razor@blackwall.org \
--cc=roopa@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®