All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4] KVM: x86/xen: Update Xen CPUID Leaf 4 (tsc info) sub-leaves, if present
@ 2022-06-22 15:17 Paul Durrant
  2022-06-27 15:19 ` Sean Christopherson
  0 siblings, 1 reply; 3+ messages in thread
From: Paul Durrant @ 2022-06-22 15:17 UTC (permalink / raw)
  To: x86, kvm, linux-kernel
  Cc: Paul Durrant, David Woodhouse, Paolo Bonzini,
	Sean Christopherson, Vitaly Kuznetsov, Wanpeng Li, Jim Mattson,
	Joerg Roedel, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
	Dave Hansen, H. Peter Anvin

The scaling information in subleaf 1 should match the values set by KVM in
the 'vcpu_info' sub-structure 'time_info' (a.k.a. pvclock_vcpu_time_info)
which is shared with the guest, but is not directly available to the VMM.
The offset values are not set since a TSC offset is already applied.
The TSC frequency should also be set in sub-leaf 2.

Cache pointers to the sub-leaves when CPUID is updated by the VMM and
populate the relevant information prior to entering the guest.

Signed-off-by: Paul Durrant <pdurrant@amazon.com>
---
Cc: David Woodhouse <dwmw2@infradead.org>

v2:
 - Make sure sub-leaf pointers are NULLed if the time leaf is removed

v3:
 - Add leaf limit check in kvm_xen_set_cpuid()

v4:
 - Update commit comment
---
 arch/x86/include/asm/kvm_host.h |  2 ++
 arch/x86/kvm/cpuid.c            |  2 ++
 arch/x86/kvm/x86.c              |  1 +
 arch/x86/kvm/xen.c              | 49 +++++++++++++++++++++++++++++++++
 arch/x86/kvm/xen.h              | 10 +++++++
 5 files changed, 64 insertions(+)

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 1038ccb7056a..f77a4940542f 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -638,6 +638,8 @@ struct kvm_vcpu_xen {
 	struct hrtimer timer;
 	int poll_evtchn;
 	struct timer_list poll_timer;
+	struct kvm_cpuid_entry2 *tsc_info_1;
+	struct kvm_cpuid_entry2 *tsc_info_2;
 };
 
 struct kvm_vcpu_arch {
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index d47222ab8e6e..eb6cd88c974a 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -25,6 +25,7 @@
 #include "mmu.h"
 #include "trace.h"
 #include "pmu.h"
+#include "xen.h"
 
 /*
  * Unlike "struct cpuinfo_x86.x86_capability", kvm_cpu_caps doesn't need to be
@@ -310,6 +311,7 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
 	    __cr4_reserved_bits(guest_cpuid_has, vcpu);
 
 	kvm_hv_set_cpuid(vcpu);
+	kvm_xen_set_cpuid(vcpu);
 
 	/* Invoke the vendor callback only after the above state is updated. */
 	static_call(kvm_x86_vcpu_after_set_cpuid)(vcpu);
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 00e23dc518e0..8b45f9975e45 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3123,6 +3123,7 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
 	if (vcpu->xen.vcpu_time_info_cache.active)
 		kvm_setup_guest_pvclock(v, &vcpu->xen.vcpu_time_info_cache, 0);
 	kvm_hv_setup_tsc_page(v->kvm, &vcpu->hv_clock);
+	kvm_xen_setup_tsc_info(v);
 	return 0;
 }
 
diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c
index 610beba35907..08e65ec6c793 100644
--- a/arch/x86/kvm/xen.c
+++ b/arch/x86/kvm/xen.c
@@ -10,6 +10,9 @@
 #include "xen.h"
 #include "hyperv.h"
 #include "lapic.h"
+#include "cpuid.h"
+
+#include <asm/xen/cpuid.h>
 
 #include <linux/eventfd.h>
 #include <linux/kvm_host.h>
@@ -1855,3 +1858,49 @@ void kvm_xen_destroy_vm(struct kvm *kvm)
 	if (kvm->arch.xen_hvm_config.msr)
 		static_branch_slow_dec_deferred(&kvm_xen_enabled);
 }
+
+void kvm_xen_set_cpuid(struct kvm_vcpu *vcpu)
+{
+	u32 base = 0;
+	u32 limit;
+	u32 function;
+
+	vcpu->arch.xen.tsc_info_1 = NULL;
+	vcpu->arch.xen.tsc_info_2 = NULL;
+
+	for_each_possible_hypervisor_cpuid_base(function) {
+		struct kvm_cpuid_entry2 *entry = kvm_find_cpuid_entry(vcpu, function, 0);
+
+		if (entry &&
+		    entry->ebx == XEN_CPUID_SIGNATURE_EBX &&
+		    entry->ecx == XEN_CPUID_SIGNATURE_ECX &&
+		    entry->edx == XEN_CPUID_SIGNATURE_EDX) {
+			base = function;
+			limit = entry->eax;
+			break;
+		}
+	}
+	if (!base)
+		return;
+
+	function = base | XEN_CPUID_LEAF(3);
+	if (function > limit)
+		return;
+
+	vcpu->arch.xen.tsc_info_1 = kvm_find_cpuid_entry(vcpu, function, 1);
+	vcpu->arch.xen.tsc_info_2 = kvm_find_cpuid_entry(vcpu, function, 2);
+}
+
+void kvm_xen_setup_tsc_info(struct kvm_vcpu *vcpu)
+{
+	struct kvm_cpuid_entry2 *entry = vcpu->arch.xen.tsc_info_1;
+
+	if (entry) {
+		entry->ecx = vcpu->arch.hv_clock.tsc_to_system_mul;
+		entry->edx = vcpu->arch.hv_clock.tsc_shift;
+	}
+
+	entry = vcpu->arch.xen.tsc_info_2;
+	if (entry)
+		entry->eax = vcpu->arch.hw_tsc_khz;
+}
diff --git a/arch/x86/kvm/xen.h b/arch/x86/kvm/xen.h
index 532a535a9e99..1afb663318a9 100644
--- a/arch/x86/kvm/xen.h
+++ b/arch/x86/kvm/xen.h
@@ -32,6 +32,8 @@ int kvm_xen_set_evtchn_fast(struct kvm_xen_evtchn *xe,
 int kvm_xen_setup_evtchn(struct kvm *kvm,
 			 struct kvm_kernel_irq_routing_entry *e,
 			 const struct kvm_irq_routing_entry *ue);
+void kvm_xen_set_cpuid(struct kvm_vcpu *vcpu);
+void kvm_xen_setup_tsc_info(struct kvm_vcpu *vcpu);
 
 static inline bool kvm_xen_msr_enabled(struct kvm *kvm)
 {
@@ -135,6 +137,14 @@ static inline bool kvm_xen_timer_enabled(struct kvm_vcpu *vcpu)
 {
 	return false;
 }
+
+static inline void kvm_xen_set_cpuid(struct kvm_vcpu *vcpu)
+{
+}
+
+static inline void kvm_xen_setup_tsc_info(struct kvm_vcpu *vcpu)
+{
+}
 #endif
 
 int kvm_xen_hypercall(struct kvm_vcpu *vcpu);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v4] KVM: x86/xen: Update Xen CPUID Leaf 4 (tsc info) sub-leaves, if present
  2022-06-22 15:17 [PATCH v4] KVM: x86/xen: Update Xen CPUID Leaf 4 (tsc info) sub-leaves, if present Paul Durrant
@ 2022-06-27 15:19 ` Sean Christopherson
  2022-06-27 15:23   ` Durrant, Paul
  0 siblings, 1 reply; 3+ messages in thread
From: Sean Christopherson @ 2022-06-27 15:19 UTC (permalink / raw)
  To: Paul Durrant
  Cc: x86, kvm, linux-kernel, David Woodhouse, Paolo Bonzini,
	Vitaly Kuznetsov, Wanpeng Li, Jim Mattson, Joerg Roedel,
	Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen,
	H. Peter Anvin

On Wed, Jun 22, 2022, Paul Durrant wrote:
> The scaling information in subleaf 1 should match the values set by KVM in
> the 'vcpu_info' sub-structure 'time_info' (a.k.a. pvclock_vcpu_time_info)
> which is shared with the guest, but is not directly available to the VMM.
> The offset values are not set since a TSC offset is already applied.
> The TSC frequency should also be set in sub-leaf 2.
> 
> Cache pointers to the sub-leaves when CPUID is updated by the VMM and
> populate the relevant information prior to entering the guest.

All of my comments about the code still apply.

https://lore.kernel.org/all/YrMqtHzNSean+qkh@google.com

> Signed-off-by: Paul Durrant <pdurrant@amazon.com>
> ---
> Cc: David Woodhouse <dwmw2@infradead.org>

Cc: can go in the changelog, it's helpful info to carry with the commit as it
documents who was made aware of the patch, e.g. show who may have had a cance to
object/review.

> 
> v2:
>  - Make sure sub-leaf pointers are NULLed if the time leaf is removed
> 
> v3:
>  - Add leaf limit check in kvm_xen_set_cpuid()
> 
> v4:
>  - Update commit comment

Please start with the most recent verison and work backardwards, that way reviewers
can quickly see the delta for _this_ version.  I.e.


v4:

v3:

v2:

v1:

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH v4] KVM: x86/xen: Update Xen CPUID Leaf 4 (tsc info) sub-leaves, if present
  2022-06-27 15:19 ` Sean Christopherson
@ 2022-06-27 15:23   ` Durrant, Paul
  0 siblings, 0 replies; 3+ messages in thread
From: Durrant, Paul @ 2022-06-27 15:23 UTC (permalink / raw)
  To: Sean Christopherson
  Cc: x86, kvm, linux-kernel, David Woodhouse, Paolo Bonzini,
	Vitaly Kuznetsov, Wanpeng Li, Jim Mattson, Joerg Roedel,
	Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen,
	H. Peter Anvin

> -----Original Message-----
> From: Sean Christopherson <seanjc@google.com>
> Sent: 27 June 2022 16:19
> To: Durrant, Paul <pdurrant@amazon.co.uk>
> Cc: x86@kernel.org; kvm@vger.kernel.org; linux-kernel@vger.kernel.org; David Woodhouse
> <dwmw2@infradead.org>; Paolo Bonzini <pbonzini@redhat.com>; Vitaly Kuznetsov <vkuznets@redhat.com>;
> Wanpeng Li <wanpengli@tencent.com>; Jim Mattson <jmattson@google.com>; Joerg Roedel <joro@8bytes.org>;
> Thomas Gleixner <tglx@linutronix.de>; Ingo Molnar <mingo@redhat.com>; Borislav Petkov <bp@alien8.de>;
> Dave Hansen <dave.hansen@linux.intel.com>; H. Peter Anvin <hpa@zytor.com>
> Subject: RE: [EXTERNAL][PATCH v4] KVM: x86/xen: Update Xen CPUID Leaf 4 (tsc info) sub-leaves, if
> present
> 
> CAUTION: This email originated from outside of the organization. Do not click links or open
> attachments unless you can confirm the sender and know the content is safe.
> 
> 
> 
> On Wed, Jun 22, 2022, Paul Durrant wrote:
> > The scaling information in subleaf 1 should match the values set by KVM in
> > the 'vcpu_info' sub-structure 'time_info' (a.k.a. pvclock_vcpu_time_info)
> > which is shared with the guest, but is not directly available to the VMM.
> > The offset values are not set since a TSC offset is already applied.
> > The TSC frequency should also be set in sub-leaf 2.
> >
> > Cache pointers to the sub-leaves when CPUID is updated by the VMM and
> > populate the relevant information prior to entering the guest.
> 
> All of my comments about the code still apply.
> 
> https://lore.kernel.org/all/YrMqtHzNSean+qkh@google.com
> 

Apologies. Not sure how I missed them; I'll send a response shortly.

> > Signed-off-by: Paul Durrant <pdurrant@amazon.com>
> > ---
> > Cc: David Woodhouse <dwmw2@infradead.org>
> 
> Cc: can go in the changelog, it's helpful info to carry with the commit as it
> documents who was made aware of the patch, e.g. show who may have had a cance to
> object/review.
> 
> >
> > v2:
> >  - Make sure sub-leaf pointers are NULLed if the time leaf is removed
> >
> > v3:
> >  - Add leaf limit check in kvm_xen_set_cpuid()
> >
> > v4:
> >  - Update commit comment
> 
> Please start with the most recent verison and work backardwards, that way reviewers
> can quickly see the delta for _this_ version.  I.e.
> 
> 
> v4:
> 
> v3:
> 
> v2:
> 
> v1:

Ok.

  Paul


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-06-27 15:27 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-22 15:17 [PATCH v4] KVM: x86/xen: Update Xen CPUID Leaf 4 (tsc info) sub-leaves, if present Paul Durrant
2022-06-27 15:19 ` Sean Christopherson
2022-06-27 15:23   ` Durrant, Paul

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.