Re: [net-next PATCH 3/7] net: sched: add cls_u32 offload hooks for netdevs

2016-02-09 Thread Fastabend, John R
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

2016-02-04 Thread Amir Vadai"
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

2016-02-03 Thread John Fastabend
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

2016-02-03 Thread kbuild test robot
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