net: sched: sch: add extack for change qdisc ops
authorAlexander Aring <aring@mojatatu.com>
Wed, 20 Dec 2017 17:35:14 +0000 (12:35 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 21 Dec 2017 17:32:50 +0000 (12:32 -0500)
This patch adds extack support for change callback for qdisc ops
structtur to prepare per-qdisc specific changes for extack.

Cc: David Ahern <dsahern@gmail.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Alexander Aring <aring@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
19 files changed:
include/net/sch_generic.h
net/sched/sch_api.c
net/sched/sch_cbs.c
net/sched/sch_choke.c
net/sched/sch_codel.c
net/sched/sch_fifo.c
net/sched/sch_fq.c
net/sched/sch_fq_codel.c
net/sched/sch_gred.c
net/sched/sch_hfsc.c
net/sched/sch_hhf.c
net/sched/sch_multiq.c
net/sched/sch_netem.c
net/sched/sch_pie.c
net/sched/sch_plug.c
net/sched/sch_prio.c
net/sched/sch_red.c
net/sched/sch_sfb.c
net/sched/sch_tbf.c

index 4c5faa0ff47dca3365816245f053d561b3339f35..e7a3e206b904bd5268e2346678f00468d1644e9b 100644 (file)
@@ -194,7 +194,8 @@ struct Qdisc_ops {
        void                    (*reset)(struct Qdisc *);
        void                    (*destroy)(struct Qdisc *);
        int                     (*change)(struct Qdisc *sch,
-                                         struct nlattr *arg);
+                                         struct nlattr *arg,
+                                         struct netlink_ext_ack *extack);
        void                    (*attach)(struct Qdisc *sch);
 
        int                     (*dump)(struct Qdisc *, struct sk_buff *);
index 49ee016347d25f75f6330a11b508c349e55a9775..fcc70415fd26cdfa9369ef0d9c560beaa040287c 100644 (file)
@@ -1177,7 +1177,7 @@ static int qdisc_change(struct Qdisc *sch, struct nlattr **tca,
                        NL_SET_ERR_MSG(extack, "Change operation not supported by specified qdisc");
                        return -EINVAL;
                }
-               err = sch->ops->change(sch, tca[TCA_OPTIONS]);
+               err = sch->ops->change(sch, tca[TCA_OPTIONS], extack);
                if (err)
                        return err;
        }
index d77c632a276c6bbef2621372951a96ecf5deef12..8bf6e163d29ceaf3c6fe15a9abeb6da4ba59e440 100644 (file)
@@ -246,7 +246,8 @@ static int cbs_enable_offload(struct net_device *dev, struct cbs_sched_data *q,
        return 0;
 }
 
-static int cbs_change(struct Qdisc *sch, struct nlattr *opt)
+static int cbs_change(struct Qdisc *sch, struct nlattr *opt,
+                     struct netlink_ext_ack *extack)
 {
        struct cbs_sched_data *q = qdisc_priv(sch);
        struct net_device *dev = qdisc_dev(sch);
@@ -307,7 +308,7 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt,
 
        qdisc_watchdog_init(&q->watchdog, sch);
 
-       return cbs_change(sch, opt);
+       return cbs_change(sch, opt, extack);
 }
 
 static void cbs_destroy(struct Qdisc *sch)
index 49dda301e3bbb32dcdcef6eb5cd8f35deb868b2e..eafc0d17d1748cf01f33d206cb46dde6ed81116c 100644 (file)
@@ -344,7 +344,8 @@ static void choke_free(void *addr)
        kvfree(addr);
 }
 
-static int choke_change(struct Qdisc *sch, struct nlattr *opt)
+static int choke_change(struct Qdisc *sch, struct nlattr *opt,
+                       struct netlink_ext_ack *extack)
 {
        struct choke_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_CHOKE_MAX + 1];
@@ -434,7 +435,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt)
 static int choke_init(struct Qdisc *sch, struct nlattr *opt,
                      struct netlink_ext_ack *extack)
 {
-       return choke_change(sch, opt);
+       return choke_change(sch, opt, extack);
 }
 
 static int choke_dump(struct Qdisc *sch, struct sk_buff *skb)
index 7221244e7f3bfcad0c3f9570b1ccf96d8db1c4c5..17cd81f84b5de9d9f53acf2c9078a7618927ddc5 100644 (file)
@@ -130,7 +130,8 @@ static const struct nla_policy codel_policy[TCA_CODEL_MAX + 1] = {
        [TCA_CODEL_CE_THRESHOLD]= { .type = NLA_U32 },
 };
 
-static int codel_change(struct Qdisc *sch, struct nlattr *opt)
+static int codel_change(struct Qdisc *sch, struct nlattr *opt,
+                       struct netlink_ext_ack *extack)
 {
        struct codel_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_CODEL_MAX + 1];
@@ -197,7 +198,7 @@ static int codel_init(struct Qdisc *sch, struct nlattr *opt,
        q->params.mtu = psched_mtu(qdisc_dev(sch));
 
        if (opt) {
-               int err = codel_change(sch, opt);
+               int err = codel_change(sch, opt, extack);
 
                if (err)
                        return err;
index a2d1c9f9b798482b6593910f26aa53684947762e..c65f23c70f401aca38a2ec63ff823203077e629f 100644 (file)
@@ -89,11 +89,6 @@ static int fifo_init(struct Qdisc *sch, struct nlattr *opt,
        return 0;
 }
 
-static int fifo_change(struct Qdisc *sch, struct nlattr *opt)
-{
-       return fifo_init(sch, opt, NULL);
-}
-
 static int fifo_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
        struct tc_fifo_qopt opt = { .limit = sch->limit };
@@ -114,7 +109,7 @@ struct Qdisc_ops pfifo_qdisc_ops __read_mostly = {
        .peek           =       qdisc_peek_head,
        .init           =       fifo_init,
        .reset          =       qdisc_reset_queue,
-       .change         =       fifo_change,
+       .change         =       fifo_init,
        .dump           =       fifo_dump,
        .owner          =       THIS_MODULE,
 };
@@ -128,7 +123,7 @@ struct Qdisc_ops bfifo_qdisc_ops __read_mostly = {
        .peek           =       qdisc_peek_head,
        .init           =       fifo_init,
        .reset          =       qdisc_reset_queue,
-       .change         =       fifo_change,
+       .change         =       fifo_init,
        .dump           =       fifo_dump,
        .owner          =       THIS_MODULE,
 };
@@ -142,7 +137,7 @@ struct Qdisc_ops pfifo_head_drop_qdisc_ops __read_mostly = {
        .peek           =       qdisc_peek_head,
        .init           =       fifo_init,
        .reset          =       qdisc_reset_queue,
-       .change         =       fifo_change,
+       .change         =       fifo_init,
        .dump           =       fifo_dump,
        .owner          =       THIS_MODULE,
 };
@@ -163,7 +158,7 @@ int fifo_set_limit(struct Qdisc *q, unsigned int limit)
                nla->nla_len = nla_attr_size(sizeof(struct tc_fifo_qopt));
                ((struct tc_fifo_qopt *)nla_data(nla))->limit = limit;
 
-               ret = q->ops->change(q, nla);
+               ret = q->ops->change(q, nla, NULL);
                kfree(nla);
        }
        return ret;
index c9f61ffe220ef4e16a9ce7cc961786c025b5ecc4..a366e4c9413ab4fe4dfb16f0255cb7632ade7f1c 100644 (file)
@@ -685,7 +685,8 @@ static const struct nla_policy fq_policy[TCA_FQ_MAX + 1] = {
        [TCA_FQ_LOW_RATE_THRESHOLD]     = { .type = NLA_U32 },
 };
 
-static int fq_change(struct Qdisc *sch, struct nlattr *opt)
+static int fq_change(struct Qdisc *sch, struct nlattr *opt,
+                    struct netlink_ext_ack *extack)
 {
        struct fq_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_FQ_MAX + 1];
@@ -812,7 +813,7 @@ static int fq_init(struct Qdisc *sch, struct nlattr *opt,
        qdisc_watchdog_init(&q->watchdog, sch);
 
        if (opt)
-               err = fq_change(sch, opt);
+               err = fq_change(sch, opt, extack);
        else
                err = fq_resize(sch, q->fq_trees_log);
 
index 5d0b20898ffac2abe5a0f0c73f6e3584ead2d26a..d798c93f7c9669247596014303658c540427667c 100644 (file)
@@ -377,7 +377,8 @@ static const struct nla_policy fq_codel_policy[TCA_FQ_CODEL_MAX + 1] = {
        [TCA_FQ_CODEL_MEMORY_LIMIT] = { .type = NLA_U32 },
 };
 
-static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt)
+static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt,
+                          struct netlink_ext_ack *extack)
 {
        struct fq_codel_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_FQ_CODEL_MAX + 1];
@@ -478,7 +479,7 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt,
        q->cparams.mtu = psched_mtu(qdisc_dev(sch));
 
        if (opt) {
-               int err = fq_codel_change(sch, opt);
+               int err = fq_codel_change(sch, opt, NULL);
                if (err)
                        return err;
        }
index 4cab6ccad6433160e17d7b653684abbb7485ebdf..cbe4831f46f4f3913a4e94a9444ad5aa6206c9df 100644 (file)
@@ -392,7 +392,8 @@ static const struct nla_policy gred_policy[TCA_GRED_MAX + 1] = {
        [TCA_GRED_LIMIT]        = { .type = NLA_U32 },
 };
 
-static int gred_change(struct Qdisc *sch, struct nlattr *opt)
+static int gred_change(struct Qdisc *sch, struct nlattr *opt,
+                      struct netlink_ext_ack *extack)
 {
        struct gred_sched *table = qdisc_priv(sch);
        struct tc_gred_qopt *ctl;
index 1102943c46c9177bfbe6f3279a34e345e611ffd8..f49a4a4fe09596bee3c0729d3a6c3c97f6906cb9 100644 (file)
@@ -1430,7 +1430,8 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt,
 }
 
 static int
-hfsc_change_qdisc(struct Qdisc *sch, struct nlattr *opt)
+hfsc_change_qdisc(struct Qdisc *sch, struct nlattr *opt,
+                 struct netlink_ext_ack *extack)
 {
        struct hfsc_sched *q = qdisc_priv(sch);
        struct tc_hfsc_qopt *qopt;
index b3a80f0ed4b0fbcb7ea2e561b2d39594c396de7f..bce2632212d3e795b9ff5cac779f25a5c94bcac3 100644 (file)
@@ -504,7 +504,8 @@ static const struct nla_policy hhf_policy[TCA_HHF_MAX + 1] = {
        [TCA_HHF_NON_HH_WEIGHT]  = { .type = NLA_U32 },
 };
 
-static int hhf_change(struct Qdisc *sch, struct nlattr *opt)
+static int hhf_change(struct Qdisc *sch, struct nlattr *opt,
+                     struct netlink_ext_ack *extack)
 {
        struct hhf_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_HHF_MAX + 1];
@@ -590,7 +591,7 @@ static int hhf_init(struct Qdisc *sch, struct nlattr *opt,
        q->hhf_non_hh_weight = 2;
 
        if (opt) {
-               int err = hhf_change(sch, opt);
+               int err = hhf_change(sch, opt, extack);
 
                if (err)
                        return err;
index 54132dde6d42a5e5e433d4cd79fbf42a72368c86..a8db1dbeb04fb5cf9c2e11e0487cb124e555de40 100644 (file)
@@ -180,7 +180,8 @@ multiq_destroy(struct Qdisc *sch)
        kfree(q->queues);
 }
 
-static int multiq_tune(struct Qdisc *sch, struct nlattr *opt)
+static int multiq_tune(struct Qdisc *sch, struct nlattr *opt,
+                      struct netlink_ext_ack *extack)
 {
        struct multiq_sched_data *q = qdisc_priv(sch);
        struct tc_multiq_qopt *qopt;
@@ -259,7 +260,7 @@ static int multiq_init(struct Qdisc *sch, struct nlattr *opt,
        for (i = 0; i < q->max_bands; i++)
                q->queues[i] = &noop_qdisc;
 
-       return multiq_tune(sch, opt);
+       return multiq_tune(sch, opt, extack);
 }
 
 static int multiq_dump(struct Qdisc *sch, struct sk_buff *skb)
index 6490ce08d29e65864a74aba81b1c8ed901048945..f45040b555310391f138692507558e2bca1d892f 100644 (file)
@@ -893,7 +893,8 @@ static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla,
 }
 
 /* Parse netlink message to set options */
-static int netem_change(struct Qdisc *sch, struct nlattr *opt)
+static int netem_change(struct Qdisc *sch, struct nlattr *opt,
+                       struct netlink_ext_ack *extack)
 {
        struct netem_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_NETEM_MAX + 1];
@@ -996,7 +997,7 @@ static int netem_init(struct Qdisc *sch, struct nlattr *opt,
                return -EINVAL;
 
        q->loss_model = CLG_RANDOM;
-       ret = netem_change(sch, opt);
+       ret = netem_change(sch, opt, extack);
        if (ret)
                pr_info("netem: change failed\n");
        return ret;
index c4c87ed3971f0777a3f356131373c2bf41e5276c..18d30bb86881aba8a5c5521181cba11038945672 100644 (file)
@@ -181,7 +181,8 @@ static const struct nla_policy pie_policy[TCA_PIE_MAX + 1] = {
        [TCA_PIE_BYTEMODE] = {.type = NLA_U32},
 };
 
-static int pie_change(struct Qdisc *sch, struct nlattr *opt)
+static int pie_change(struct Qdisc *sch, struct nlattr *opt,
+                     struct netlink_ext_ack *extack)
 {
        struct pie_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_PIE_MAX + 1];
@@ -452,7 +453,7 @@ static int pie_init(struct Qdisc *sch, struct nlattr *opt,
        timer_setup(&q->adapt_timer, pie_timer, 0);
 
        if (opt) {
-               int err = pie_change(sch, opt);
+               int err = pie_change(sch, opt, extack);
 
                if (err)
                        return err;
index d9c6fbe55ae584f9f76ff1837820abc19f00377d..5619d2eb17b690d5e73907ff958bb76f608130fa 100644 (file)
@@ -159,7 +159,8 @@ static int plug_init(struct Qdisc *sch, struct nlattr *opt,
  *   command is received (just act as a pass-thru queue).
  * TCQ_PLUG_LIMIT: Increase/decrease queue size
  */
-static int plug_change(struct Qdisc *sch, struct nlattr *opt)
+static int plug_change(struct Qdisc *sch, struct nlattr *opt,
+                      struct netlink_ext_ack *extack)
 {
        struct plug_sched_data *q = qdisc_priv(sch);
        struct tc_plug_qopt *msg;
index 8632d795e6ee88c303704d616b4e5e828be4df73..5f8ecbaa2610f8604644fc03ff1943c1a0378ce7 100644 (file)
@@ -153,7 +153,8 @@ prio_destroy(struct Qdisc *sch)
                qdisc_destroy(q->queues[prio]);
 }
 
-static int prio_tune(struct Qdisc *sch, struct nlattr *opt)
+static int prio_tune(struct Qdisc *sch, struct nlattr *opt,
+                    struct netlink_ext_ack *extack)
 {
        struct prio_sched_data *q = qdisc_priv(sch);
        struct Qdisc *queues[TCQ_PRIO_BANDS];
@@ -218,7 +219,7 @@ static int prio_init(struct Qdisc *sch, struct nlattr *opt,
        if (err)
                return err;
 
-       return prio_tune(sch, opt);
+       return prio_tune(sch, opt, extack);
 }
 
 static int prio_dump(struct Qdisc *sch, struct sk_buff *skb)
index 46d12206c7affdbf257e3863e8550011b2749bf0..6b85f8334b743bb45ccd394a08a5c136e2ad8b16 100644 (file)
@@ -197,7 +197,8 @@ static const struct nla_policy red_policy[TCA_RED_MAX + 1] = {
        [TCA_RED_MAX_P] = { .type = NLA_U32 },
 };
 
-static int red_change(struct Qdisc *sch, struct nlattr *opt)
+static int red_change(struct Qdisc *sch, struct nlattr *opt,
+                     struct netlink_ext_ack *extack)
 {
        struct red_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_RED_MAX + 1];
@@ -280,7 +281,7 @@ static int red_init(struct Qdisc *sch, struct nlattr *opt,
        q->qdisc = &noop_qdisc;
        q->sch = sch;
        timer_setup(&q->adapt_timer, red_adaptative_timer, 0);
-       return red_change(sch, opt);
+       return red_change(sch, opt, extack);
 }
 
 static int red_dump_offload_stats(struct Qdisc *sch, struct tc_red_qopt *opt)
index b2205eaa0f51bbfc1d3e78d53f2bed22e1d175a9..1b9d69bd6ed675dbb80c6e6c5f2b253be4b14173 100644 (file)
@@ -488,7 +488,8 @@ static const struct tc_sfb_qopt sfb_default_ops = {
        .penalty_burst = 20,
 };
 
-static int sfb_change(struct Qdisc *sch, struct nlattr *opt)
+static int sfb_change(struct Qdisc *sch, struct nlattr *opt,
+                     struct netlink_ext_ack *extack)
 {
        struct sfb_sched_data *q = qdisc_priv(sch);
        struct Qdisc *child;
@@ -560,7 +561,7 @@ static int sfb_init(struct Qdisc *sch, struct nlattr *opt,
                return err;
 
        q->qdisc = &noop_qdisc;
-       return sfb_change(sch, opt);
+       return sfb_change(sch, opt, extack);
 }
 
 static int sfb_dump(struct Qdisc *sch, struct sk_buff *skb)
index 9abff1271ec091a33e822a6f383c5d1d47b06a19..273228eb5ce085d51924bf105170838318de4c56 100644 (file)
@@ -302,7 +302,8 @@ static const struct nla_policy tbf_policy[TCA_TBF_MAX + 1] = {
        [TCA_TBF_PBURST] = { .type = NLA_U32 },
 };
 
-static int tbf_change(struct Qdisc *sch, struct nlattr *opt)
+static int tbf_change(struct Qdisc *sch, struct nlattr *opt,
+                     struct netlink_ext_ack *extack)
 {
        int err;
        struct tbf_sched_data *q = qdisc_priv(sch);
@@ -434,7 +435,7 @@ static int tbf_init(struct Qdisc *sch, struct nlattr *opt,
 
        q->t_c = ktime_get_ns();
 
-       return tbf_change(sch, opt);
+       return tbf_change(sch, opt, extack);
 }
 
 static void tbf_destroy(struct Qdisc *sch)