On Wed, May 28, 2014 at 05:01:41PM -0700, Andy Lutomirski wrote: > On Thu, May 22, 2014 at 6:09 AM, Peter Zijlstra <pet...@infradead.org> wrote: > > On Thu, May 22, 2014 at 02:58:18PM +0200, Peter Zijlstra wrote: > >> --- > >> diff --git a/kernel/sched/core.c b/kernel/sched/core.c > >> index 4ea7b3f1a087..a5da85fb3570 100644 > >> --- a/kernel/sched/core.c > >> +++ b/kernel/sched/core.c > >> @@ -546,12 +546,38 @@ static bool set_nr_and_not_polling(struct > >> task_struct *p) > >> struct thread_info *ti = task_thread_info(p); > >> return !(fetch_or(&ti->flags, _TIF_NEED_RESCHED) & > >> _TIF_POLLING_NRFLAG); > >> } > >> + > >> +/* > >> + * Atomically set TIF_NEED_RESCHED if TIF_POLLING_NRFLAG is set. > >> + */ > >> +static bool set_nr_if_polling(struct task_struct *p) > >> +{ > >> + struct thread_info *ti = task_thread_info(p); > >> + typeof(ti->flags) old, val = ti->flags; > >> + > >> + for (;;) { > >> + if (!(val & _TIF_POLLING_NRFLAG)) > >> + return false; > >> + if (val & _TIF_NEED_RESCHED) > >> + return true; > > > > Hmm, I think this is racy, false would be safer. If its already set we > > might already be past the sched_ttwu_pending() invocation, while if its > > clear and we're the one to set it, we're guaranteed not. > > > >> + old = cmpxchg(&ti->flags, val, val | _TIF_NEED_RESCHED); > >> + if (old == val) > >> + return true; > >> + val = old; > >> + } > >> +} > > Do you have an updated patch? After fixing the MIME flow damage > (sigh), it doesn't apply to sched/core, which is my best guess for > what it's based on.
https://git.kernel.org/cgit/linux/kernel/git/peterz/queue.git/commit/?h=sched/core&id=c224d4fee677ecc72209903d330b643bcf0793d7 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/