|
@@ -16,6 +16,7 @@
|
|
|
#include <linux/errno.h>
|
|
|
#include <linux/skbuff.h>
|
|
|
#include <net/netlink.h>
|
|
|
+#include <net/pkt_cls.h>
|
|
|
#include <net/pkt_sched.h>
|
|
|
#include <net/sch_generic.h>
|
|
|
|
|
@@ -23,12 +24,28 @@ struct mq_sched {
|
|
|
struct Qdisc **qdiscs;
|
|
|
};
|
|
|
|
|
|
+static int mq_offload(struct Qdisc *sch, enum tc_mq_command cmd)
|
|
|
+{
|
|
|
+ struct net_device *dev = qdisc_dev(sch);
|
|
|
+ struct tc_mq_qopt_offload opt = {
|
|
|
+ .command = cmd,
|
|
|
+ .handle = sch->handle,
|
|
|
+ };
|
|
|
+
|
|
|
+ if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_MQ, &opt);
|
|
|
+}
|
|
|
+
|
|
|
static void mq_destroy(struct Qdisc *sch)
|
|
|
{
|
|
|
struct net_device *dev = qdisc_dev(sch);
|
|
|
struct mq_sched *priv = qdisc_priv(sch);
|
|
|
unsigned int ntx;
|
|
|
|
|
|
+ mq_offload(sch, TC_MQ_DESTROY);
|
|
|
+
|
|
|
if (!priv->qdiscs)
|
|
|
return;
|
|
|
for (ntx = 0; ntx < dev->num_tx_queues && priv->qdiscs[ntx]; ntx++)
|
|
@@ -70,6 +87,8 @@ static int mq_init(struct Qdisc *sch, struct nlattr *opt,
|
|
|
}
|
|
|
|
|
|
sch->flags |= TCQ_F_MQROOT;
|
|
|
+
|
|
|
+ mq_offload(sch, TC_MQ_CREATE);
|
|
|
return 0;
|
|
|
}
|
|
|
|