Messages in this thread | | | Date | Mon, 05 May 2014 20:14:19 +0200 | From | Denys Vlasenko <> | Subject | Re: [PATCH 4/4] nohz: Fix iowait overcounting if iowait task migrates |
| |
On 04/29/2014 06:20 PM, Frederic Weisbecker wrote: >> index 268a45e..ffea757 100644 >> --- a/kernel/sched/core.c >> +++ b/kernel/sched/core.c >> @@ -4218,7 +4218,14 @@ void __sched io_schedule(void) >> current->in_iowait = 1; >> schedule(); >> current->in_iowait = 0; >> +#ifdef CONFIG_NO_HZ_COMMON >> + if (atomic_dec_and_test(&rq->nr_iowait)) { >> + if (raw_smp_processor_id() != cpu_of(rq)) >> + tick_nohz_iowait_to_idle(cpu_of(rq)); > > Note that even using seqlock doesn't alone help to fix the preemption issue > when the above may overwrite the exittime of the next last iowait task from > the old rq.
Meaning: between atomic_dec_and_test(&rq->nr_iowait) going to zero and tick_nohz_iowait_to_idle(), CPU left idle, acquired a new task, this task submitted IO, IO completed, this second task also reached this place, its atomic_dec_and_test(&rq->nr_iowait) went to zero and now we race doing
ts->iowait_exittime = now;
from two tasks?
This shouldn't be a problem anyway since the value of "now" in this situation will be nearly the same - provided that (a) store is atomic (no corruption due to the race) and (b) we are careful when we are using it (for example, we clamp it to be not earlier than idle start time).
Do you see a problem here which I miss?
| |