Tue, Sep 12, 2017 at 11:42:15AM CEST, j...@resnulli.us wrote: >Tue, Sep 12, 2017 at 01:33:30AM CEST, xiyou.wangc...@gmail.com wrote: >>gen estimator has been rewritten in commit 1c0d32fde5bd >>("net_sched: gen_estimator: complete rewrite of rate estimators"), >>the caller is no longer needed to wait for a grace period. >>So this patch gets rid of it. >> >>This also completely closes a race condition between action free >>path and filter chain add/remove path for the following patch. >>Because otherwise the nested RCU callback can't be caught by >>rcu_barrier(). >> >>Please see also the comments in code. > >Looks like this is causing a null pointer dereference bug for me, 100% >of the time. Just add and remove any rule with action and you get: >
[...] > >Looks like you need to save owner of the module before you call >__tcf_idr_release so you can later on use it for module_put This patch helps: diff --git a/net/sched/act_api.c b/net/sched/act_api.c index fcd7dc7..de73e71 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c @@ -514,13 +514,15 @@ EXPORT_SYMBOL(tcf_action_exec); int tcf_action_destroy(struct list_head *actions, int bind) { + const struct tc_action_ops *ops; struct tc_action *a, *tmp; int ret = 0; list_for_each_entry_safe(a, tmp, actions, list) { + ops = a->ops; ret = __tcf_idr_release(a, bind, true); if (ret == ACT_P_DELETED) - module_put(a->ops->owner); + module_put(ops->owner); else if (ret < 0) return ret; }