mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Josh Triplett <josh@joshtriplett.org>
Subject: [PATCH 4/4 RFC] rcu: New rcu_user_enter_irq() and rcu_user_exit_irq() APIs
Date: Mon, 28 Nov 2011 22:24:47 +0100	[thread overview]
Message-ID: <1322515487-18690-5-git-send-email-fweisbec@gmail.com> (raw)
In-Reply-To: <1322515487-18690-1-git-send-email-fweisbec@gmail.com>

A CPU running in adaptive tickless mode wants to enter into
RCU extended quiescent state while running in userspace. This
way we can shut down the tick that is usually needed on each
CPU for the needs of RCU.

Typically, RCU enters the extended quiescent state when we resume
to userspace through a syscall or exception exit, this is done
using rcu_user_enter(). Then RCU exit this state by calling
rcu_user_exit() from syscall or exception entry.

However there are two other points where we may want to enter
or exit this state. Some remote CPU may require a tickless CPU
to restart its tick for any reason and send it an IPI for
this purpose. As we restart the tick, we don't want to resume
from the IPI in RCU extended quiescent state anymore.
Similarly we may stop the tick from an interrupt in userspace and
we need to be able to enter RCU extended quiescent state when we
resume from this interrupt to userspace.

To these ends, we provide two new APIs:

- rcu_user_enter_irq(). This must be called from a non-nesting
interrupt betwenn rcu_irq_enter() and rcu_irq_exit().
After the irq calls rcu_irq_exit(), we'll run into RCU extended
quiescent state.

- rcu_user_exit_irq(). This must be called from a non-nesting
interrupt, interrupting an RCU extended quiescent state, and
between rcu_irq_enter() and rcu_irq_exit(). After the irq calls
rcu_irq_exit(), we'll prevent from resuming the RCU extended
quiescent.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Josh Triplett <josh@joshtriplett.org>
---
 kernel/rcutree.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/kernel/rcutree.c b/kernel/rcutree.c
index 00a9fba..a7906c9 100644
--- a/kernel/rcutree.c
+++ b/kernel/rcutree.c
@@ -402,6 +402,18 @@ void rcu_user_enter(void)
 	__rcu_idle_enter();
 }
 
+void rcu_user_enter_irq(void)
+{
+	unsigned long flags;
+	struct rcu_dynticks *rdtp;
+
+	local_irq_save(flags);
+	rdtp = &__get_cpu_var(rcu_dynticks);
+	WARN_ON_ONCE(rdtp->dynticks_nesting == 1);
+	rdtp->dynticks_nesting = 1;
+	local_irq_restore(flags);
+}
+
 /**
  * rcu_irq_exit - inform RCU that current CPU is exiting irq towards idle
  *
@@ -503,6 +515,18 @@ void rcu_user_exit(void)
 	__rcu_idle_exit();
 }
 
+void rcu_user_exit_irq(void)
+{
+	unsigned long flags;
+	struct rcu_dynticks *rdtp;
+
+	local_irq_save(flags);
+	rdtp = &__get_cpu_var(rcu_dynticks);
+	WARN_ON_ONCE(rdtp->dynticks_nesting != 1);
+	rdtp->dynticks_nesting = (LLONG_MAX / 2) + 1;
+	local_irq_restore(flags);
+}
+
 /**
  * rcu_irq_enter - inform RCU that current CPU is entering irq away from idle
  *
-- 
1.7.5.4


  parent reply	other threads:[~2011-11-28 21:25 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-28 21:24 [PATCH 0/4] rcu: Make new RCU dynticks API work with nohz cpusets Frederic Weisbecker
2011-11-28 21:24 ` [PATCH 1/4] rcu: Don't check irq nesting from rcu idle entry/exit Frederic Weisbecker
2011-11-29  0:22   ` Paul E. McKenney
2011-11-29  0:26     ` Frederic Weisbecker
2011-11-29  0:39       ` Paul E. McKenney
2011-11-29  0:58         ` Frederic Weisbecker
2011-11-28 21:24 ` [PATCH 2/4] rcu: Irq nesting is always 0 on rcu_enter_idle_common Frederic Weisbecker
2011-11-29  0:29   ` Paul E. McKenney
2011-11-29  1:00     ` Frederic Weisbecker
2011-11-28 21:24 ` [PATCH 3/4 RFC] rcu: New rcu_user_enter() and rcu_user_exit() APIs Frederic Weisbecker
2011-11-28 21:24 ` Frederic Weisbecker [this message]
2011-11-28 21:53   ` [PATCH 4/4 RFC] rcu: New rcu_user_enter_irq() and rcu_user_exit_irq() APIs Josh Triplett
2011-11-29  1:00     ` Paul E. McKenney
2011-11-29  5:21       ` Josh Triplett
2011-11-29 14:05       ` Frederic Weisbecker
2011-11-29 18:23         ` Paul E. McKenney
2011-11-29 13:53     ` Frederic Weisbecker
2011-11-29  5:22 ` [PATCH 0/4] rcu: Make new RCU dynticks API work with nohz cpusets Josh Triplett
2011-11-29  5:43   ` Paul E. McKenney
2011-11-29  8:48     ` Josh Triplett
2011-11-29 17:44       ` Paul E. McKenney
2011-11-29 18:07         ` Frederic Weisbecker

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=1322515487-18690-5-git-send-email-fweisbec@gmail.com \
    --to=fweisbec@gmail.com \
    --cc=josh@joshtriplett.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    /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

all inboxes | Powered by JetHome®