diff options
| author | David S. Miller <davem@davemloft.net> | 2018-01-25 00:01:11 +0300 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-01-25 00:01:11 +0300 |
| commit | 131f1ed317d2ca92a1b7ada4e658cc2a3a0e4ce6 (patch) | |
| tree | 46014315e7b1f1d4c22b47b514a905cd823ddb99 /include | |
| parent | 46410c2efa9cb5b2f40c9ce24a75d147f44aedeb (diff) | |
| parent | c846adb6be17d77395c579a61c44d2863e6f9762 (diff) | |
| download | linux-131f1ed317d2ca92a1b7ada4e658cc2a3a0e4ce6.tar.xz | |
Merge branch 'net-sched-propagate-extack-to-cls-offloads-on-destroy-and-only-with-skip_sw'
Jakub Kicinski says:
====================
net: sched: propagate extack to cls offloads on destroy and only with skip_sw
This series some of Jiri's comments and the fact that today drivers
may produce extack even if there is no skip_sw flag (meaning the
driver failure is not really a problem), and warning messages will
only confuse the users.
First patch propagates extack to destroy as requested by Jiri, extack
is then propagated to the driver callback for each classifier. I chose
not to provide the extack on error paths. As a rule of thumb it seems
best to keep the extack of the condition which caused the error. E.g.
err = this_will_fail(arg, extack);
if (err) {
undo_things(arg, NULL /* don't pass extack */);
return err;
}
Note that NL_SET_ERR_MSG() will ignore the message if extack is NULL.
I was pondering whether we should make NL_SET_ERR_MSG() refuse to
overwrite the msg, but there seem to be cases in the tree where extack
is set like this:
err = this_will_fail(arg, extack);
if (err) {
undo_things(arg, NULL /* don't pass extack */);
NL_SET_ERR_MSG(extack, "extack is set after undo call :/");
return err;
}
I think not passing extack to undo calls is reasonable.
v2:
- rename the temporary tc_cls_common_offload_init().
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/pkt_cls.h | 24 | ||||
| -rw-r--r-- | include/net/sch_generic.h | 3 |
2 files changed, 14 insertions, 13 deletions
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index 2f8f16a4d88e..1a41513cec7f 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -605,17 +605,6 @@ struct tc_cls_common_offload { struct netlink_ext_ack *extack; }; -static inline void -tc_cls_common_offload_init(struct tc_cls_common_offload *cls_common, - const struct tcf_proto *tp, - struct netlink_ext_ack *extack) -{ - cls_common->chain_index = tp->chain->index; - cls_common->protocol = tp->protocol; - cls_common->prio = tp->prio; - cls_common->extack = extack; -} - struct tc_cls_u32_knode { struct tcf_exts *exts; struct tc_u32_sel *sel; @@ -694,6 +683,18 @@ static inline bool tc_in_hw(u32 flags) return (flags & TCA_CLS_FLAGS_IN_HW) ? true : false; } +static inline void +tc_cls_common_offload_init(struct tc_cls_common_offload *cls_common, + const struct tcf_proto *tp, u32 flags, + struct netlink_ext_ack *extack) +{ + cls_common->chain_index = tp->chain->index; + cls_common->protocol = tp->protocol; + cls_common->prio = tp->prio; + if (tc_skip_sw(flags)) + cls_common->extack = extack; +} + enum tc_fl_command { TC_CLSFLOWER_REPLACE, TC_CLSFLOWER_DESTROY, @@ -736,7 +737,6 @@ struct tc_cls_bpf_offload { struct bpf_prog *oldprog; const char *name; bool exts_integrated; - u32 gen_flags; }; struct tc_mqprio_qopt_offload { diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index cd1be1f25c36..eac43e8ca96d 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -233,7 +233,8 @@ struct tcf_proto_ops { const struct tcf_proto *, struct tcf_result *); int (*init)(struct tcf_proto*); - void (*destroy)(struct tcf_proto*); + void (*destroy)(struct tcf_proto *tp, + struct netlink_ext_ack *extack); void* (*get)(struct tcf_proto*, u32 handle); int (*change)(struct net *net, struct sk_buff *, |
