+Petr On Thu, Jan 07, 2021 at 01:17:20AM +0200, Vladimir Oltean wrote: > static int mlxsw_sp_port_obj_add(struct net_device *dev, > const struct switchdev_obj *obj, > - struct switchdev_trans *trans, > struct netlink_ext_ack *extack) > { > struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev); > const struct switchdev_obj_port_vlan *vlan; > + struct switchdev_trans trans; > int err = 0; > > switch (obj->id) { > case SWITCHDEV_OBJ_ID_PORT_VLAN: > vlan = SWITCHDEV_OBJ_PORT_VLAN(obj); > - err = mlxsw_sp_port_vlans_add(mlxsw_sp_port, vlan, trans, > +
Got the regression results. The call to mlxsw_sp_span_respin() should be placed here because it needs to be triggered regardless of the return value of mlxsw_sp_port_vlans_add(). I'm looking into another failure, which might not be related to these patches. I will also have results with a debug kernel tomorrow (takes almost a day to complete). Will let you know. > + trans.ph_prepare = true; > + err = mlxsw_sp_port_vlans_add(mlxsw_sp_port, vlan, &trans, > extack); > + if (err) > + break; > > - if (switchdev_trans_ph_prepare(trans)) { > - /* The event is emitted before the changes are actually > - * applied to the bridge. Therefore schedule the respin > - * call for later, so that the respin logic sees the > - * updated bridge state. > - */ > - mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp); > - } > + /* The event is emitted before the changes are actually > + * applied to the bridge. Therefore schedule the respin > + * call for later, so that the respin logic sees the > + * updated bridge state. > + */ > + mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp); > + > + trans.ph_prepare = false; > + err = mlxsw_sp_port_vlans_add(mlxsw_sp_port, vlan, &trans, > + extack); > break; > case SWITCHDEV_OBJ_ID_PORT_MDB: > err = mlxsw_sp_port_mdb_add(mlxsw_sp_port, > - SWITCHDEV_OBJ_PORT_MDB(obj), > - trans); > + SWITCHDEV_OBJ_PORT_MDB(obj)); > break; > default: > err = -EOPNOTSUPP;