Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp929520pxp; Wed, 16 Mar 2022 21:39:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwPbR09skAohC/KpEphju5uRDP3Y4SzdgnOaeS2miFlxbflcFd/nxSOtL4CDh9WEIO5qo7Q X-Received: by 2002:a17:902:8601:b0:153:95da:fcdd with SMTP id f1-20020a170902860100b0015395dafcddmr2912420plo.104.1647491997999; Wed, 16 Mar 2022 21:39:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647491997; cv=none; d=google.com; s=arc-20160816; b=AaOxQlUODX5P5+OYsnpkbN2OdjFIaDLZ6FPwPho1/ouhzd3c/s3hsvFAMtNFkYDC0U sTibtGNOjQ0HBcOADE2AyZNYT5rNIV2s7qtTqP1jUbAdwXQCx0B6kU0UgNe5xXU3Wn8k qJWtx/EdkZB6N6YPZGFqdsjnYhh5PVP+S8DN0PmfPB0e7dP5gvwxE0GXrikLzP9vJODG U42mdJDeIPKrYK5yw0Ub7ZOUt6JJcvPBLMe+6ZEptoQv9q+Ly/8vswVLy1oYDNmTPKzD JNMOFWaBkUWtME9by7IgCdKIMiErZEZUB/aLhMl6q6bE6TJonRDrCcTd6rFr2n8DTJvI +dfA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:dkim-signature; bh=5y2pdxZ7bC6EtywS/DmFt1BlAK6B4ynNC7TgewTvXeQ=; b=ykipFvsuWDb8cnPLu6yVfNx3QmcA9E4VM4u6csPt1eOXUYLX9FJgVNPFlmCDRdZBqr BkNmoiJ20M1TNJtRc/wU6LSZKcYjBJRfA3V00POAV9M2lMg0d6HipjoeilqnGDvuz5Kc EcGGKAEjlbdyC61v8iRCSnTAOiGOHgPNPtC1M6O6/YjMhSL+FgGYgyQ9m88bHKf5fI0J HjpCoQkTR7VHQkBL34monLSk5QEt24lrIW3ivK4JQayZU7J9aUjkDw3H7nay1BA8GN6s LXHmR2pVf7ONsx7DpGlGgglMvHpSumoQ3eqVFHwP0DwBvtVfukxHHtsuoezXsWNWdWNM Bfhg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@waldekranz-com.20210112.gappssmtp.com header.s=20210112 header.b=X9XrwjgN; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id z5-20020a63d005000000b003816043f0eesi1030221pgf.739.2022.03.16.21.39.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Mar 2022 21:39:57 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@waldekranz-com.20210112.gappssmtp.com header.s=20210112 header.b=X9XrwjgN; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id F34529285F; Wed, 16 Mar 2022 21:04:31 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1354943AbiCPJrO (ORCPT + 99 others); Wed, 16 Mar 2022 05:47:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47490 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232098AbiCPJrN (ORCPT ); Wed, 16 Mar 2022 05:47:13 -0400 Received: from mail-lj1-x235.google.com (mail-lj1-x235.google.com [IPv6:2a00:1450:4864:20::235]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EAAA163BD9 for ; Wed, 16 Mar 2022 02:45:58 -0700 (PDT) Received: by mail-lj1-x235.google.com with SMTP id r22so2357917ljd.4 for ; Wed, 16 Mar 2022 02:45:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=waldekranz-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:in-reply-to:references:date:message-id :mime-version; bh=5y2pdxZ7bC6EtywS/DmFt1BlAK6B4ynNC7TgewTvXeQ=; b=X9XrwjgNaOIIzebAqxnpZbT7DK0bnz/3x0LLPI/MYrKzZjqDubYUX3AViDUoIh0eCM 5d/LI2oR6TsM/1Eis9wAOhYUdOvpZhfuvtwd9ULwCjv+4RMXb1ySAL/GZf2dZDvmdZe5 TmUGGk2fj/ESuIPAID52GS6+ROJHqcCoYqXM5Tnj/gH2VOms3j/A38ONjjqBUHQafq4F Pg6saO8Di3/AkTwANeNeM1jL62CKeJ8NMkIZotFM4g/VUcy7NXoW1W4qlWk8HXVFsP+s p93yicEHSwUQwmdhKfAZBvVib1B6NMCB2IqFR5AetzLpmP7KfFuQ8/iuBSWWt1HOoJWo hpDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references:date :message-id:mime-version; bh=5y2pdxZ7bC6EtywS/DmFt1BlAK6B4ynNC7TgewTvXeQ=; b=fQIEbRxtrlgAZo3e4Ydimi4tR2HB/C7fQH7gzwHahziaM4EoYuLEswB05gBIG4TRaw gAcwcoATvtoynd1ExR77hcI8TVKPK0eCAm+L6uurnitsVX7MwOA0q0Lns6NNPQACc1ff sPqolL9nbIP3fP7u8fKKZf4IuK5znh9C+Jj96dfxLCh7QFmh52IUXesnGHuDO79BFlZr 92piQHZIC7hIOFQZvog8gpZXZAJ/jC9DFAf1o6ldRhtWPDVIEnbc2hzitYZWBbJPCLLP ih3IZ93Tp6+Z+CBUrcK6pNiCb31I1kKIYx8E2tgb0jU3ZwbFSb2xaCqvFy2B37Vkyep4 fkcQ== X-Gm-Message-State: AOAM531r1MW3OKX9WmY7VdGuUSO7XoMDhk7dZcU7bPlSMEXiyn6GmU+N AjJZeFLWzqK7NHt9Pdgu+rmUeg== X-Received: by 2002:a2e:3e17:0:b0:247:ed02:7ec4 with SMTP id l23-20020a2e3e17000000b00247ed027ec4mr19371077lja.76.1647423957127; Wed, 16 Mar 2022 02:45:57 -0700 (PDT) Received: from wkz-x280 (a124.broadband3.quicknet.se. [46.17.184.124]) by smtp.gmail.com with ESMTPSA id h6-20020a2e5306000000b00247e893075asm139349ljb.37.2022.03.16.02.45.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Mar 2022 02:45:56 -0700 (PDT) From: Tobias Waldekranz To: Vladimir Oltean Cc: davem@davemloft.net, kuba@kernel.org, Andrew Lunn , Vivien Didelot , Florian Fainelli , Jiri Pirko , Ivan Vecera , Roopa Prabhu , Nikolay Aleksandrov , Russell King , Petr Machata , Ido Schimmel , Matt Johnston , Cooper Lees , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bridge@lists.linux-foundation.org Subject: Re: [PATCH v4 net-next 12/15] net: dsa: Handle MST state changes In-Reply-To: <20220315164249.sjgi6wbdpgehc6m6@skbuf> References: <20220315002543.190587-1-tobias@waldekranz.com> <20220315002543.190587-13-tobias@waldekranz.com> <20220315164249.sjgi6wbdpgehc6m6@skbuf> Date: Wed, 16 Mar 2022 10:45:55 +0100 Message-ID: <87zglqjkmk.fsf@waldekranz.com> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Mar 15, 2022 at 18:42, Vladimir Oltean wrote: > On Tue, Mar 15, 2022 at 01:25:40AM +0100, Tobias Waldekranz wrote: >> Add the usual trampoline functionality from the generic DSA layer down >> to the drivers for MST state changes. >> >> When a state changes to disabled/blocking/listening, make sure to fast >> age any dynamic entries in the affected VLANs (those controlled by the >> MSTI in question). >> >> Signed-off-by: Tobias Waldekranz >> --- >> include/net/dsa.h | 3 ++ >> net/dsa/dsa_priv.h | 2 ++ >> net/dsa/port.c | 70 +++++++++++++++++++++++++++++++++++++++++++--- >> net/dsa/slave.c | 6 ++++ >> 4 files changed, 77 insertions(+), 4 deletions(-) >> >> diff --git a/include/net/dsa.h b/include/net/dsa.h >> index 1ddaa2cc5842..0f369f2e9a97 100644 >> --- a/include/net/dsa.h >> +++ b/include/net/dsa.h >> @@ -945,7 +945,10 @@ struct dsa_switch_ops { >> struct dsa_bridge bridge); >> void (*port_stp_state_set)(struct dsa_switch *ds, int port, >> u8 state); >> + int (*port_mst_state_set)(struct dsa_switch *ds, int port, >> + const struct switchdev_mst_state *state); >> void (*port_fast_age)(struct dsa_switch *ds, int port); >> + int (*port_vlan_fast_age)(struct dsa_switch *ds, int port, u16 vid); >> int (*port_pre_bridge_flags)(struct dsa_switch *ds, int port, >> struct switchdev_brport_flags flags, >> struct netlink_ext_ack *extack); >> diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h >> index d90b4cf0c9d2..2ae8996cf7c8 100644 >> --- a/net/dsa/dsa_priv.h >> +++ b/net/dsa/dsa_priv.h >> @@ -215,6 +215,8 @@ static inline struct net_device *dsa_master_find_slave(struct net_device *dev, >> void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp, >> const struct dsa_device_ops *tag_ops); >> int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age); >> +int dsa_port_set_mst_state(struct dsa_port *dp, >> + const struct switchdev_mst_state *state); >> int dsa_port_enable_rt(struct dsa_port *dp, struct phy_device *phy); >> int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy); >> void dsa_port_disable_rt(struct dsa_port *dp); >> diff --git a/net/dsa/port.c b/net/dsa/port.c >> index 3ac114f6fc22..a2a817bb77b1 100644 >> --- a/net/dsa/port.c >> +++ b/net/dsa/port.c >> @@ -30,12 +30,11 @@ static int dsa_port_notify(const struct dsa_port *dp, unsigned long e, void *v) >> return dsa_tree_notify(dp->ds->dst, e, v); >> } >> >> -static void dsa_port_notify_bridge_fdb_flush(const struct dsa_port *dp) >> +static void dsa_port_notify_bridge_fdb_flush(const struct dsa_port *dp, u16 vid) >> { >> struct net_device *brport_dev = dsa_port_to_bridge_port(dp); >> struct switchdev_notifier_fdb_info info = { >> - /* flush all VLANs */ >> - .vid = 0, >> + .vid = vid, >> }; >> >> /* When the port becomes standalone it has already left the bridge. >> @@ -57,7 +56,42 @@ static void dsa_port_fast_age(const struct dsa_port *dp) >> >> ds->ops->port_fast_age(ds, dp->index); >> >> - dsa_port_notify_bridge_fdb_flush(dp); >> + /* flush all VLANs */ >> + dsa_port_notify_bridge_fdb_flush(dp, 0); >> +} >> + >> +static int dsa_port_vlan_fast_age(const struct dsa_port *dp, u16 vid) >> +{ >> + struct dsa_switch *ds = dp->ds; >> + int err; >> + >> + if (!ds->ops->port_vlan_fast_age) >> + return -EOPNOTSUPP; >> + >> + err = ds->ops->port_vlan_fast_age(ds, dp->index, vid); >> + >> + if (!err) >> + dsa_port_notify_bridge_fdb_flush(dp, vid); >> + >> + return err; >> +} >> + >> +static int dsa_port_msti_fast_age(const struct dsa_port *dp, u16 msti) >> +{ >> + DECLARE_BITMAP(vids, VLAN_N_VID) = { 0 }; >> + int err, vid; >> + >> + err = br_mst_get_info(dsa_port_bridge_dev_get(dp), msti, vids); >> + if (err) >> + return err; >> + >> + for_each_set_bit(vid, vids, VLAN_N_VID) { >> + err = dsa_port_vlan_fast_age(dp, vid); >> + if (err) >> + return err; >> + } >> + >> + return 0; >> } >> >> static bool dsa_port_can_configure_learning(struct dsa_port *dp) >> @@ -118,6 +152,32 @@ static void dsa_port_set_state_now(struct dsa_port *dp, u8 state, >> pr_err("DSA: failed to set STP state %u (%d)\n", state, err); >> } >> >> +int dsa_port_set_mst_state(struct dsa_port *dp, >> + const struct switchdev_mst_state *state) >> +{ >> + struct dsa_switch *ds = dp->ds; >> + int err; >> + >> + if (!ds->ops->port_mst_state_set) >> + return -EOPNOTSUPP; >> + >> + err = ds->ops->port_mst_state_set(ds, dp->index, state); >> + if (err) >> + return err; >> + >> + if (dp->learning) { >> + switch (state->state) { >> + case BR_STATE_DISABLED: >> + case BR_STATE_BLOCKING: >> + case BR_STATE_LISTENING: > > Is there a requirement in br_mst_set_state() to put the switchdev > notifier at the end instead of at the beginning? Not that I can think of. Moving it. > I'm tempted to ask you to introduce br_mst_get_state(), then assign > old_state = br_mst_get_state(dsa_port_bridge_dev_get(dp), state->msti), > then perform the VLAN fast age only on the appropriate state transitions, > just like the regular fast age. No time like the present! Question though: >> + err = dsa_port_msti_fast_age(dp, state->msti); If _msti_fast_age returns an error here, do we want that to bubble up to the bridge? It seems more important to keep the bridge in sync with the hardware. I.e. the hardware state has already been successfully synced, we just weren't able to flush all VLANs for some reason. We could revert the state I guess, but what if that fails? Should we settle for a log message? >> + break; >> + } >> + } >> + >> + return err; >> +} >> + >> int dsa_port_enable_rt(struct dsa_port *dp, struct phy_device *phy) >> { >> struct dsa_switch *ds = dp->ds; >> @@ -326,6 +386,8 @@ static bool dsa_port_supports_mst(struct dsa_port *dp) >> struct dsa_switch *ds = dp->ds; >> >> return ds->ops->vlan_msti_set && >> + ds->ops->port_mst_state_set && >> + ds->ops->port_vlan_fast_age && >> dsa_port_can_configure_learning(dp); >> } >> >> diff --git a/net/dsa/slave.c b/net/dsa/slave.c >> index 5e986cdeaae5..4300fc76f3af 100644 >> --- a/net/dsa/slave.c >> +++ b/net/dsa/slave.c >> @@ -450,6 +450,12 @@ static int dsa_slave_port_attr_set(struct net_device *dev, const void *ctx, >> >> ret = dsa_port_set_state(dp, attr->u.stp_state, true); >> break; >> + case SWITCHDEV_ATTR_ID_PORT_MST_STATE: >> + if (!dsa_port_offloads_bridge_port(dp, attr->orig_dev)) >> + return -EOPNOTSUPP; >> + >> + ret = dsa_port_set_mst_state(dp, &attr->u.mst_state); >> + break; >> case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING: >> if (!dsa_port_offloads_bridge_dev(dp, attr->orig_dev)) >> return -EOPNOTSUPP; >> -- >> 2.25.1 >>