Tobias Waldekranz
2021-May-04 14:44 UTC
[Bridge] [RFC net-next 6/9] net: dsa: Forward offloading
On Tue, Apr 27, 2021 at 13:17, Vladimir Oltean <olteanv at gmail.com> wrote:> On Mon, Apr 26, 2021 at 07:04:08PM +0200, Tobias Waldekranz wrote: >> Allow DSA drivers to support forward offloading from a bridge by: >> >> - Passing calls to .ndo_dfwd_{add,del}_station to the drivers. >> >> - Recording the subordinate device of offloaded skbs in the control >> buffer so that the tagger can take the appropriate action. >> >> Signed-off-by: Tobias Waldekranz <tobias at waldekranz.com> >> --- >> include/net/dsa.h | 7 +++++++ >> net/dsa/slave.c | 36 ++++++++++++++++++++++++++++++++++-- >> 2 files changed, 41 insertions(+), 2 deletions(-) >> >> diff --git a/include/net/dsa.h b/include/net/dsa.h >> index 1f9ba9889034..77d4df819299 100644 >> --- a/include/net/dsa.h >> +++ b/include/net/dsa.h >> @@ -119,6 +119,7 @@ struct dsa_netdevice_ops { >> >> struct dsa_skb_cb { >> struct sk_buff *clone; >> + struct net_device *sb_dev; >> }; >> >> struct __dsa_skb_cb { >> @@ -828,6 +829,12 @@ struct dsa_switch_ops { >> const struct switchdev_obj_ring_role_mrp *mrp); >> int (*port_mrp_del_ring_role)(struct dsa_switch *ds, int port, >> const struct switchdev_obj_ring_role_mrp *mrp); >> + >> + /* L2 forward offloading */ >> + void * (*dfwd_add_station)(struct dsa_switch *ds, int port, >> + struct net_device *sb_dev); >> + void (*dfwd_del_station)(struct dsa_switch *ds, int port, >> + struct net_device *sb_dev); >> }; >> >> #define DSA_DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes) \ >> diff --git a/net/dsa/slave.c b/net/dsa/slave.c >> index 77b33bd161b8..3689ffa2dbb8 100644 >> --- a/net/dsa/slave.c >> +++ b/net/dsa/slave.c >> @@ -657,6 +657,13 @@ static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev) >> return dsa_enqueue_skb(nskb, dev); >> } >> >> +static u16 dsa_slave_select_queue(struct net_device *dev, struct sk_buff *skb, >> + struct net_device *sb_dev) >> +{ >> + DSA_SKB_CB(skb)->sb_dev = sb_dev; >> + return netdev_pick_tx(dev, skb, sb_dev); >> +} >> + > > DSA_SKB_CB is going away: > https://patchwork.kernel.org/project/netdevbpf/patch/20210427042203.26258-5-yangbo.lu at nxp.com/ > > Let's either negotiate with Yangbo on keeping it, or make > .ndo_select_queue a bypass towards the tagger, where it can use its own > SKB_CB structure and be more flexible in general (I think I'm leaning > towards the latter).Thus far, Yangbo is a tough negotiator, giving me the silent treatment: https://lore.kernel.org/netdev/87y2d2noe5.fsf at waldekranz.com/ :) That memset is giving me a hard time. I have just disabled it on my branch at the moment. Any ideas on how to get rid of it without breaking timestamping?
Vladimir Oltean
2021-May-04 15:21 UTC
[Bridge] [RFC net-next 6/9] net: dsa: Forward offloading
On Tue, May 04, 2021 at 04:44:31PM +0200, Tobias Waldekranz wrote:> On Tue, Apr 27, 2021 at 13:17, Vladimir Oltean <olteanv at gmail.com> wrote: > > On Mon, Apr 26, 2021 at 07:04:08PM +0200, Tobias Waldekranz wrote: > >> Allow DSA drivers to support forward offloading from a bridge by: > >> > >> - Passing calls to .ndo_dfwd_{add,del}_station to the drivers. > >> > >> - Recording the subordinate device of offloaded skbs in the control > >> buffer so that the tagger can take the appropriate action. > >> > >> Signed-off-by: Tobias Waldekranz <tobias at waldekranz.com> > >> --- > >> include/net/dsa.h | 7 +++++++ > >> net/dsa/slave.c | 36 ++++++++++++++++++++++++++++++++++-- > >> 2 files changed, 41 insertions(+), 2 deletions(-) > >> > >> diff --git a/include/net/dsa.h b/include/net/dsa.h > >> index 1f9ba9889034..77d4df819299 100644 > >> --- a/include/net/dsa.h > >> +++ b/include/net/dsa.h > >> @@ -119,6 +119,7 @@ struct dsa_netdevice_ops { > >> > >> struct dsa_skb_cb { > >> struct sk_buff *clone; > >> + struct net_device *sb_dev; > >> }; > >> > >> struct __dsa_skb_cb { > >> @@ -828,6 +829,12 @@ struct dsa_switch_ops { > >> const struct switchdev_obj_ring_role_mrp *mrp); > >> int (*port_mrp_del_ring_role)(struct dsa_switch *ds, int port, > >> const struct switchdev_obj_ring_role_mrp *mrp); > >> + > >> + /* L2 forward offloading */ > >> + void * (*dfwd_add_station)(struct dsa_switch *ds, int port, > >> + struct net_device *sb_dev); > >> + void (*dfwd_del_station)(struct dsa_switch *ds, int port, > >> + struct net_device *sb_dev); > >> }; > >> > >> #define DSA_DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes) \ > >> diff --git a/net/dsa/slave.c b/net/dsa/slave.c > >> index 77b33bd161b8..3689ffa2dbb8 100644 > >> --- a/net/dsa/slave.c > >> +++ b/net/dsa/slave.c > >> @@ -657,6 +657,13 @@ static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev) > >> return dsa_enqueue_skb(nskb, dev); > >> } > >> > >> +static u16 dsa_slave_select_queue(struct net_device *dev, struct sk_buff *skb, > >> + struct net_device *sb_dev) > >> +{ > >> + DSA_SKB_CB(skb)->sb_dev = sb_dev; > >> + return netdev_pick_tx(dev, skb, sb_dev); > >> +} > >> + > > > > DSA_SKB_CB is going away: > > https://patchwork.kernel.org/project/netdevbpf/patch/20210427042203.26258-5-yangbo.lu at nxp.com/ > > > > Let's either negotiate with Yangbo on keeping it, or make > > .ndo_select_queue a bypass towards the tagger, where it can use its own > > SKB_CB structure and be more flexible in general (I think I'm leaning > > towards the latter). > > Thus far, Yangbo is a tough negotiator, giving me the silent treatment: > > https://lore.kernel.org/netdev/87y2d2noe5.fsf at waldekranz.com/ > > :) > > That memset is giving me a hard time. I have just disabled it on my > branch at the moment. Any ideas on how to get rid of it without breaking > timestamping?:) Is there any guarantee written somewhere that the ownership of skb->cb belongs to the NIC driver at the time of the ndo_select_queue call? If there is, then the trivial solution is to just move the memset in ndo_select_queue. If there isn't, then we've got bigger issues (such as, for example, the qdisc layer being able to overwrite your DSA_SKB_CB(skb)->sb_dev).