net/sched: cls_flower: Set the filter Hardware device for all use-cases
authorHadar Hen Zion <hadarh@mellanox.com>
Sun, 4 Dec 2016 13:25:19 +0000 (15:25 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 Dec 2016 20:06:58 +0000 (15:06 -0500)
Check if the returned device from tcf_exts_get_dev function supports tc
offload and in case the rule can't be offloaded, set the filter hw_dev
parameter to the original device given by the user.

The filter hw_device parameter should always be set by fl_hw_replace_filter
function, since this pointer is used by dump stats and destroy
filter for each flower rule (offloaded or not).

Fixes: 7091d8c7055d ('net/sched: cls_flower: Add offload support using egress Hardware device')
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Reported-by: Simon Horman <horms@verge.net.au>
Tested-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/cls_flower.c

index c5cea78491dc782e01430d7ab4acb4cea4186c0b..29a9e6d9f274b3b4f0fe4b6dfa811072682ac70d 100644 (file)
@@ -236,8 +236,11 @@ static int fl_hw_replace_filter(struct tcf_proto *tp,
        int err;
 
        if (!tc_can_offload(dev, tp)) {
-               if (tcf_exts_get_dev(dev, &f->exts, &f->hw_dev))
+               if (tcf_exts_get_dev(dev, &f->exts, &f->hw_dev) ||
+                   (f->hw_dev && !tc_can_offload(f->hw_dev, tp))) {
+                       f->hw_dev = dev;
                        return tc_skip_sw(f->flags) ? -EINVAL : 0;
+               }
                dev = f->hw_dev;
                tc->egress_dev = true;
        } else {