]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm,rcu,nohz: use RCU extended quiescent state when running KVM guest
authorRik van Riel <riel@redhat.com>
Tue, 10 Feb 2015 20:27:54 +0000 (15:27 -0500)
committerFrederic Weisbecker <fweisbec@gmail.com>
Mon, 9 Mar 2015 14:43:03 +0000 (15:43 +0100)
The host kernel is not doing anything while the CPU is executing
a KVM guest VCPU, so it can be marked as being in an extended
quiescent state, identical to that used when running user space
code.

The only exception to that rule is when the host handles an
interrupt, which is already handled by the irq code, which
calls rcu_irq_enter and rcu_irq_exit.

The guest_enter and guest_exit functions already switch vtime
accounting independent of context tracking. Leave those calls
where they are, instead of moving them into the context tracking
code.

Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Rik van Riel <riel@redhat.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Will deacon <will.deacon@arm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
include/linux/context_tracking.h
include/linux/context_tracking_state.h
include/linux/kvm_host.h

index 7f1810a3b5a4f1044f3742e97c76da1f325ea249..2821838256b4f728640819f9f81842954261ec03 100644 (file)
@@ -81,10 +81,16 @@ static inline void guest_enter(void)
                vtime_guest_enter(current);
        else
                current->flags |= PF_VCPU;
+
+       if (context_tracking_is_enabled())
+               context_tracking_enter(CONTEXT_GUEST);
 }
 
 static inline void guest_exit(void)
 {
+       if (context_tracking_is_enabled())
+               context_tracking_exit(CONTEXT_GUEST);
+
        if (vtime_accounting_enabled())
                vtime_guest_exit(current);
        else
index ad4458588b4772b78d652fb8765f93431680e071..6b7b96a32b753a614ef36ea8bb6c1d5a83641b21 100644 (file)
@@ -15,6 +15,7 @@ struct context_tracking {
        enum ctx_state {
                CONTEXT_KERNEL = 0,
                CONTEXT_USER,
+               CONTEXT_GUEST,
        } state;
 };
 
index d12b2104d19b422a9e3357f7186d80702807fa3d..cc8c61c5459c5d9dff6e11a2bf84c7c289fd1614 100644 (file)
@@ -766,7 +766,8 @@ static inline void kvm_guest_enter(void)
         * one time slice). Lets treat guest mode as quiescent state, just like
         * we do with user-mode execution.
         */
-       rcu_virt_note_context_switch(smp_processor_id());
+       if (!context_tracking_cpu_is_enabled())
+               rcu_virt_note_context_switch(smp_processor_id());
 }
 
 static inline void kvm_guest_exit(void)