Messages in this thread | | | From | Andy Lutomirski <> | Date | Wed, 28 May 2014 17:01:41 -0700 | Subject | Re: [RFC][PATCH 0/8] sched,idle: need resched polling rework |
| |
On Thu, May 22, 2014 at 6:09 AM, Peter Zijlstra <peterz@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.
--Andy
-- Andy Lutomirski AMA Capital Management, LLC
| |