Skip to content

Commit

Permalink
net: sched: track rtnl lock status when validating extensions
Browse files Browse the repository at this point in the history
Actions API is already updated to not rely on rtnl lock for
synchronization. However, it need to be provided with rtnl status when
called from classifiers API in order to be able to correctly release the
lock when loading kernel module.

Extend extension validation function with 'rtnl_held' flag which is passed
to actions API. Add new 'rtnl_held' parameter to tcf_exts_validate() in cls
API. No classifier is currently updated to support unlocked execution, so
pass hardcoded 'true' flag parameter value.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vlad Buslov authored and David S. Miller committed Feb 12, 2019
1 parent 726d061 commit ec6743a
Show file tree
Hide file tree
Showing 13 changed files with 21 additions and 16 deletions.
2 changes: 1 addition & 1 deletion include/net/pkt_cls.h
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ tcf_exts_exec(struct sk_buff *skb, struct tcf_exts *exts,

int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
struct nlattr **tb, struct nlattr *rate_tlv,
struct tcf_exts *exts, bool ovr,
struct tcf_exts *exts, bool ovr, bool rtnl_held,
struct netlink_ext_ack *extack);
void tcf_exts_destroy(struct tcf_exts *exts);
void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src);
Expand Down
9 changes: 5 additions & 4 deletions net/sched/cls_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -2841,7 +2841,7 @@ EXPORT_SYMBOL(tcf_exts_destroy);

int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
struct nlattr *rate_tlv, struct tcf_exts *exts, bool ovr,
struct netlink_ext_ack *extack)
bool rtnl_held, struct netlink_ext_ack *extack)
{
#ifdef CONFIG_NET_CLS_ACT
{
Expand All @@ -2851,7 +2851,8 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
if (exts->police && tb[exts->police]) {
act = tcf_action_init_1(net, tp, tb[exts->police],
rate_tlv, "police", ovr,
TCA_ACT_BIND, true, extack);
TCA_ACT_BIND, rtnl_held,
extack);
if (IS_ERR(act))
return PTR_ERR(act);

Expand All @@ -2863,8 +2864,8 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,

err = tcf_action_init(net, tp, tb[exts->action],
rate_tlv, NULL, ovr, TCA_ACT_BIND,
exts->actions, &attr_size, true,
extack);
exts->actions, &attr_size,
rtnl_held, extack);
if (err < 0)
return err;
exts->nr_actions = err;
Expand Down
2 changes: 1 addition & 1 deletion net/sched/cls_basic.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ static int basic_set_parms(struct net *net, struct tcf_proto *tp,
{
int err;

err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, true, extack);
if (err < 0)
return err;

Expand Down
3 changes: 2 additions & 1 deletion net/sched/cls_bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,8 @@ static int cls_bpf_set_parms(struct net *net, struct tcf_proto *tp,
if ((!is_bpf && !is_ebpf) || (is_bpf && is_ebpf))
return -EINVAL;

ret = tcf_exts_validate(net, tp, tb, est, &prog->exts, ovr, extack);
ret = tcf_exts_validate(net, tp, tb, est, &prog->exts, ovr, true,
extack);
if (ret < 0)
return ret;

Expand Down
2 changes: 1 addition & 1 deletion net/sched/cls_cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ static int cls_cgroup_change(struct net *net, struct sk_buff *in_skb,
goto errout;

err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &new->exts, ovr,
extack);
true, extack);
if (err < 0)
goto errout;

Expand Down
2 changes: 1 addition & 1 deletion net/sched/cls_flow.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ static int flow_change(struct net *net, struct sk_buff *in_skb,
goto err2;

err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &fnew->exts, ovr,
extack);
true, extack);
if (err < 0)
goto err2;

Expand Down
3 changes: 2 additions & 1 deletion net/sched/cls_flower.c
Original file line number Diff line number Diff line change
Expand Up @@ -1272,7 +1272,8 @@ static int fl_set_parms(struct net *net, struct tcf_proto *tp,
{
int err;

err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, true,
extack);
if (err < 0)
return err;

Expand Down
2 changes: 1 addition & 1 deletion net/sched/cls_fw.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ static int fw_set_parms(struct net *net, struct tcf_proto *tp,
int err;

err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &f->exts, ovr,
extack);
true, extack);
if (err < 0)
return err;

Expand Down
3 changes: 2 additions & 1 deletion net/sched/cls_matchall.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,8 @@ static int mall_set_parms(struct net *net, struct tcf_proto *tp,
{
int err;

err = tcf_exts_validate(net, tp, tb, est, &head->exts, ovr, extack);
err = tcf_exts_validate(net, tp, tb, est, &head->exts, ovr, true,
extack);
if (err < 0)
return err;

Expand Down
2 changes: 1 addition & 1 deletion net/sched/cls_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ static int route4_set_parms(struct net *net, struct tcf_proto *tp,
struct route4_bucket *b;
int err;

err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, true, extack);
if (err < 0)
return err;

Expand Down
3 changes: 2 additions & 1 deletion net/sched/cls_rsvp.h
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,8 @@ static int rsvp_change(struct net *net, struct sk_buff *in_skb,
err = tcf_exts_init(&e, TCA_RSVP_ACT, TCA_RSVP_POLICE);
if (err < 0)
return err;
err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, ovr, extack);
err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, ovr, true,
extack);
if (err < 0)
goto errout2;

Expand Down
2 changes: 1 addition & 1 deletion net/sched/cls_tcindex.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
err = tcf_exts_init(&e, TCA_TCINDEX_ACT, TCA_TCINDEX_POLICE);
if (err < 0)
return err;
err = tcf_exts_validate(net, tp, tb, est, &e, ovr, extack);
err = tcf_exts_validate(net, tp, tb, est, &e, ovr, true, extack);
if (err < 0)
goto errout;

Expand Down
2 changes: 1 addition & 1 deletion net/sched/cls_u32.c
Original file line number Diff line number Diff line change
Expand Up @@ -726,7 +726,7 @@ static int u32_set_parms(struct net *net, struct tcf_proto *tp,
{
int err;

err = tcf_exts_validate(net, tp, tb, est, &n->exts, ovr, extack);
err = tcf_exts_validate(net, tp, tb, est, &n->exts, ovr, true, extack);
if (err < 0)
return err;

Expand Down

0 comments on commit ec6743a

Please sign in to comment.