mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 17:11:46 +00:00
net: sched: implement unlocked action init API
Add additional 'rtnl_held' argument to act API init functions. It is required to implement actions that need to release rtnl lock before loading kernel module and reacquire if afterwards. Reviewed-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: Vlad Buslov <vladbu@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
036bb44327
commit
789871bb2a
19 changed files with 50 additions and 29 deletions
|
@ -671,6 +671,7 @@ static struct tc_cookie *nla_memdup_cookie(struct nlattr **tb)
|
|||
struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
|
||||
struct nlattr *nla, struct nlattr *est,
|
||||
char *name, int ovr, int bind,
|
||||
bool rtnl_held,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct tc_action *a;
|
||||
|
@ -721,9 +722,11 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
|
|||
a_o = tc_lookup_action_n(act_name);
|
||||
if (a_o == NULL) {
|
||||
#ifdef CONFIG_MODULES
|
||||
rtnl_unlock();
|
||||
if (rtnl_held)
|
||||
rtnl_unlock();
|
||||
request_module("act_%s", act_name);
|
||||
rtnl_lock();
|
||||
if (rtnl_held)
|
||||
rtnl_lock();
|
||||
|
||||
a_o = tc_lookup_action_n(act_name);
|
||||
|
||||
|
@ -746,9 +749,10 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
|
|||
/* backward compatibility for policer */
|
||||
if (name == NULL)
|
||||
err = a_o->init(net, tb[TCA_ACT_OPTIONS], est, &a, ovr, bind,
|
||||
extack);
|
||||
rtnl_held, extack);
|
||||
else
|
||||
err = a_o->init(net, nla, est, &a, ovr, bind, extack);
|
||||
err = a_o->init(net, nla, est, &a, ovr, bind, rtnl_held,
|
||||
extack);
|
||||
if (err < 0)
|
||||
goto err_mod;
|
||||
|
||||
|
@ -800,7 +804,7 @@ static void cleanup_a(struct list_head *actions, int ovr)
|
|||
int tcf_action_init(struct net *net, struct tcf_proto *tp, struct nlattr *nla,
|
||||
struct nlattr *est, char *name, int ovr, int bind,
|
||||
struct list_head *actions, size_t *attr_size,
|
||||
struct netlink_ext_ack *extack)
|
||||
bool rtnl_held, struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct nlattr *tb[TCA_ACT_MAX_PRIO + 1];
|
||||
struct tc_action *act;
|
||||
|
@ -814,7 +818,7 @@ int tcf_action_init(struct net *net, struct tcf_proto *tp, struct nlattr *nla,
|
|||
|
||||
for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) {
|
||||
act = tcf_action_init_1(net, tp, tb[i], est, name, ovr, bind,
|
||||
extack);
|
||||
rtnl_held, extack);
|
||||
if (IS_ERR(act)) {
|
||||
err = PTR_ERR(act);
|
||||
goto err;
|
||||
|
@ -1173,7 +1177,7 @@ static int tcf_action_add(struct net *net, struct nlattr *nla,
|
|||
LIST_HEAD(actions);
|
||||
|
||||
ret = tcf_action_init(net, NULL, nla, NULL, NULL, ovr, 0, &actions,
|
||||
&attr_size, extack);
|
||||
&attr_size, true, extack);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue