linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: David Woodhouse <dwmw2@infradead.org>,
	mhillenb@amazon.de, linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [RFC] Make need_resched() return true when rcu_urgent_qs requested
Date: Mon, 9 Jul 2018 09:44:20 -0700	[thread overview]
Message-ID: <20180709164420.GA8249@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180709163432.GV3593@linux.vnet.ibm.com>

On Mon, Jul 09, 2018 at 09:34:32AM -0700, Paul E. McKenney wrote:
> On Mon, Jul 09, 2018 at 05:26:32PM +0200, Peter Zijlstra wrote:
> > On Mon, Jul 09, 2018 at 07:29:32AM -0700, Paul E. McKenney wrote:
> > > OK, so here are our options:
> > > 
> > > 1.	Add the RCU conditional to need_resched(), as David suggests.
> > > 	Peter has concerns about overhead.
> > > 
> > > 2.	Create a new need_resched_rcu_qs() that is to be used when
> > > 	deciding whether or not to do cond_resched().  This would
> > > 	exact the overhead only where it is needed, but is one more
> > > 	thing for people to get wrong.
> > 
> > Also, with the crypto guys checking need_resched() in asm that won't
> > really work either.
> 
> Fair point!  Ease of use is a good thing, even within the Linux kernel.
> Or maybe especially within the Linux kernel...
> 
> > > 3.	Revert my changes to de-emphasize cond_resched_rcu_qs(),
> > > 	and go back to sprinkling cond_resched_rcu_qs() throughout
> > > 	the code.  This also is one more thing for people to get wrong,
> > > 	and might well eventually convert all cond_resched() calls to
> > > 	cond_resched_rcu_qs(), which sure seems like a failure mode to me.
> > 
> >  4a.	use resched_cpu() more agressive
> >  4b.	use the tick to set TIF_NEED_RESCHED when it finds rcu_urgent_qs
> > 	(avoids the IPI at the 'cost' of a slight delay in processing)
> 
> 4b sounds eminently reasonable to me!  Something like the (untested,
> probably doesn't even build) patch below?
> 
> David, any reason why this wouldn't work?  Seems to me that this would
> make need_resched() respond to RCU's need for quiescent states in a
> timely manner without need_resched() having to become heavier weight,
> but figured I should ask.
> 
> >  5.	make guest mode a quiescent state (like supposedly already done
> > 	for NOHZ_FULL) (but this would not help the crypto guys).
> > 
> >  6.	....
> > 
> > ok I ran out of ideas here I think.
> > 
> > 
> > So for PREEMPT the tick can check preempt_count() == 0 and if so, know
> > it _could_ have rescheduled and advance the qs, right? But since we
> > don't have a preempt count for !PREEMPT_COUNT kernels this doesn't work.
> > 
> > And thus we need to invoke actual scheduling events and then through the
> > schedule() callback RCU knows things happened.
> > 
> > 4b seems like something worth trying for !PREEMPT kernels I suppose
> 
> David is running a !PREEMPT kernel.
> 
> For PREEMPT kernels, the patch below results in a quiescent state for
> the CPU, and the forced schedule queues the task.  This queuing enables
> later RCU priority boosting (if enabled) once all other CPUs sharing
> the same leaf rcu_node structure have passed through quiescent states.
> 
> And yes, for PREEMPT kernels the scheduling-clock interrupt handler
> already checks for a quiescent state using a combination of
> preempt_count() (as you say, but ignoring the hardirq bits because
> we are in an interrupt handler) and current->rcu_read_lock_nesting.
> 
> So I believe that this will cover it.
> 
> Thoughts?

Updated per Peter's feedback on IRC.

							Thanx, Paul

------------------------------------------------------------------------

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 51919985f6cf..ccde5f8aff61 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2496,6 +2496,12 @@ void rcu_check_callbacks(int user)
 {
 	trace_rcu_utilization(TPS("Start scheduler-tick"));
 	raw_cpu_inc(rcu_data.ticks_this_gp);
+	if (smp_load_acquire(this_cpu_ptr(&rcu_dynticks.rcu_urgent_qs)) &&
+	   !is_idle_task(current)) {
+		set_tsk_need_resched(current);
+		set_preempt_need_resched();
+	}
+	__this_cpu_write(rcu_dynticks.rcu_urgent_qs, false);
 	rcu_flavor_check_callbacks(user);
 	if (rcu_pending())
 		invoke_rcu_core();


  reply	other threads:[~2018-07-09 16:42 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-06 14:53 [RFC] Make need_resched() return true when rcu_urgent_qs requested David Woodhouse
2018-07-06 16:29 ` Peter Zijlstra
2018-07-06 17:11   ` Paul E. McKenney
2018-07-06 17:14     ` David Woodhouse
2018-07-06 21:12       ` Paul E. McKenney
2018-07-09  8:58       ` Peter Zijlstra
2018-07-09  8:53     ` Peter Zijlstra
2018-07-09  9:18       ` David Woodhouse
2018-07-09 10:44         ` Peter Zijlstra
2018-07-09 10:56           ` David Woodhouse
2018-07-09 11:06             ` Peter Zijlstra
2018-07-09 11:12               ` David Woodhouse
2018-07-09 11:31                 ` Peter Zijlstra
2018-07-09 12:34               ` Paul E. McKenney
2018-07-09 12:47                 ` David Woodhouse
2018-07-09 14:30                   ` Paul E. McKenney
2018-07-09 12:55                 ` Peter Zijlstra
2018-07-09 12:57                   ` David Woodhouse
2018-07-09 13:02                   ` Peter Zijlstra
2018-07-09 14:29                     ` Paul E. McKenney
2018-07-09 14:43                       ` Peter Zijlstra
2018-07-09 14:54                         ` Paul E. McKenney
2018-07-09 15:26                       ` Peter Zijlstra
2018-07-09 16:34                         ` Paul E. McKenney
2018-07-09 16:44                           ` Paul E. McKenney [this message]
2018-07-09 18:50                           ` David Woodhouse
2018-07-09 20:34                             ` Paul E. McKenney
2018-07-09 20:35                               ` David Woodhouse
2018-07-09 20:42                                 ` Paul E. McKenney
2018-07-09 20:45                                   ` David Woodhouse
2018-07-09 21:05                                     ` Paul E. McKenney
2018-07-09 22:08                                       ` Paul E. McKenney
2018-07-11 10:57                                         ` David Woodhouse
2018-07-11 12:51                                           ` Paul E. McKenney
2018-07-11 12:58                                             ` David Woodhouse
2018-07-11 14:25                                               ` Paul E. McKenney
2018-07-11 14:23                                         ` David Woodhouse
2018-07-11 14:43                                           ` Paul E. McKenney
2018-07-11 16:49                                             ` Paul E. McKenney
2018-07-11 17:03                                               ` David Woodhouse
2018-07-11 17:48                                                 ` Paul E. McKenney
2018-07-11 18:01                                                   ` [PATCH v2] kvm/x86: Inform RCU of quiescent state when entering guest mode David Woodhouse
2018-07-11 18:20                                                     ` Paul E. McKenney
2018-07-11 18:36                                                       ` Paul E. McKenney
2018-07-11 18:39                                                         ` Christian Borntraeger
2018-07-11 20:27                                                           ` Paul E. McKenney
2018-07-11 20:54                                                             ` David Woodhouse
2018-07-11 21:09                                                               ` Paul E. McKenney
2018-07-11 21:11                                                             ` Christian Borntraeger
2018-07-11 21:32                                                               ` Paul E. McKenney
2018-07-11 21:39                                                                 ` Christian Borntraeger
2018-07-11 23:47                                                                   ` Paul E. McKenney
2018-07-12  8:31                                                                     ` David Woodhouse
2018-07-12 11:00                                                                       ` Christian Borntraeger
2018-07-12 11:10                                                                         ` David Woodhouse
2018-07-12 11:58                                                                           ` Christian Borntraeger
2018-07-12 12:04                                                                             ` Christian Borntraeger
2018-07-11 23:37                                                                 ` Paul E. McKenney
2018-07-12  2:15                                                                   ` Paul E. McKenney
2018-07-12  6:21                                                                   ` Christian Borntraeger
2018-07-12  9:52                                                                     ` David Woodhouse
2018-07-11 18:31                                                 ` [RFC] Make need_resched() return true when rcu_urgent_qs requested Christian Borntraeger
2018-07-11 20:17                                                   ` Paul E. McKenney
2018-07-11 20:19                                                     ` David Woodhouse
2018-07-11 21:08                                                       ` Paul E. McKenney
2018-07-12 12:00                                                         ` David Woodhouse
2018-07-12 12:53                                                           ` Paul E. McKenney
2018-07-12 16:17                                                             ` Paul E. McKenney
2018-07-16 15:40                                                               ` Paul E. McKenney
2018-07-17  8:19                                                                 ` David Woodhouse
2018-07-17 12:56                                                                   ` Paul E. McKenney
2018-07-18 15:36                                                                     ` Paul E. McKenney
2018-07-18 16:01                                                                       ` David Woodhouse
2018-07-18 16:37                                                                         ` Paul E. McKenney
2018-07-18 19:41                                                                           ` David Woodhouse
2018-07-18 20:17                                                                             ` Paul E. McKenney
2018-07-19  0:26                                                                               ` Frederic Weisbecker
2018-07-19  6:45                                                                               ` Christian Borntraeger
2018-07-19  7:20                                                                                 ` David Woodhouse
2018-07-19 10:23                                                                                   ` Christian Borntraeger
2018-07-19 12:55                                                                                     ` Paul E. McKenney
2018-07-19 13:14                                                                                   ` Frederic Weisbecker
2018-07-19 13:36                                                                                     ` David Woodhouse
2018-07-19 17:09                                                                           ` Paul E. McKenney
2018-07-23  8:08                                                                             ` David Woodhouse
2018-07-23 12:22                                                                               ` Paul E. McKenney
2018-07-19  0:32                                                 ` Frederic Weisbecker
2018-07-19  3:11                                                   ` Paul E. McKenney
2018-07-19  6:16                                                     ` David Woodhouse
2018-07-19 13:17                                                       ` Frederic Weisbecker
2018-07-19 13:15                                                     ` Frederic Weisbecker
2018-07-10  9:24                                   ` Peter Zijlstra
2018-07-10 16:26                                     ` Paul E. McKenney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180709164420.GA8249@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhillenb@amazon.de \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).