On Wed 2011-04-13 17:02:45, Mike Frysinger wrote: > On Wed, Apr 13, 2011 at 16:58, Rafael J. Wysocki wrote: > > On Wednesday, April 13, 2011, Mike Frysinger wrote: > >> when we suspend/resume Blackfin SMP systems, we notice that the > >> freezer code runs on multiple cores. this is of course what you want > >> -- freeze processes in parallel. however, the code only uses non-smp > >> based barriers which causes us problems ... our cores need software > >> support to keep caches in sync, so our smp barriers do just that. but > >> the non-smp barriers do not, and so the frozen/thawed processes > >> randomly get stuck in the wrong task state. > >> > >> thinking about it, shouldnt the freezer code be using smp barriers ? > > > > Yes, it should, but rmb() and wmb() are supposed to be SMP barriers. > > > > Or do you mean something different? > > then what's the diff between smp_rmb() and rmb() ? > > this is what i'm proposing: > --- a/kernel/freezer.c > +++ b/kernel/freezer.c > @@ -17,7 +17,7 @@ static inline void frozen_process(void) > { > if (!unlikely(current->flags & PF_NOFREEZE)) { > current->flags |= PF_FROZEN; > - wmb(); > + smp_wmb(); > } > clear_freeze_flag(current); > } > @@ -93,7 +93,7 @@ bool freeze_task(struct task_struct *p, bool sig_only) > * the task as frozen and next clears its TIF_FREEZE. > */ > if (!freezing(p)) { > - rmb(); > + smp_rmb(); > if (frozen(p)) > return false; smp_rmb() is NOP on uniprocessor. I believe the code is correct as is. Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm