On 2/22/19 10:21 AM, wenxu wrote: > On 2019/2/22 下午11:03, David Ahern wrote: >> On 2/21/19 11:14 PM, wenxu wrote: >>> build_state in the rcu_read_lock and disable the preempt >>> >>> rcu_read_lock(); >>> ops = rcu_dereference(lwtun_encaps[encap_type]); >>> if (likely(ops && ops->build_state && try_module_get(ops->owner))) { >>> found = true; >>> ret = ops->build_state(encap, family, cfg, lws, extack); >>> if (ret) >>> module_put(ops->owner); >>> } >>> rcu_read_unlock(); >>> >> Missed that. >> >> Once a reference is taken the rcu_read_lock can be dropped before >> calling build_state allowing the allocations to be GFP_KERNEL. >> > I don't think the rcu_read_lock can be dropped. The whole operation of the > reference should be protect > > in the rcu_read_lock that ensure the ops will not be destroy (if it will be) >
If 'try_module_get(ops->owner)' succeeds then a reference is held so the ops will not go away.