On 24 November 2014 at 21:44, Paul E. McKenney paulmck@linux.vnet.ibm.com wrote:
As Rafael says, if opp is reachable by RCU readers, you cannot just immediately kfree() it. Immediately kfree()ing it like this -will- cause your RCU readers to see freed memory, which, as you noted, can cause crashes.
In order to reply you at some level, I tried going through RCU documentation today before replying anymore. And yes I understood this part.
Except that srcu_notifier_call_chain() involves SRCU readers. So, unless I am confused, you instead need something like this:
static void kfree_opp_rcu(struct rcu_head *rhp) { struct device_opp *opp = container_of(rhp, struct device_opp, opp_list);
kfree(opp);
}
Then replace the above kfree() by:
call_srcu(&opp->rcu, kfree_opp_rcu);
Correct. But you missed the srcu which should be the first argument here :)
This will require adding the following to struct device_opp:
struct rcu_head rcu;
We were freeing struct dev_pm_opp, and so I believe you wanted me to add it there? Its already there.
All that said, I do not claim to understand the OPP code, so please take the above suggested changes with a grain of salt. And if you let me know where I am confused, I should be able to offer better suggestions.
Thanks for your suggestions. I have sent the patch to list and cc'd you on the relevant ones. Would be great if you can review the rcu part there.
-- viresh