]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
net: sched: mq: offload a graft notification
authorJakub Kicinski <jakub.kicinski@netronome.com>
Mon, 12 Nov 2018 22:58:14 +0000 (14:58 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 14 Nov 2018 16:51:28 +0000 (08:51 -0800)
Drivers offloading Qdiscs should have reasonable certainty
the offloaded behaviour matches the SW path.  This is impossible
if the driver does not know about all Qdiscs or when Qdiscs move
and are reused.  Send a graft notification from MQ.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: John Hurley <john.hurley@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/pkt_cls.h
net/sched/sch_mq.c

index 01f2802b7aeedf748b0e3ef6a624dc5f60581353..5d31820b7e805618a464e24e1486ce4385f13145 100644 (file)
@@ -821,12 +821,21 @@ enum tc_mq_command {
        TC_MQ_CREATE,
        TC_MQ_DESTROY,
        TC_MQ_STATS,
+       TC_MQ_GRAFT,
+};
+
+struct tc_mq_opt_offload_graft_params {
+       unsigned long queue;
+       u32 child_handle;
 };
 
 struct tc_mq_qopt_offload {
        enum tc_mq_command command;
        u32 handle;
-       struct tc_qopt_offload_stats stats;
+       union {
+               struct tc_qopt_offload_stats stats;
+               struct tc_mq_opt_offload_graft_params graft_params;
+       };
 };
 
 enum tc_red_command {
index 1db5c1bf6ddd3a8e65875c7bb4f5591edadec0a9..203659bc3906419f6a00edca96561efb503d608d 100644 (file)
@@ -193,6 +193,7 @@ static int mq_graft(struct Qdisc *sch, unsigned long cl, struct Qdisc *new,
                    struct Qdisc **old, struct netlink_ext_ack *extack)
 {
        struct netdev_queue *dev_queue = mq_queue_get(sch, cl);
+       struct tc_mq_qopt_offload graft_offload;
        struct net_device *dev = qdisc_dev(sch);
 
        if (dev->flags & IFF_UP)
@@ -203,6 +204,14 @@ static int mq_graft(struct Qdisc *sch, unsigned long cl, struct Qdisc *new,
                new->flags |= TCQ_F_ONETXQUEUE | TCQ_F_NOPARENT;
        if (dev->flags & IFF_UP)
                dev_activate(dev);
+
+       graft_offload.handle = sch->handle;
+       graft_offload.graft_params.queue = cl - 1;
+       graft_offload.graft_params.child_handle = new ? new->handle : 0;
+       graft_offload.command = TC_MQ_GRAFT;
+
+       qdisc_offload_graft_helper(qdisc_dev(sch), sch, new, *old,
+                                  TC_SETUP_QDISC_MQ, &graft_offload, extack);
        return 0;
 }