From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: David Woodhouse <dwmw2@infradead.org>,
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 13:27:52 -0700 [thread overview]
Message-ID: <20180711202752.GC3593@linux.vnet.ibm.com> (raw)
In-Reply-To: <62e945ee-a58e-f9b3-279c-74cd0f5809da@de.ibm.com>
On Wed, Jul 11, 2018 at 08:39:36PM +0200, Christian Borntraeger wrote:
>
>
> On 07/11/2018 08:36 PM, Paul E. McKenney wrote:
> > 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();
>
> As indicated in my other mail. This is supposed to be handled in the guest_enter|exit_ calls around
> the run function. This would also handle other architectures. So if the guest_enter_irqoff code is
> not good enough, we should rather fix that instead of adding another rcu hint.
Something like this, on top of the earlier patch? I am not at all
confident of this patch because there might be other entry/exit
paths I am missing. Plus there might be RCU uses on the arch-specific
patch to and from the guest OS.
Thoughts?
Thanx, Paul
------------------------------------------------------------------------
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index b0c82f70afa7..0046aa70205a 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -7458,9 +7458,7 @@ 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/context_tracking.h b/include/linux/context_tracking.h
index d05609ad329d..8d2a9d3073ad 100644
--- a/include/linux/context_tracking.h
+++ b/include/linux/context_tracking.h
@@ -118,12 +118,12 @@ static inline void guest_enter_irqoff(void)
* one time slice). Lets treat guest mode as quiescent state, just like
* we do with user-mode execution.
*/
- if (!context_tracking_cpu_is_enabled())
- rcu_virt_note_context_switch(smp_processor_id());
+ rcu_kvm_enter();
}
static inline void guest_exit_irqoff(void)
{
+ rcu_kvm_exit();
if (context_tracking_is_enabled())
__context_tracking_exit(CONTEXT_GUEST);
@@ -143,12 +143,13 @@ static inline void guest_enter_irqoff(void)
*/
vtime_account_system(current);
current->flags |= PF_VCPU;
- rcu_virt_note_context_switch(smp_processor_id());
+ rcu_kvm_enter();
}
static inline void guest_exit_irqoff(void)
{
/* Flush the guest cputime we spent on the guest */
+ rcu_kvm_exit();
vtime_account_system(current);
current->flags &= ~PF_VCPU;
}
diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h
index 4b2d691e453f..a7aa5b3cfb81 100644
--- a/include/linux/rcutiny.h
+++ b/include/linux/rcutiny.h
@@ -81,7 +81,6 @@ static inline int rcu_needs_cpu(u64 basemono, u64 *nextevt)
* Take advantage of the fact that there is only one CPU, which
* allows us to ignore virtualization-based context switches.
*/
-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) { }
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h
index 48ce58b53ece..62b61e579bb4 100644
--- a/include/linux/rcutree.h
+++ b/include/linux/rcutree.h
@@ -34,17 +34,6 @@ void rcu_softirq_qs(void);
void rcu_note_context_switch(bool preempt);
int rcu_needs_cpu(u64 basem, u64 *nextevt);
void rcu_cpu_stall_reset(void);
-
-/*
- * Note a virtualization-based context switch. This is simply a
- * wrapper around rcu_note_context_switch(), which allows TINY_RCU
- * to save a few bytes. The caller must have disabled interrupts.
- */
-static inline void rcu_virt_note_context_switch(int cpu)
-{
- rcu_note_context_switch(false);
-}
-
void synchronize_rcu_expedited(void);
void kfree_call_rcu(struct rcu_head *head, rcu_callback_t func);
next prev parent reply other threads:[~2018-07-11 20:27 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
2018-07-11 18:39 ` Christian Borntraeger
2018-07-11 20:27 ` Paul E. McKenney [this message]
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=20180711202752.GC3593@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=borntraeger@de.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.