Re: [net-next PATCH 3/7] net: sched: add cls_u32 offload hooks for netdevs
On 2/4/2016 5:18 AM, Amir Vadai" wrote: > On Wed, Feb 03, 2016 at 01:28:37AM -0800, John Fastabend wrote: >> This patch allows netdev drivers to consume cls_u32 offloads via >> the ndo_setup_tc ndo op. >> >> This works aligns with how network drivers have been doing qdisc >> offloads for mqprio. >> >> Signed-off-by: John Fastabend>> --- [...] >> +enum { >> +TC_CLSU32_NEW_KNODE, > TC_CLSU32_NEW_KNODE is never used aha yep that snuck in there. In a follow up patch for the fm10k devices where we can support hash tables (e.g. divisor > 1) I use it. Although on closer inspection I need to check that the divisor == 1 on ixgbe or else abort because we can get out of sync if software expects hash tables here. Thanks, nice catch. > > [...] >
Re: [net-next PATCH 3/7] net: sched: add cls_u32 offload hooks for netdevs
On Wed, Feb 03, 2016 at 01:28:37AM -0800, John Fastabend wrote: > This patch allows netdev drivers to consume cls_u32 offloads via > the ndo_setup_tc ndo op. > > This works aligns with how network drivers have been doing qdisc > offloads for mqprio. > > Signed-off-by: John Fastabend> --- > include/linux/netdevice.h |6 +++- > include/net/pkt_cls.h | 33 > net/sched/cls_u32.c | 73 > - > 3 files changed, 109 insertions(+), 3 deletions(-) > > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index 9090ff7..861ce67 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -778,17 +778,21 @@ static inline bool netdev_phys_item_id_same(struct > netdev_phys_item_id *a, > typedef u16 (*select_queue_fallback_t)(struct net_device *dev, > struct sk_buff *skb); > > -/* This structure holds attributes of qdisc and classifiers > +/* These structures hold the attributes of qdisc and classifiers > * that are being passed to the netdevice through the setup_tc op. > */ > enum { > TC_SETUP_MQPRIO, > + TC_SETUP_CLSU32, > }; > > +struct tc_cls_u32_offload; > + > struct tc_to_netdev { > unsigned int type; > union { > u8 tc; > + struct tc_cls_u32_offload *cls_u32; > }; > }; > > diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h > index bc49967..0bd12cd 100644 > --- a/include/net/pkt_cls.h > +++ b/include/net/pkt_cls.h > @@ -358,4 +358,37 @@ tcf_match_indev(struct sk_buff *skb, int ifindex) > } > #endif /* CONFIG_NET_CLS_IND */ > > +struct tc_cls_u32_knode { > + struct tcf_exts *exts; > + u8 fshift; > + u32 handle; > + u32 val; > + u32 mask; > + u32 link_handle; > + struct tc_u32_sel *sel; > +}; > + > +struct tc_cls_u32_hnode { > + u32 handle; > + u32 prio; > + unsigned int divisor; > +}; > + > +enum { > + TC_CLSU32_NEW_KNODE, TC_CLSU32_NEW_KNODE is never used [...]
[net-next PATCH 3/7] net: sched: add cls_u32 offload hooks for netdevs
This patch allows netdev drivers to consume cls_u32 offloads via the ndo_setup_tc ndo op. This works aligns with how network drivers have been doing qdisc offloads for mqprio. Signed-off-by: John Fastabend--- include/linux/netdevice.h |6 +++- include/net/pkt_cls.h | 33 net/sched/cls_u32.c | 73 - 3 files changed, 109 insertions(+), 3 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 9090ff7..861ce67 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -778,17 +778,21 @@ static inline bool netdev_phys_item_id_same(struct netdev_phys_item_id *a, typedef u16 (*select_queue_fallback_t)(struct net_device *dev, struct sk_buff *skb); -/* This structure holds attributes of qdisc and classifiers +/* These structures hold the attributes of qdisc and classifiers * that are being passed to the netdevice through the setup_tc op. */ enum { TC_SETUP_MQPRIO, + TC_SETUP_CLSU32, }; +struct tc_cls_u32_offload; + struct tc_to_netdev { unsigned int type; union { u8 tc; + struct tc_cls_u32_offload *cls_u32; }; }; diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index bc49967..0bd12cd 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -358,4 +358,37 @@ tcf_match_indev(struct sk_buff *skb, int ifindex) } #endif /* CONFIG_NET_CLS_IND */ +struct tc_cls_u32_knode { + struct tcf_exts *exts; + u8 fshift; + u32 handle; + u32 val; + u32 mask; + u32 link_handle; + struct tc_u32_sel *sel; +}; + +struct tc_cls_u32_hnode { + u32 handle; + u32 prio; + unsigned int divisor; +}; + +enum { + TC_CLSU32_NEW_KNODE, + TC_CLSU32_REPLACE_KNODE, + TC_CLSU32_DELETE_KNODE, + TC_CLSU32_NEW_HNODE, + TC_CLSU32_REPLACE_HNODE, +}; + +struct tc_cls_u32_offload { + /* knode values */ + int command; + union { + struct tc_cls_u32_knode knode; + struct tc_cls_u32_hnode hnode; + }; +}; + #endif diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 4fbb674..dfaaf29 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c @@ -43,6 +43,7 @@ #include #include #include +#include struct tc_u_knode { struct tc_u_knode __rcu *next; @@ -424,6 +425,68 @@ static int u32_delete_key(struct tcf_proto *tp, struct tc_u_knode *key) return 0; } +static void u32_remove_hw_knode(struct tcf_proto *tp, u32 handle) +{ + struct net_device *dev = tp->q->dev_queue->dev; + struct tc_cls_u32_offload u32_offload = {0}; + struct tc_to_netdev offload; + + offload.type = TC_SETUP_CLSU32; + offload.cls_u32 = _offload; + + if (dev->netdev_ops->ndo_setup_tc) { + offload.cls_u32->command = TC_CLSU32_DELETE_KNODE; + offload.cls_u32->knode.handle = handle; + dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, + tp->protocol, ); + } +} + +static void u32_replace_hw_hnode(struct tcf_proto *tp, struct tc_u_hnode *h) +{ + struct net_device *dev = tp->q->dev_queue->dev; + struct tc_cls_u32_offload u32_offload = {0}; + struct tc_to_netdev offload; + + offload.type = TC_SETUP_CLSU32; + offload.cls_u32 = _offload; + + if (dev->netdev_ops->ndo_setup_tc) { + offload.cls_u32->command = TC_CLSU32_NEW_HNODE; + offload.cls_u32->hnode.divisor = h->divisor; + offload.cls_u32->hnode.handle = h->handle; + offload.cls_u32->hnode.prio = h->prio; + + dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, + tp->protocol, ); + } +} + +static void u32_replace_hw_knode(struct tcf_proto *tp, struct tc_u_knode *n) +{ + struct net_device *dev = tp->q->dev_queue->dev; + struct tc_cls_u32_offload u32_offload = {0}; + struct tc_to_netdev offload; + + offload.type = TC_SETUP_CLSU32; + offload.cls_u32 = _offload; + + if (dev->netdev_ops->ndo_setup_tc) { + offload.cls_u32->command = TC_CLSU32_REPLACE_KNODE; + offload.cls_u32->knode.handle = n->handle; + offload.cls_u32->knode.fshift = n->fshift; + offload.cls_u32->knode.val = n->val; + offload.cls_u32->knode.mask = n->mask; + offload.cls_u32->knode.sel = >sel; + offload.cls_u32->knode.exts = >exts; + if (n->ht_down) + offload.cls_u32->knode.link_handle = n->ht_down->handle; + + dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, + tp->protocol, ); + } +} + static void
Re: [net-next PATCH 3/7] net: sched: add cls_u32 offload hooks for netdevs
Hi John, [auto build test ERROR on net-next/master] url: https://github.com/0day-ci/linux/commits/John-Fastabend/tc-offload-for-cls_u32-on-ixgbe/20160203-173342 config: i386-randconfig-x009-02010231 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=i386 All errors (new ones prefixed by >>): net/sched/cls_u32.c: In function 'u32_replace_hw_knode': >> net/sched/cls_u32.c:478:33: error: 'struct tc_u_knode' has no member named >> 'val' offload.cls_u32->knode.val = n->val; ^ >> net/sched/cls_u32.c:479:34: error: 'struct tc_u_knode' has no member named >> 'mask' offload.cls_u32->knode.mask = n->mask; ^ vim +478 net/sched/cls_u32.c 472 offload.cls_u32 = _offload; 473 474 if (dev->netdev_ops->ndo_setup_tc) { 475 offload.cls_u32->command = TC_CLSU32_REPLACE_KNODE; 476 offload.cls_u32->knode.handle = n->handle; 477 offload.cls_u32->knode.fshift = n->fshift; > 478 offload.cls_u32->knode.val = n->val; > 479 offload.cls_u32->knode.mask = n->mask; 480 offload.cls_u32->knode.sel = >sel; 481 offload.cls_u32->knode.exts = >exts; 482 if (n->ht_down) --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: Binary data