net: sched: sch: add extack for init callback
authorAlexander Aring <aring@mojatatu.com>
Wed, 20 Dec 2017 17:35:13 +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 init callback 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>
31 files changed:
include/net/sch_generic.h
net/sched/sch_api.c
net/sched/sch_atm.c
net/sched/sch_cbq.c
net/sched/sch_cbs.c
net/sched/sch_choke.c
net/sched/sch_codel.c
net/sched/sch_drr.c
net/sched/sch_dsmark.c
net/sched/sch_fifo.c
net/sched/sch_fq.c
net/sched/sch_fq_codel.c
net/sched/sch_generic.c
net/sched/sch_gred.c
net/sched/sch_hfsc.c
net/sched/sch_hhf.c
net/sched/sch_htb.c
net/sched/sch_ingress.c
net/sched/sch_mq.c
net/sched/sch_mqprio.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_qfq.c
net/sched/sch_red.c
net/sched/sch_sfb.c
net/sched/sch_sfq.c
net/sched/sch_tbf.c
net/sched/sch_teql.c

index bc6b25faba9963b17dbe3123b6eac8ddea4ca72f..4c5faa0ff47dca3365816245f053d561b3339f35 100644 (file)
@@ -189,7 +189,8 @@ struct Qdisc_ops {
        struct sk_buff *        (*dequeue)(struct Qdisc *);
        struct sk_buff *        (*peek)(struct Qdisc *);
 
-       int                     (*init)(struct Qdisc *sch, struct nlattr *arg);
+       int                     (*init)(struct Qdisc *sch, struct nlattr *arg,
+                                       struct netlink_ext_ack *extack);
        void                    (*reset)(struct Qdisc *);
        void                    (*destroy)(struct Qdisc *);
        int                     (*change)(struct Qdisc *sch,
index 954c0fc45473275ec2aaaa1692ec406188a7e3ec..49ee016347d25f75f6330a11b508c349e55a9775 100644 (file)
@@ -1084,7 +1084,7 @@ static struct Qdisc *qdisc_create(struct net_device *dev,
        }
 
        if (ops->init) {
-               err = ops->init(sch, tca[TCA_OPTIONS]);
+               err = ops->init(sch, tca[TCA_OPTIONS], extack);
                if (err != 0)
                        goto err_out5;
        }
index 2dbd249c0b2fc86c88995f34889c2e242bc98970..53a07687c0fbc7f8a8fdff40e1b376d3b69d27a1 100644 (file)
@@ -531,7 +531,8 @@ static struct sk_buff *atm_tc_peek(struct Qdisc *sch)
        return p->link.q->ops->peek(p->link.q);
 }
 
-static int atm_tc_init(struct Qdisc *sch, struct nlattr *opt)
+static int atm_tc_init(struct Qdisc *sch, struct nlattr *opt,
+                      struct netlink_ext_ack *extack)
 {
        struct atm_qdisc_data *p = qdisc_priv(sch);
        int err;
index 0692fe35f4ec20a210fac237aafa3eaad5dbc7a7..86eba01457f37ba504d14a72d6da8bb6a6e42aba 100644 (file)
@@ -1132,7 +1132,8 @@ static const struct nla_policy cbq_policy[TCA_CBQ_MAX + 1] = {
        [TCA_CBQ_POLICE]        = { .len = sizeof(struct tc_cbq_police) },
 };
 
-static int cbq_init(struct Qdisc *sch, struct nlattr *opt)
+static int cbq_init(struct Qdisc *sch, struct nlattr *opt,
+                   struct netlink_ext_ack *extack)
 {
        struct cbq_sched_data *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_CBQ_MAX + 1];
index 7a72980c15092ca10a781e5c4e4f9619d057fb63..d77c632a276c6bbef2621372951a96ecf5deef12 100644 (file)
@@ -291,7 +291,8 @@ static int cbs_change(struct Qdisc *sch, struct nlattr *opt)
        return 0;
 }
 
-static int cbs_init(struct Qdisc *sch, struct nlattr *opt)
+static int cbs_init(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);
index 531250fceb9e5a75d6a8b843e5e5fd9d481fddf2..49dda301e3bbb32dcdcef6eb5cd8f35deb868b2e 100644 (file)
@@ -431,7 +431,8 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt)
        return 0;
 }
 
-static int choke_init(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);
 }
index c518a1efcb9d3bd98d1de0d921bd250ed46bc69c..7221244e7f3bfcad0c3f9570b1ccf96d8db1c4c5 100644 (file)
@@ -184,7 +184,8 @@ static int codel_change(struct Qdisc *sch, struct nlattr *opt)
        return 0;
 }
 
-static int codel_init(struct Qdisc *sch, struct nlattr *opt)
+static int codel_init(struct Qdisc *sch, struct nlattr *opt,
+                     struct netlink_ext_ack *extack)
 {
        struct codel_sched_data *q = qdisc_priv(sch);
 
index 5bbcef3dcd8cab49881292aa39ca213e456e7df2..1a88473cd768254277d971e420ab77da90af079f 100644 (file)
@@ -408,7 +408,8 @@ out:
        return NULL;
 }
 
-static int drr_init_qdisc(struct Qdisc *sch, struct nlattr *opt)
+static int drr_init_qdisc(struct Qdisc *sch, struct nlattr *opt,
+                         struct netlink_ext_ack *extack)
 {
        struct drr_sched *q = qdisc_priv(sch);
        int err;
index fb4fb71c68cfa6557d042b2bbc5ccebc5493e8a4..16dd480b5583c79e183c9d1d3bda22790f083654 100644 (file)
@@ -330,7 +330,8 @@ static struct sk_buff *dsmark_peek(struct Qdisc *sch)
        return p->q->ops->peek(p->q);
 }
 
-static int dsmark_init(struct Qdisc *sch, struct nlattr *opt)
+static int dsmark_init(struct Qdisc *sch, struct nlattr *opt,
+                      struct netlink_ext_ack *extack)
 {
        struct dsmark_qdisc_data *p = qdisc_priv(sch);
        struct nlattr *tb[TCA_DSMARK_MAX + 1];
index 1e37247656f80e5c3368538c2f73b5f86c77ad50..a2d1c9f9b798482b6593910f26aa53684947762e 100644 (file)
@@ -55,7 +55,8 @@ static int pfifo_tail_enqueue(struct sk_buff *skb, struct Qdisc *sch,
        return NET_XMIT_CN;
 }
 
-static int fifo_init(struct Qdisc *sch, struct nlattr *opt)
+static int fifo_init(struct Qdisc *sch, struct nlattr *opt,
+                    struct netlink_ext_ack *extack)
 {
        bool bypass;
        bool is_bfifo = sch->ops == &bfifo_qdisc_ops;
@@ -88,6 +89,11 @@ 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 };
@@ -108,7 +114,7 @@ struct Qdisc_ops pfifo_qdisc_ops __read_mostly = {
        .peek           =       qdisc_peek_head,
        .init           =       fifo_init,
        .reset          =       qdisc_reset_queue,
-       .change         =       fifo_init,
+       .change         =       fifo_change,
        .dump           =       fifo_dump,
        .owner          =       THIS_MODULE,
 };
@@ -122,7 +128,7 @@ struct Qdisc_ops bfifo_qdisc_ops __read_mostly = {
        .peek           =       qdisc_peek_head,
        .init           =       fifo_init,
        .reset          =       qdisc_reset_queue,
-       .change         =       fifo_init,
+       .change         =       fifo_change,
        .dump           =       fifo_dump,
        .owner          =       THIS_MODULE,
 };
@@ -136,7 +142,7 @@ struct Qdisc_ops pfifo_head_drop_qdisc_ops __read_mostly = {
        .peek           =       qdisc_peek_head,
        .init           =       fifo_init,
        .reset          =       qdisc_reset_queue,
-       .change         =       fifo_init,
+       .change         =       fifo_change,
        .dump           =       fifo_dump,
        .owner          =       THIS_MODULE,
 };
index 263d16e3219e6d747496619fe5fedd03c22ba44f..c9f61ffe220ef4e16a9ce7cc961786c025b5ecc4 100644 (file)
@@ -788,7 +788,8 @@ static void fq_destroy(struct Qdisc *sch)
        qdisc_watchdog_cancel(&q->watchdog);
 }
 
-static int fq_init(struct Qdisc *sch, struct nlattr *opt)
+static int fq_init(struct Qdisc *sch, struct nlattr *opt,
+                  struct netlink_ext_ack *extack)
 {
        struct fq_sched_data *q = qdisc_priv(sch);
        int err;
index 0305d791ea943f5c7d108b2e5c877b2e16f0b6a5..5d0b20898ffac2abe5a0f0c73f6e3584ead2d26a 100644 (file)
@@ -458,7 +458,8 @@ static void fq_codel_destroy(struct Qdisc *sch)
        kvfree(q->flows);
 }
 
-static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt)
+static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt,
+                        struct netlink_ext_ack *extack)
 {
        struct fq_codel_sched_data *q = qdisc_priv(sch);
        int i;
index 876fab2604b89023bcb64c0fdebd70aaf968be14..30bc38c5d7ae1558bb2addbcadc8c7fe1d466c3e 100644 (file)
@@ -551,7 +551,8 @@ struct Qdisc noop_qdisc = {
 };
 EXPORT_SYMBOL(noop_qdisc);
 
-static int noqueue_init(struct Qdisc *qdisc, struct nlattr *opt)
+static int noqueue_init(struct Qdisc *qdisc, struct nlattr *opt,
+                       struct netlink_ext_ack *extack)
 {
        /* register_qdisc() assigns a default of noop_enqueue if unset,
         * but __dev_queue_xmit() treats noqueue only as such
@@ -690,7 +691,8 @@ nla_put_failure:
        return -1;
 }
 
-static int pfifo_fast_init(struct Qdisc *qdisc, struct nlattr *opt)
+static int pfifo_fast_init(struct Qdisc *qdisc, struct nlattr *opt,
+                          struct netlink_ext_ack *extack)
 {
        unsigned int qlen = qdisc_dev(qdisc)->tx_queue_len;
        struct pfifo_fast_priv *priv = qdisc_priv(qdisc);
@@ -840,7 +842,7 @@ struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
        }
        sch->parent = parentid;
 
-       if (!ops->init || ops->init(sch, NULL) == 0)
+       if (!ops->init || ops->init(sch, NULL, NULL) == 0)
                return sch;
 
        qdisc_destroy(sch);
index ccd1a00e2a9a5396b5a5e7bb883fa3d825bd917b..4cab6ccad6433160e17d7b653684abbb7485ebdf 100644 (file)
@@ -466,7 +466,8 @@ errout:
        return err;
 }
 
-static int gred_init(struct Qdisc *sch, struct nlattr *opt)
+static int gred_init(struct Qdisc *sch, struct nlattr *opt,
+                    struct netlink_ext_ack *extack)
 {
        struct nlattr *tb[TCA_GRED_MAX + 1];
        int err;
index 94db20352f37daf4053824050d9e040ac514c4ac..1102943c46c9177bfbe6f3279a34e345e611ffd8 100644 (file)
@@ -1388,7 +1388,8 @@ hfsc_schedule_watchdog(struct Qdisc *sch)
 }
 
 static int
-hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt)
+hfsc_init_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 73a53c08091baafde3ef776ce9ea99cac9edfd9d..b3a80f0ed4b0fbcb7ea2e561b2d39594c396de7f 100644 (file)
@@ -571,7 +571,8 @@ static int hhf_change(struct Qdisc *sch, struct nlattr *opt)
        return 0;
 }
 
-static int hhf_init(struct Qdisc *sch, struct nlattr *opt)
+static int hhf_init(struct Qdisc *sch, struct nlattr *opt,
+                   struct netlink_ext_ack *extack)
 {
        struct hhf_sched_data *q = qdisc_priv(sch);
        int i;
index fa0380730ff0513d043e25011181efabd9be8fe5..41d9b7da9273b564a1971b28c94c088db496fbe5 100644 (file)
@@ -1017,7 +1017,8 @@ static void htb_work_func(struct work_struct *work)
        rcu_read_unlock();
 }
 
-static int htb_init(struct Qdisc *sch, struct nlattr *opt)
+static int htb_init(struct Qdisc *sch, struct nlattr *opt,
+                   struct netlink_ext_ack *extack)
 {
        struct htb_sched *q = qdisc_priv(sch);
        struct nlattr *tb[TCA_HTB_MAX + 1];
index fc1286f499c1462ab29c5054f734237788974e0e..a6f175e6401681b83a5d846a0e7674af8f99ec05 100644 (file)
@@ -62,7 +62,8 @@ static void clsact_chain_head_change(struct tcf_proto *tp_head, void *priv)
        mini_qdisc_pair_swap(miniqp, tp_head);
 }
 
-static int ingress_init(struct Qdisc *sch, struct nlattr *opt)
+static int ingress_init(struct Qdisc *sch, struct nlattr *opt,
+                       struct netlink_ext_ack *extack)
 {
        struct ingress_sched_data *q = qdisc_priv(sch);
        struct net_device *dev = qdisc_dev(sch);
@@ -167,7 +168,8 @@ static struct tcf_block *clsact_tcf_block(struct Qdisc *sch, unsigned long cl)
        }
 }
 
-static int clsact_init(struct Qdisc *sch, struct nlattr *opt)
+static int clsact_init(struct Qdisc *sch, struct nlattr *opt,
+                      struct netlink_ext_ack *extack)
 {
        struct clsact_sched_data *q = qdisc_priv(sch);
        struct net_device *dev = qdisc_dev(sch);
index 8cbb5c829d59fcec6b125d87d2e0b2edeb7d7007..b91f7d8cb184794ee3a6f9c592df30ddb4189386 100644 (file)
@@ -36,7 +36,8 @@ static void mq_destroy(struct Qdisc *sch)
        kfree(priv->qdiscs);
 }
 
-static int mq_init(struct Qdisc *sch, struct nlattr *opt)
+static int mq_init(struct Qdisc *sch, struct nlattr *opt,
+                  struct netlink_ext_ack *extack)
 {
        struct net_device *dev = qdisc_dev(sch);
        struct mq_sched *priv = qdisc_priv(sch);
index 8622745f3cd91f1e4ec2a971fcc812bdcff9d148..0379fc4ee7bb90df88b4e5478bbce51661937f8c 100644 (file)
@@ -132,7 +132,8 @@ static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla,
        return 0;
 }
 
-static int mqprio_init(struct Qdisc *sch, struct nlattr *opt)
+static int mqprio_init(struct Qdisc *sch, struct nlattr *opt,
+                      struct netlink_ext_ack *extack)
 {
        struct net_device *dev = qdisc_dev(sch);
        struct mqprio_sched *priv = qdisc_priv(sch);
index 37195e0c64ba057b99283969c866ab1e71f6c2f7..54132dde6d42a5e5e433d4cd79fbf42a72368c86 100644 (file)
@@ -236,7 +236,8 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt)
        return 0;
 }
 
-static int multiq_init(struct Qdisc *sch, struct nlattr *opt)
+static int multiq_init(struct Qdisc *sch, struct nlattr *opt,
+                      struct netlink_ext_ack *extack)
 {
        struct multiq_sched_data *q = qdisc_priv(sch);
        int i, err;
index dd70924cbcdfe4d078f05d346cacf83abb1a9f2e..6490ce08d29e65864a74aba81b1c8ed901048945 100644 (file)
@@ -984,7 +984,8 @@ static int netem_change(struct Qdisc *sch, struct nlattr *opt)
        return ret;
 }
 
-static int netem_init(struct Qdisc *sch, struct nlattr *opt)
+static int netem_init(struct Qdisc *sch, struct nlattr *opt,
+                     struct netlink_ext_ack *extack)
 {
        struct netem_sched_data *q = qdisc_priv(sch);
        int ret;
index 776c694c77c71f14795cc0e0033bdedb7c461e7f..c4c87ed3971f0777a3f356131373c2bf41e5276c 100644 (file)
@@ -439,7 +439,8 @@ static void pie_timer(struct timer_list *t)
 
 }
 
-static int pie_init(struct Qdisc *sch, struct nlattr *opt)
+static int pie_init(struct Qdisc *sch, struct nlattr *opt,
+                   struct netlink_ext_ack *extack)
 {
        struct pie_sched_data *q = qdisc_priv(sch);
 
index 1c6cbab3e7b993fba3c836cb24ab664afeb6db66..d9c6fbe55ae584f9f76ff1837820abc19f00377d 100644 (file)
@@ -123,7 +123,8 @@ static struct sk_buff *plug_dequeue(struct Qdisc *sch)
        return qdisc_dequeue_head(sch);
 }
 
-static int plug_init(struct Qdisc *sch, struct nlattr *opt)
+static int plug_init(struct Qdisc *sch, struct nlattr *opt,
+                    struct netlink_ext_ack *extack)
 {
        struct plug_sched_data *q = qdisc_priv(sch);
 
index 2c79559a0d310eb1d7020270a65139a7c79504d2..8632d795e6ee88c303704d616b4e5e828be4df73 100644 (file)
@@ -205,7 +205,8 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt)
        return 0;
 }
 
-static int prio_init(struct Qdisc *sch, struct nlattr *opt)
+static int prio_init(struct Qdisc *sch, struct nlattr *opt,
+                    struct netlink_ext_ack *extack)
 {
        struct prio_sched_data *q = qdisc_priv(sch);
        int err;
index 6962b37a3ad31d9cfbc4fdf34d63c42871a00506..7c1b976314bd82d7bdc2e80707af545e6bb6dc88 100644 (file)
@@ -1413,7 +1413,8 @@ static void qfq_qlen_notify(struct Qdisc *sch, unsigned long arg)
        qfq_deactivate_class(q, cl);
 }
 
-static int qfq_init_qdisc(struct Qdisc *sch, struct nlattr *opt)
+static int qfq_init_qdisc(struct Qdisc *sch, struct nlattr *opt,
+                         struct netlink_ext_ack *extack)
 {
        struct qfq_sched *q = qdisc_priv(sch);
        struct qfq_group *grp;
index f0747eb87dc4784e67e0b5872dcf37effaaa4060..46d12206c7affdbf257e3863e8550011b2749bf0 100644 (file)
@@ -272,7 +272,8 @@ static inline void red_adaptative_timer(struct timer_list *t)
        spin_unlock(root_lock);
 }
 
-static int red_init(struct Qdisc *sch, struct nlattr *opt)
+static int red_init(struct Qdisc *sch, struct nlattr *opt,
+                   struct netlink_ext_ack *extack)
 {
        struct red_sched_data *q = qdisc_priv(sch);
 
index 0678debdd856f0306448192c63e6d6c5518dc886..b2205eaa0f51bbfc1d3e78d53f2bed22e1d175a9 100644 (file)
@@ -549,7 +549,8 @@ static int sfb_change(struct Qdisc *sch, struct nlattr *opt)
        return 0;
 }
 
-static int sfb_init(struct Qdisc *sch, struct nlattr *opt)
+static int sfb_init(struct Qdisc *sch, struct nlattr *opt,
+                   struct netlink_ext_ack *extack)
 {
        struct sfb_sched_data *q = qdisc_priv(sch);
        int err;
index 930e5bd26d3d7650a41b9472463c3fc39732495b..3b5869c7b3f327123d02f044ef2ad3af14570fce 100644 (file)
@@ -721,7 +721,8 @@ static void sfq_destroy(struct Qdisc *sch)
        kfree(q->red_parms);
 }
 
-static int sfq_init(struct Qdisc *sch, struct nlattr *opt)
+static int sfq_init(struct Qdisc *sch, struct nlattr *opt,
+                   struct netlink_ext_ack *extack)
 {
        struct sfq_sched_data *q = qdisc_priv(sch);
        int i;
index e8f3345674c541af8c13ade9abecf738c6fea1ff..9abff1271ec091a33e822a6f383c5d1d47b06a19 100644 (file)
@@ -421,7 +421,8 @@ done:
        return err;
 }
 
-static int tbf_init(struct Qdisc *sch, struct nlattr *opt)
+static int tbf_init(struct Qdisc *sch, struct nlattr *opt,
+                   struct netlink_ext_ack *extack)
 {
        struct tbf_sched_data *q = qdisc_priv(sch);
 
index 9fe6b427afed01dc383e5fce1908c1dce62a7ca5..93f04cf5cac12f4f76f7d5e9fb0b286d0632948e 100644 (file)
@@ -167,7 +167,8 @@ teql_destroy(struct Qdisc *sch)
        }
 }
 
-static int teql_qdisc_init(struct Qdisc *sch, struct nlattr *opt)
+static int teql_qdisc_init(struct Qdisc *sch, struct nlattr *opt,
+                          struct netlink_ext_ack *extack)
 {
        struct net_device *dev = qdisc_dev(sch);
        struct teql_master *m = (struct teql_master *)sch->ops;