On Fri, Jun 09, 2017 at 06:08:47PM +0200, Krzysztof Kozlowski wrote: > The pm_genpd_present() iterates over list of domains so grabbing a > gpd_list_lock mutex is necessary before calling it. Otherwise we could > end up in iterating over and modifying the list at the same time. > > Signed-off-by: Krzysztof Kozlowski <[email protected]> > --- > drivers/base/power/domain.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c > index 2e8d0f423507..2a6935dc0164 100644 > --- a/drivers/base/power/domain.c > +++ b/drivers/base/power/domain.c > @@ -1099,8 +1099,13 @@ static void genpd_syscore_switch(struct device *dev, > bool suspend) > struct generic_pm_domain *genpd; > > genpd = dev_to_genpd(dev); > - if (!pm_genpd_present(genpd)) > + > + mutex_lock(&gpd_list_lock); > + if (!pm_genpd_present(genpd)) { > + mutex_unlock(&gpd_list_lock); > return; > + } > + mutex_unlock(&gpd_list_lock);
Eh, I might be too fast as this is not executed on my platform. The genpd_syscore_switch() seems to be called by clocksource_suspend() which is called by syscore ops. Should be safe but actually not tested. Someone with SH hardware is needed... Best regards, Krzysztof

