Re: schedule_delayed_work with a 0 jiffy delay

From: Tejun Heo
Date: Sun Sep 28 2014 - 17:13:29 EST


Hello, Joe.

On Sun, Sep 28, 2014 at 12:39:34PM -0400, Joe Lawrence wrote:
> On Sun, 28 Sep 2014, Tejun Heo wrote:
> > Hello, Joe.
> >
> > On Fri, Sep 26, 2014 at 10:52:27AM -0400, Joe Lawrence wrote:
> > ...
> > > I was wondering if such behavior was expected on !PREEMPT kernels,
> > > especially after b22ce2785d97 "workqueue: cond_resched() after
> > > processing each work item". In the ftraces I've observed from the RCU
> > > stall, cond_resched() never seems to schedule. Under what conditions
> > > would it be expected to do so?
> >
> > Hmmm... it should yield if there's a higher priority task scheduled.
> > Maybe the workqueue in question is a highpri one?
>
> I don't believe any high priority tasks or workqueues are involved here.
> Consider a synthetic repro module like:
...
> When I load this, "kworker/4:1" goes to 100% CPU and the RCU grace
> periods reported by rcusched freeze on CPU4 for minutes at a time.
>
> > > Changing the worker function to reschedule with at least 1 jiffy avoids
> > > this problem -- I was just curious if a fix at that end was appropriate.
> >
> > The fact that 0 delay means immediate execution is depended upon in
> > multiple places and changing it will break other things. The
> > workqueue user itself sounds buggy to me. Can't that be fixed?
>
> Certainly modifying the workqueue user should be sufficient here. I was
> only wondering if the cond_resched in process_one_work was expected to
> give the CPU some breathing room in this scenario.

It yields iff there are other higher priority tasks to run. I haven't
dug the code but if sched RCU is using and sched RCU implements grace
periods passively (e.g. something like if all tasks have switched
since point X), cond_resched() is gonna be able stall RCU grace
periods by running continuously in the absense of higher priority task
to run on the same CPU.

That said, RCU could have implemented a workaround for situations like
that in the meantime so it could be worthwhile to test mainline.

Thanks.

--
tejun
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/