diff options
Diffstat (limited to 'net/sched/cls_bpf.c')
| -rw-r--r-- | net/sched/cls_bpf.c | 22 | 
1 files changed, 6 insertions, 16 deletions
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c index b07c1fa8bc0d..1aa7f6511065 100644 --- a/net/sched/cls_bpf.c +++ b/net/sched/cls_bpf.c @@ -49,10 +49,7 @@ struct cls_bpf_prog {  	struct sock_filter *bpf_ops;  	const char *bpf_name;  	struct tcf_proto *tp; -	union { -		struct work_struct work; -		struct rcu_head rcu; -	}; +	struct rcu_work rwork;  };  static const struct nla_policy bpf_policy[TCA_BPF_MAX + 1] = { @@ -275,21 +272,14 @@ static void __cls_bpf_delete_prog(struct cls_bpf_prog *prog)  static void cls_bpf_delete_prog_work(struct work_struct *work)  { -	struct cls_bpf_prog *prog = container_of(work, struct cls_bpf_prog, work); - +	struct cls_bpf_prog *prog = container_of(to_rcu_work(work), +						 struct cls_bpf_prog, +						 rwork);  	rtnl_lock();  	__cls_bpf_delete_prog(prog);  	rtnl_unlock();  } -static void cls_bpf_delete_prog_rcu(struct rcu_head *rcu) -{ -	struct cls_bpf_prog *prog = container_of(rcu, struct cls_bpf_prog, rcu); - -	INIT_WORK(&prog->work, cls_bpf_delete_prog_work); -	tcf_queue_work(&prog->work); -} -  static void __cls_bpf_delete(struct tcf_proto *tp, struct cls_bpf_prog *prog,  			     struct netlink_ext_ack *extack)  { @@ -300,7 +290,7 @@ static void __cls_bpf_delete(struct tcf_proto *tp, struct cls_bpf_prog *prog,  	list_del_rcu(&prog->link);  	tcf_unbind_filter(tp, &prog->res);  	if (tcf_exts_get_net(&prog->exts)) -		call_rcu(&prog->rcu, cls_bpf_delete_prog_rcu); +		tcf_queue_work(&prog->rwork, cls_bpf_delete_prog_work);  	else  		__cls_bpf_delete_prog(prog);  } @@ -526,7 +516,7 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb,  		list_replace_rcu(&oldprog->link, &prog->link);  		tcf_unbind_filter(tp, &oldprog->res);  		tcf_exts_get_net(&oldprog->exts); -		call_rcu(&oldprog->rcu, cls_bpf_delete_prog_rcu); +		tcf_queue_work(&oldprog->rwork, cls_bpf_delete_prog_work);  	} else {  		list_add_rcu(&prog->link, &head->plist);  	}  | 
