Thread (32 messages) 32 messages, 4 authors, 2018-10-19

Re: [PATCH RFC] doc: rcu: remove obsolete (non-)requirement about disabling preemption

From: Steven Rostedt <rostedt@goodmis.org>
Date: 2018-10-19 02:52:28
Also in: lkml

On Thu, 18 Oct 2018 19:25:29 -0700
Joel Fernandes [off-list ref] wrote:
On Thu, Oct 18, 2018 at 09:50:35PM -0400, Steven Rostedt wrote:
quoted
On Thu, 18 Oct 2018 18:26:45 -0700
Joel Fernandes [off-list ref] wrote:
  
quoted
Yes, local_irq_restore is light weight, and does not check for reschedules.

I was thinking of case where ksoftirqd is woken up, but does not run unless
we set the NEED_RESCHED flag. But that should get set anyway since probably
ksoftirqd is of high enough priority than the currently running task..

Roughly speaking the scenario could be something like:

rcu_read_lock();
                 <-- IPI comes in for the expedited GP, sets exp_hint
local_irq_disable();
// do a bunch of stuff
rcu_read_unlock();   <-- This calls the rcu_read_unlock_special which raises
                         the soft irq, and wakesup softirqd.  
If softirqd is of higher priority than the current running task, then
the try_to_wake_up() will set NEED_RESCHED of the current task here.
  
Yes, only *if*. On my system, ksoftirqd is CFS nice 0. I thought expedited
grace periods are quite important and they should complete quickly which is
the whole reason for interrupting rcu read sections with an IPI and stuff.
IMO there should be no harm in setting NEED_RESCHED unconditionally anyway
for possible benefit of systems where the ksoftirqd is not of higher priority
than the currently running task, and we need to run it soon on the CPU. But
I'm Ok with whatever Paul and you want to do here.

Setting NEED_RESCHED unconditionally wont help. Because even if we call
schedule() ksoftirqd will not be scheduled! If it's CFS nice 0, and the
current task still has quota to run, if you call schedule, you'll just
waste time calculating that the current task should still be running.
It's equivalent to calling yield() (which is why we removed all yield()
users in the kernel, because *all* of them were buggy!). This is *why*
it only calls schedule *if* softirqd is of higher priority.

-- Steve
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help