* [PATCH net-next] rocker: Explicitly mark learned FDB entries as offloaded @ 2022-10-31 7:59 Ido Schimmel 2022-10-31 8:32 ` Ido Schimmel 0 siblings, 1 reply; 4+ messages in thread From: Ido Schimmel @ 2022-10-31 7:59 UTC (permalink / raw) To: netdev Cc: davem, kuba, pabeni, edumazet, jiri, vladimir.oltean, netdev, mlxsw, Ido Schimmel Currently, FDB entries that are notified to the bridge driver via 'SWITCHDEV_FDB_ADD_TO_BRIDGE' are always marked as offloaded by the bridge. With MAB enabled, this will no longer be universally true. Device drivers will report locked FDB entries to the bridge to let it know that the corresponding hosts required authorization, but it does not mean that these entries are necessarily programmed in the underlying hardware. We would like to solve it by having the bridge driver determine the offload indication based of the 'offloaded' bit in the FDB notification [1]. Prepare for that change by having rocker explicitly mark learned FDB entries as offloaded. This is consistent with all the other switchdev drivers. [1] https://lore.kernel.org/netdev/20221025100024.1287157-4-idosch@nvidia.com/ Signed-off-by: Ido Schimmel <idosch@nvidia.com> --- drivers/net/ethernet/rocker/rocker_ofdpa.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c index 58cf7cc54f40..f5880d0053da 100644 --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c @@ -1828,12 +1828,14 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work) info.vid = lw->vid; rtnl_lock(); - if (learned && removing) + if (learned && removing) { call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, lw->ofdpa_port->dev, &info.info, NULL); - else if (learned && !removing) + } else if (learned && !removing) { + info.offloaded = true; call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, lw->ofdpa_port->dev, &info.info, NULL); + } rtnl_unlock(); kfree(work); -- 2.37.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH net-next] rocker: Explicitly mark learned FDB entries as offloaded 2022-10-31 7:59 [PATCH net-next] rocker: Explicitly mark learned FDB entries as offloaded Ido Schimmel @ 2022-10-31 8:32 ` Ido Schimmel 2022-10-31 9:08 ` Vladimir Oltean 0 siblings, 1 reply; 4+ messages in thread From: Ido Schimmel @ 2022-10-31 8:32 UTC (permalink / raw) To: netdev; +Cc: davem, kuba, pabeni, edumazet, jiri, vladimir.oltean, netdev, mlxsw On Mon, Oct 31, 2022 at 09:59:22AM +0200, Ido Schimmel wrote: > diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c > index 58cf7cc54f40..f5880d0053da 100644 > --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c > +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c > @@ -1828,12 +1828,14 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work) > info.vid = lw->vid; > > rtnl_lock(); > - if (learned && removing) > + if (learned && removing) { > call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, > lw->ofdpa_port->dev, &info.info, NULL); > - else if (learned && !removing) > + } else if (learned && !removing) { > + info.offloaded = true; > call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, > lw->ofdpa_port->dev, &info.info, NULL); > + } > rtnl_unlock(); > > kfree(work); Looking at it again, this is better: diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c index 58cf7cc54f40..4d17ae18ea61 100644 --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c @@ -1826,6 +1826,7 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work) info.addr = lw->addr; info.vid = lw->vid; + info.offloaded = learned && !removing; rtnl_lock(); if (learned && removing) Will send another version tomorrow assuming no other comments. ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH net-next] rocker: Explicitly mark learned FDB entries as offloaded 2022-10-31 8:32 ` Ido Schimmel @ 2022-10-31 9:08 ` Vladimir Oltean 2022-10-31 11:53 ` Ido Schimmel 0 siblings, 1 reply; 4+ messages in thread From: Vladimir Oltean @ 2022-10-31 9:08 UTC (permalink / raw) To: Ido Schimmel Cc: netdev@vger.kernel.org, davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, jiri@resnulli.us, netdev@kapio-technology.com, mlxsw@nvidia.com On Mon, Oct 31, 2022 at 10:32:04AM +0200, Ido Schimmel wrote: > On Mon, Oct 31, 2022 at 09:59:22AM +0200, Ido Schimmel wrote: > > diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c > > index 58cf7cc54f40..f5880d0053da 100644 > > --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c > > +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c > > @@ -1828,12 +1828,14 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work) > > info.vid = lw->vid; > > > > rtnl_lock(); > > - if (learned && removing) > > + if (learned && removing) { > > call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, > > lw->ofdpa_port->dev, &info.info, NULL); > > - else if (learned && !removing) > > + } else if (learned && !removing) { > > + info.offloaded = true; > > call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, > > lw->ofdpa_port->dev, &info.info, NULL); > > + } > > rtnl_unlock(); > > > > kfree(work); > > Looking at it again, this is better: > > diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c > index 58cf7cc54f40..4d17ae18ea61 100644 > --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c > +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c > @@ -1826,6 +1826,7 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work) > > info.addr = lw->addr; > info.vid = lw->vid; > + info.offloaded = learned && !removing; > > rtnl_lock(); > if (learned && removing) > > Will send another version tomorrow assuming no other comments. It may also be an opportunity to not take rtnl_lock() if (!learned), and this will in turn simplify the condition to just "info.offloaded = !removing"? Actually this elimination of useless work should be done at the level of ofdpa_port_fdb_learn(), if "flags" does not contain OFDPA_OP_FLAG_LEARNED. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net-next] rocker: Explicitly mark learned FDB entries as offloaded 2022-10-31 9:08 ` Vladimir Oltean @ 2022-10-31 11:53 ` Ido Schimmel 0 siblings, 0 replies; 4+ messages in thread From: Ido Schimmel @ 2022-10-31 11:53 UTC (permalink / raw) To: Vladimir Oltean Cc: netdev@vger.kernel.org, davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, jiri@resnulli.us, netdev@kapio-technology.com, mlxsw@nvidia.com On Mon, Oct 31, 2022 at 09:08:23AM +0000, Vladimir Oltean wrote: > On Mon, Oct 31, 2022 at 10:32:04AM +0200, Ido Schimmel wrote: > > On Mon, Oct 31, 2022 at 09:59:22AM +0200, Ido Schimmel wrote: > > > diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c > > > index 58cf7cc54f40..f5880d0053da 100644 > > > --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c > > > +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c > > > @@ -1828,12 +1828,14 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work) > > > info.vid = lw->vid; > > > > > > rtnl_lock(); > > > - if (learned && removing) > > > + if (learned && removing) { > > > call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, > > > lw->ofdpa_port->dev, &info.info, NULL); > > > - else if (learned && !removing) > > > + } else if (learned && !removing) { > > > + info.offloaded = true; > > > call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, > > > lw->ofdpa_port->dev, &info.info, NULL); > > > + } > > > rtnl_unlock(); > > > > > > kfree(work); > > > > Looking at it again, this is better: > > > > diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c > > index 58cf7cc54f40..4d17ae18ea61 100644 > > --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c > > +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c > > @@ -1826,6 +1826,7 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work) > > > > info.addr = lw->addr; > > info.vid = lw->vid; > > + info.offloaded = learned && !removing; > > > > rtnl_lock(); > > if (learned && removing) > > > > Will send another version tomorrow assuming no other comments. > > It may also be an opportunity to not take rtnl_lock() if (!learned), and > this will in turn simplify the condition to just "info.offloaded = !removing"? > > Actually this elimination of useless work should be done at the level of > ofdpa_port_fdb_learn(), if "flags" does not contain OFDPA_OP_FLAG_LEARNED. OK, I have this as the first patch: diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c index 58cf7cc54f40..77ad09ad8304 100644 --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c @@ -1821,19 +1821,16 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work) const struct ofdpa_fdb_learn_work *lw = container_of(work, struct ofdpa_fdb_learn_work, work); bool removing = (lw->flags & OFDPA_OP_FLAG_REMOVE); - bool learned = (lw->flags & OFDPA_OP_FLAG_LEARNED); struct switchdev_notifier_fdb_info info = {}; + enum switchdev_notifier_type event; info.addr = lw->addr; info.vid = lw->vid; + event = removing ? SWITCHDEV_FDB_DEL_TO_BRIDGE : + SWITCHDEV_FDB_ADD_TO_BRIDGE; rtnl_lock(); - if (learned && removing) - call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, - lw->ofdpa_port->dev, &info.info, NULL); - else if (learned && !removing) - call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, - lw->ofdpa_port->dev, &info.info, NULL); + call_switchdev_notifiers(event, lw->ofdpa_port->dev, &info.info, NULL); rtnl_unlock(); kfree(work); @@ -1865,6 +1862,9 @@ static int ofdpa_port_fdb_learn(struct ofdpa_port *ofdpa_port, if (!ofdpa_port_is_bridged(ofdpa_port)) return 0; + if (!(flags & OFDPA_OP_FLAG_LEARNED)) + return 0; + lw = kzalloc(sizeof(*lw), GFP_ATOMIC); if (!lw) return -ENOMEM; ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-10-31 11:54 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-10-31 7:59 [PATCH net-next] rocker: Explicitly mark learned FDB entries as offloaded Ido Schimmel 2022-10-31 8:32 ` Ido Schimmel 2022-10-31 9:08 ` Vladimir Oltean 2022-10-31 11:53 ` Ido Schimmel
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).