lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 31 Oct 2022 13:53:44 +0200 From: Ido Schimmel <idosch@...dia.com> To: Vladimir Oltean <vladimir.oltean@....com> Cc: "netdev@...r.kernel.org" <netdev@...r.kernel.org>, "davem@...emloft.net" <davem@...emloft.net>, "kuba@...nel.org" <kuba@...nel.org>, "pabeni@...hat.com" <pabeni@...hat.com>, "edumazet@...gle.com" <edumazet@...gle.com>, "jiri@...nulli.us" <jiri@...nulli.us>, "netdev@...io-technology.com" <netdev@...io-technology.com>, "mlxsw@...dia.com" <mlxsw@...dia.com> Subject: Re: [PATCH net-next] rocker: Explicitly mark learned FDB entries as offloaded 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;
Powered by blists - more mailing lists