diff options
author | David S. Miller <davem@davemloft.net> | 2017-11-10 02:00:18 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-11-10 02:00:18 +0100 |
commit | 4dc6758d7824a6d25717ccceefc488cafdb07210 (patch) | |
tree | 992e5d5996910af35a5c12fe94da14d0bb167452 /include/net/pkt_cls.h | |
parent | Merge branch 'dsa-setup-stage' (diff) | |
parent | Merge tag 'pm-final-4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/ra... (diff) | |
download | linux-4dc6758d7824a6d25717ccceefc488cafdb07210.tar.xz linux-4dc6758d7824a6d25717ccceefc488cafdb07210.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Simple cases of overlapping changes in the packet scheduler.
Must easier to resolve this time.
Which probably means that I screwed it up somehow.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/pkt_cls.h')
-rw-r--r-- | include/net/pkt_cls.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index 03c208d3c922..0105445cab83 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -231,6 +231,7 @@ struct tcf_exts { __u32 type; /* for backward compat(TCA_OLD_COMPAT) */ int nr_actions; struct tc_action **actions; + struct net *net; #endif /* Map to export classifier specific extension TLV types to the * generic extensions API. Unsupported extensions must be set to 0. @@ -244,6 +245,7 @@ static inline int tcf_exts_init(struct tcf_exts *exts, int action, int police) #ifdef CONFIG_NET_CLS_ACT exts->type = 0; exts->nr_actions = 0; + exts->net = NULL; exts->actions = kcalloc(TCA_ACT_MAX_PRIO, sizeof(struct tc_action *), GFP_KERNEL); if (!exts->actions) @@ -254,6 +256,28 @@ static inline int tcf_exts_init(struct tcf_exts *exts, int action, int police) return 0; } +/* Return false if the netns is being destroyed in cleanup_net(). Callers + * need to do cleanup synchronously in this case, otherwise may race with + * tc_action_net_exit(). Return true for other cases. + */ +static inline bool tcf_exts_get_net(struct tcf_exts *exts) +{ +#ifdef CONFIG_NET_CLS_ACT + exts->net = maybe_get_net(exts->net); + return exts->net != NULL; +#else + return true; +#endif +} + +static inline void tcf_exts_put_net(struct tcf_exts *exts) +{ +#ifdef CONFIG_NET_CLS_ACT + if (exts->net) + put_net(exts->net); +#endif +} + static inline void tcf_exts_to_list(const struct tcf_exts *exts, struct list_head *actions) { |