From: Chen Xiao <abigwc@xxxxxxx> When sched_info_on returns 1,KVM_FEATURE_STEAL_TIME will be set, steal% can be seen in the virtual machine.The returned value of sched_info_on depends on delayacct_on. If nodelayacct is added to kernel boot cmdline,the KVM_FEATURE_STEAL_TIME will be turned off by setting delayacct_on to 0.When CONFIG_SCHEDSTATS is set, sched_info_on always returns 1, and adding nodelayacct to the cmdline cannot turn off the KVM_FEATURE_STEAL_TIME Sometimes the users do not want the running state of host to be perceived in the virtual machine, and intend to turn off KVM_FEATURE_STEAL_TIME. The requirement is not available, however, when CONFIG_SCHEDSTATS has been set.Modify the judgment criteria for being set up from KVM_FEATURE_STEAL_TIME, and it is only be judged by the value of delayacct_on. Signed-off-by: Chen Xiao <abigwc@xxxxxxxxx> --- arch/x86/kvm/cpuid.c | 2 +- arch/x86/kvm/x86.c | 8 ++++---- arch/x86/kvm/x86.h | 10 ++++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 7e042e3..d38da09 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -623,7 +623,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, (1 << KVM_FEATURE_PV_TLB_FLUSH) | (1 << KVM_FEATURE_ASYNC_PF_VMEXIT); - if (sched_info_on()) + if (kvm_feature_steal_on()) entry->eax |= (1 << KVM_FEATURE_STEAL_TIME); entry->ebx = 0; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2b812b3..8371d5c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2424,8 +2424,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) return 1; break; case MSR_KVM_STEAL_TIME: - - if (unlikely(!sched_info_on())) + if (unlikely(!kvm_feature_steal_on())) return 1; if (data & KVM_STEAL_RESERVED_MASK) @@ -3101,7 +3100,8 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) vcpu->cpu = cpu; } - kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu); + if (kvm_feature_steal_on()) + kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu); } static void kvm_steal_time_set_preempted(struct kvm_vcpu *vcpu) @@ -7291,7 +7291,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) r = 1; goto out; } - if (kvm_check_request(KVM_REQ_STEAL_UPDATE, vcpu)) + if (kvm_feature_steal_on() + && kvm_check_request(KVM_REQ_STEAL_UPDATE, vcpu)) record_steal_time(vcpu); if (kvm_check_request(KVM_REQ_SMI, vcpu)) process_smi(vcpu); diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index 257f276..9e7c078 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -338,4 +338,14 @@ static inline void kvm_after_interrupt(struct kvm_vcpu *vcpu) __this_cpu_write(current_vcpu, NULL); } +static inline int kvm_feature_steal_on(void) +{ +#ifdef CONFIG_TASK_DELAY_ACCT + extern int delayacct_on; + return delayacct_on; +#else + return 0; +#endif +} + #endif -- 1.8.3.1