Commit 2030721c authored by Alexander Aring's avatar Alexander Aring Committed by David S. Miller

net: sched: sch: add extack for change qdisc ops

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: default avatarJamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: default avatarAlexander Aring <aring@mojatatu.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e63d7dfd
...@@ -194,7 +194,8 @@ struct Qdisc_ops { ...@@ -194,7 +194,8 @@ struct Qdisc_ops {
void (*reset)(struct Qdisc *); void (*reset)(struct Qdisc *);
void (*destroy)(struct Qdisc *); void (*destroy)(struct Qdisc *);
int (*change)(struct Qdisc *sch, int (*change)(struct Qdisc *sch,
struct nlattr *arg); struct nlattr *arg,
struct netlink_ext_ack *extack);
void (*attach)(struct Qdisc *sch); void (*attach)(struct Qdisc *sch);
int (*dump)(struct Qdisc *, struct sk_buff *); int (*dump)(struct Qdisc *, struct sk_buff *);
......
...@@ -1177,7 +1177,7 @@ static int qdisc_change(struct Qdisc *sch, struct nlattr **tca, ...@@ -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"); NL_SET_ERR_MSG(extack, "Change operation not supported by specified qdisc");
return -EINVAL; return -EINVAL;
} }
err = sch->ops->change(sch, tca[TCA_OPTIONS]); err = sch->ops->change(sch, tca[TCA_OPTIONS], extack);
if (err) if (err)
return err; return err;
} }
......
...@@ -246,7 +246,8 @@ static int cbs_enable_offload(struct net_device *dev, struct cbs_sched_data *q, ...@@ -246,7 +246,8 @@ static int cbs_enable_offload(struct net_device *dev, struct cbs_sched_data *q,
return 0; 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 cbs_sched_data *q = qdisc_priv(sch);
struct net_device *dev = qdisc_dev(sch); struct net_device *dev = qdisc_dev(sch);
...@@ -307,7 +308,7 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -307,7 +308,7 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt,
qdisc_watchdog_init(&q->watchdog, sch); qdisc_watchdog_init(&q->watchdog, sch);
return cbs_change(sch, opt); return cbs_change(sch, opt, extack);
} }
static void cbs_destroy(struct Qdisc *sch) static void cbs_destroy(struct Qdisc *sch)
......
...@@ -344,7 +344,8 @@ static void choke_free(void *addr) ...@@ -344,7 +344,8 @@ static void choke_free(void *addr)
kvfree(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 choke_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_CHOKE_MAX + 1]; struct nlattr *tb[TCA_CHOKE_MAX + 1];
...@@ -434,7 +435,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt) ...@@ -434,7 +435,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt)
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) 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) static int choke_dump(struct Qdisc *sch, struct sk_buff *skb)
......
...@@ -130,7 +130,8 @@ static const struct nla_policy codel_policy[TCA_CODEL_MAX + 1] = { ...@@ -130,7 +130,8 @@ static const struct nla_policy codel_policy[TCA_CODEL_MAX + 1] = {
[TCA_CODEL_CE_THRESHOLD]= { .type = NLA_U32 }, [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 codel_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_CODEL_MAX + 1]; struct nlattr *tb[TCA_CODEL_MAX + 1];
...@@ -197,7 +198,7 @@ static int codel_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -197,7 +198,7 @@ static int codel_init(struct Qdisc *sch, struct nlattr *opt,
q->params.mtu = psched_mtu(qdisc_dev(sch)); q->params.mtu = psched_mtu(qdisc_dev(sch));
if (opt) { if (opt) {
int err = codel_change(sch, opt); int err = codel_change(sch, opt, extack);
if (err) if (err)
return err; return err;
......
...@@ -89,11 +89,6 @@ static int fifo_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -89,11 +89,6 @@ static int fifo_init(struct Qdisc *sch, struct nlattr *opt,
return 0; 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) static int fifo_dump(struct Qdisc *sch, struct sk_buff *skb)
{ {
struct tc_fifo_qopt opt = { .limit = sch->limit }; struct tc_fifo_qopt opt = { .limit = sch->limit };
...@@ -114,7 +109,7 @@ struct Qdisc_ops pfifo_qdisc_ops __read_mostly = { ...@@ -114,7 +109,7 @@ struct Qdisc_ops pfifo_qdisc_ops __read_mostly = {
.peek = qdisc_peek_head, .peek = qdisc_peek_head,
.init = fifo_init, .init = fifo_init,
.reset = qdisc_reset_queue, .reset = qdisc_reset_queue,
.change = fifo_change, .change = fifo_init,
.dump = fifo_dump, .dump = fifo_dump,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
...@@ -128,7 +123,7 @@ struct Qdisc_ops bfifo_qdisc_ops __read_mostly = { ...@@ -128,7 +123,7 @@ struct Qdisc_ops bfifo_qdisc_ops __read_mostly = {
.peek = qdisc_peek_head, .peek = qdisc_peek_head,
.init = fifo_init, .init = fifo_init,
.reset = qdisc_reset_queue, .reset = qdisc_reset_queue,
.change = fifo_change, .change = fifo_init,
.dump = fifo_dump, .dump = fifo_dump,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
...@@ -142,7 +137,7 @@ struct Qdisc_ops pfifo_head_drop_qdisc_ops __read_mostly = { ...@@ -142,7 +137,7 @@ struct Qdisc_ops pfifo_head_drop_qdisc_ops __read_mostly = {
.peek = qdisc_peek_head, .peek = qdisc_peek_head,
.init = fifo_init, .init = fifo_init,
.reset = qdisc_reset_queue, .reset = qdisc_reset_queue,
.change = fifo_change, .change = fifo_init,
.dump = fifo_dump, .dump = fifo_dump,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
...@@ -163,7 +158,7 @@ int fifo_set_limit(struct Qdisc *q, unsigned int limit) ...@@ -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)); nla->nla_len = nla_attr_size(sizeof(struct tc_fifo_qopt));
((struct tc_fifo_qopt *)nla_data(nla))->limit = limit; ((struct tc_fifo_qopt *)nla_data(nla))->limit = limit;
ret = q->ops->change(q, nla); ret = q->ops->change(q, nla, NULL);
kfree(nla); kfree(nla);
} }
return ret; return ret;
......
...@@ -685,7 +685,8 @@ static const struct nla_policy fq_policy[TCA_FQ_MAX + 1] = { ...@@ -685,7 +685,8 @@ static const struct nla_policy fq_policy[TCA_FQ_MAX + 1] = {
[TCA_FQ_LOW_RATE_THRESHOLD] = { .type = NLA_U32 }, [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 fq_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_FQ_MAX + 1]; struct nlattr *tb[TCA_FQ_MAX + 1];
...@@ -812,7 +813,7 @@ static int fq_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -812,7 +813,7 @@ static int fq_init(struct Qdisc *sch, struct nlattr *opt,
qdisc_watchdog_init(&q->watchdog, sch); qdisc_watchdog_init(&q->watchdog, sch);
if (opt) if (opt)
err = fq_change(sch, opt); err = fq_change(sch, opt, extack);
else else
err = fq_resize(sch, q->fq_trees_log); err = fq_resize(sch, q->fq_trees_log);
......
...@@ -377,7 +377,8 @@ static const struct nla_policy fq_codel_policy[TCA_FQ_CODEL_MAX + 1] = { ...@@ -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 }, [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 fq_codel_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_FQ_CODEL_MAX + 1]; struct nlattr *tb[TCA_FQ_CODEL_MAX + 1];
...@@ -478,7 +479,7 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -478,7 +479,7 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt,
q->cparams.mtu = psched_mtu(qdisc_dev(sch)); q->cparams.mtu = psched_mtu(qdisc_dev(sch));
if (opt) { if (opt) {
int err = fq_codel_change(sch, opt); int err = fq_codel_change(sch, opt, NULL);
if (err) if (err)
return err; return err;
} }
......
...@@ -392,7 +392,8 @@ static const struct nla_policy gred_policy[TCA_GRED_MAX + 1] = { ...@@ -392,7 +392,8 @@ static const struct nla_policy gred_policy[TCA_GRED_MAX + 1] = {
[TCA_GRED_LIMIT] = { .type = NLA_U32 }, [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 gred_sched *table = qdisc_priv(sch);
struct tc_gred_qopt *ctl; struct tc_gred_qopt *ctl;
......
...@@ -1430,7 +1430,8 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt, ...@@ -1430,7 +1430,8 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt,
} }
static int 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 hfsc_sched *q = qdisc_priv(sch);
struct tc_hfsc_qopt *qopt; struct tc_hfsc_qopt *qopt;
......
...@@ -504,7 +504,8 @@ static const struct nla_policy hhf_policy[TCA_HHF_MAX + 1] = { ...@@ -504,7 +504,8 @@ static const struct nla_policy hhf_policy[TCA_HHF_MAX + 1] = {
[TCA_HHF_NON_HH_WEIGHT] = { .type = NLA_U32 }, [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 hhf_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_HHF_MAX + 1]; struct nlattr *tb[TCA_HHF_MAX + 1];
...@@ -590,7 +591,7 @@ static int hhf_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -590,7 +591,7 @@ static int hhf_init(struct Qdisc *sch, struct nlattr *opt,
q->hhf_non_hh_weight = 2; q->hhf_non_hh_weight = 2;
if (opt) { if (opt) {
int err = hhf_change(sch, opt); int err = hhf_change(sch, opt, extack);
if (err) if (err)
return err; return err;
......
...@@ -180,7 +180,8 @@ multiq_destroy(struct Qdisc *sch) ...@@ -180,7 +180,8 @@ multiq_destroy(struct Qdisc *sch)
kfree(q->queues); 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 multiq_sched_data *q = qdisc_priv(sch);
struct tc_multiq_qopt *qopt; struct tc_multiq_qopt *qopt;
...@@ -259,7 +260,7 @@ static int multiq_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -259,7 +260,7 @@ static int multiq_init(struct Qdisc *sch, struct nlattr *opt,
for (i = 0; i < q->max_bands; i++) for (i = 0; i < q->max_bands; i++)
q->queues[i] = &noop_qdisc; 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) static int multiq_dump(struct Qdisc *sch, struct sk_buff *skb)
......
...@@ -893,7 +893,8 @@ static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla, ...@@ -893,7 +893,8 @@ static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla,
} }
/* Parse netlink message to set options */ /* 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 netem_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_NETEM_MAX + 1]; struct nlattr *tb[TCA_NETEM_MAX + 1];
...@@ -996,7 +997,7 @@ static int netem_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -996,7 +997,7 @@ static int netem_init(struct Qdisc *sch, struct nlattr *opt,
return -EINVAL; return -EINVAL;
q->loss_model = CLG_RANDOM; q->loss_model = CLG_RANDOM;
ret = netem_change(sch, opt); ret = netem_change(sch, opt, extack);
if (ret) if (ret)
pr_info("netem: change failed\n"); pr_info("netem: change failed\n");
return ret; return ret;
......
...@@ -181,7 +181,8 @@ static const struct nla_policy pie_policy[TCA_PIE_MAX + 1] = { ...@@ -181,7 +181,8 @@ static const struct nla_policy pie_policy[TCA_PIE_MAX + 1] = {
[TCA_PIE_BYTEMODE] = {.type = NLA_U32}, [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 pie_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_PIE_MAX + 1]; struct nlattr *tb[TCA_PIE_MAX + 1];
...@@ -452,7 +453,7 @@ static int pie_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -452,7 +453,7 @@ static int pie_init(struct Qdisc *sch, struct nlattr *opt,
timer_setup(&q->adapt_timer, pie_timer, 0); timer_setup(&q->adapt_timer, pie_timer, 0);
if (opt) { if (opt) {
int err = pie_change(sch, opt); int err = pie_change(sch, opt, extack);
if (err) if (err)
return err; return err;
......
...@@ -159,7 +159,8 @@ static int plug_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -159,7 +159,8 @@ static int plug_init(struct Qdisc *sch, struct nlattr *opt,
* command is received (just act as a pass-thru queue). * command is received (just act as a pass-thru queue).
* TCQ_PLUG_LIMIT: Increase/decrease queue size * 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 plug_sched_data *q = qdisc_priv(sch);
struct tc_plug_qopt *msg; struct tc_plug_qopt *msg;
......
...@@ -153,7 +153,8 @@ prio_destroy(struct Qdisc *sch) ...@@ -153,7 +153,8 @@ prio_destroy(struct Qdisc *sch)
qdisc_destroy(q->queues[prio]); 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 prio_sched_data *q = qdisc_priv(sch);
struct Qdisc *queues[TCQ_PRIO_BANDS]; struct Qdisc *queues[TCQ_PRIO_BANDS];
...@@ -218,7 +219,7 @@ static int prio_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -218,7 +219,7 @@ static int prio_init(struct Qdisc *sch, struct nlattr *opt,
if (err) if (err)
return 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) static int prio_dump(struct Qdisc *sch, struct sk_buff *skb)
......
...@@ -197,7 +197,8 @@ static const struct nla_policy red_policy[TCA_RED_MAX + 1] = { ...@@ -197,7 +197,8 @@ static const struct nla_policy red_policy[TCA_RED_MAX + 1] = {
[TCA_RED_MAX_P] = { .type = NLA_U32 }, [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 red_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_RED_MAX + 1]; struct nlattr *tb[TCA_RED_MAX + 1];
...@@ -280,7 +281,7 @@ static int red_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -280,7 +281,7 @@ static int red_init(struct Qdisc *sch, struct nlattr *opt,
q->qdisc = &noop_qdisc; q->qdisc = &noop_qdisc;
q->sch = sch; q->sch = sch;
timer_setup(&q->adapt_timer, red_adaptative_timer, 0); 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) static int red_dump_offload_stats(struct Qdisc *sch, struct tc_red_qopt *opt)
......
...@@ -488,7 +488,8 @@ static const struct tc_sfb_qopt sfb_default_ops = { ...@@ -488,7 +488,8 @@ static const struct tc_sfb_qopt sfb_default_ops = {
.penalty_burst = 20, .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 sfb_sched_data *q = qdisc_priv(sch);
struct Qdisc *child; struct Qdisc *child;
...@@ -560,7 +561,7 @@ static int sfb_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -560,7 +561,7 @@ static int sfb_init(struct Qdisc *sch, struct nlattr *opt,
return err; return err;
q->qdisc = &noop_qdisc; 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) static int sfb_dump(struct Qdisc *sch, struct sk_buff *skb)
......
...@@ -302,7 +302,8 @@ static const struct nla_policy tbf_policy[TCA_TBF_MAX + 1] = { ...@@ -302,7 +302,8 @@ static const struct nla_policy tbf_policy[TCA_TBF_MAX + 1] = {
[TCA_TBF_PBURST] = { .type = NLA_U32 }, [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; int err;
struct tbf_sched_data *q = qdisc_priv(sch); struct tbf_sched_data *q = qdisc_priv(sch);
...@@ -434,7 +435,7 @@ static int tbf_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -434,7 +435,7 @@ static int tbf_init(struct Qdisc *sch, struct nlattr *opt,
q->t_c = ktime_get_ns(); q->t_c = ktime_get_ns();
return tbf_change(sch, opt); return tbf_change(sch, opt, extack);
} }
static void tbf_destroy(struct Qdisc *sch) static void tbf_destroy(struct Qdisc *sch)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment