From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: David Woodhouse <dwmw2@infradead.org>
Cc: peterz@infradead.org, mhillenb@amazon.de,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH v2] kvm/x86: Inform RCU of quiescent state when entering guest mode
Date: Wed, 11 Jul 2018 11:36:45 -0700 [thread overview]
Message-ID: <20180711183645.GA23820@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180711182053.GA3593@linux.vnet.ibm.com>
On Wed, Jul 11, 2018 at 11:20:53AM -0700, Paul E. McKenney wrote:
> On Wed, Jul 11, 2018 at 07:01:01PM +0100, David Woodhouse wrote:
> > From: David Woodhouse <dwmw@amazon.co.uk>
> >
> > RCU can spend long periods of time waiting for a CPU which is actually in
> > KVM guest mode, entirely pointlessly. Treat it like the idle and userspace
> > modes, and don't wait for it.
> >
> > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
>
> And idiot here forgot about some of the debugging code in RCU's dyntick-idle
> code. I will reply with a fixed patch.
>
> The code below works just fine as long as you don't enable CONFIG_RCU_EQS_DEBUG,
> so should be OK for testing, just not for mainline.
And here is the updated code that allegedly avoids splatting when run with
CONFIG_RCU_EQS_DEBUG.
Thoughts?
Thanx, Paul
------------------------------------------------------------------------
commit 12cd59e49cf734f907f44b696e2c6e4b46a291c3
Author: David Woodhouse <dwmw@amazon.co.uk>
Date: Wed Jul 11 19:01:01 2018 +0100
kvm/x86: Inform RCU of quiescent state when entering guest mode
RCU can spend long periods of time waiting for a CPU which is actually in
KVM guest mode, entirely pointlessly. Treat it like the idle and userspace
modes, and don't wait for it.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
[ paulmck: Adjust to avoid bad advice I gave to dwmw, avoid WARN_ON()s. ]
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 0046aa70205a..b0c82f70afa7 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -7458,7 +7458,9 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_RELOAD;
}
+ rcu_kvm_enter();
kvm_x86_ops->run(vcpu);
+ rcu_kvm_exit();
/*
* Do this here before restoring debug registers on the host. And
diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h
index 7fa4fb9e899e..4b2d691e453f 100644
--- a/include/linux/rcutiny.h
+++ b/include/linux/rcutiny.h
@@ -85,6 +85,8 @@ static inline void rcu_virt_note_context_switch(int cpu) { }
static inline void rcu_cpu_stall_reset(void) { }
static inline void rcu_idle_enter(void) { }
static inline void rcu_idle_exit(void) { }
+static inline void rcu_kvm_enter(void) { }
+static inline void rcu_kvm_exit(void) { }
static inline void rcu_irq_enter(void) { }
static inline void rcu_irq_exit_irqson(void) { }
static inline void rcu_irq_enter_irqson(void) { }
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h
index 7f83179177d1..48ce58b53ece 100644
--- a/include/linux/rcutree.h
+++ b/include/linux/rcutree.h
@@ -55,6 +55,8 @@ void cond_synchronize_rcu(unsigned long oldstate);
void rcu_idle_enter(void);
void rcu_idle_exit(void);
+void rcu_kvm_enter(void);
+void rcu_kvm_exit(void);
void rcu_irq_enter(void);
void rcu_irq_exit(void);
void rcu_irq_enter_irqson(void);
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 765c81dd675e..0c0672faa6d1 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -583,6 +583,24 @@ void rcu_idle_enter(void)
rcu_eqs_enter(false);
}
+/**
+ * rcu_kvm_enter - inform RCU that current CPU is entering a guest OS
+ *
+ * Enter guest-OS mode, in other words, -leave- the mode in which RCU
+ * read-side critical sections can occur. (Though RCU read-side critical
+ * sections can occur in irq handlers from guest OSes, a possibility
+ * handled by irq_enter() and irq_exit().)
+ *
+ * If you add or remove a call to rcu_kvm_enter(), be sure to test with
+ * CONFIG_RCU_EQS_DEBUG=y.
+ */
+void rcu_kvm_enter(void)
+{
+ lockdep_assert_irqs_disabled();
+ rcu_eqs_enter(true);
+}
+EXPORT_SYMBOL_GPL(rcu_kvm_enter);
+
#ifdef CONFIG_NO_HZ_FULL
/**
* rcu_user_enter - inform RCU that we are resuming userspace.
@@ -747,6 +765,22 @@ void rcu_idle_exit(void)
local_irq_restore(flags);
}
+/**
+ * rcu_kvm_exit - inform RCU that current CPU is leaving a guest OS
+ *
+ * Exit guest-OS mode, in other words, -enter- the mode in which RCU
+ * read-side critical sections can occur.
+ *
+ * If you add or remove a call to rcu_kvm_exit(), be sure to test with
+ * CONFIG_RCU_EQS_DEBUG=y.
+ */
+void rcu_kvm_exit(void)
+{
+ lockdep_assert_irqs_disabled();
+ rcu_eqs_exit(true);
+}
+EXPORT_SYMBOL_GPL(rcu_kvm_exit);
+
#ifdef CONFIG_NO_HZ_FULL
/**
* rcu_user_exit - inform RCU that we are exiting userspace.
next prev parent reply other threads:[~2018-07-11 18:36 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
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 [this message]
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=20180711183645.GA23820@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=dwmw2@infradead.org \
--cc=kvm@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.