On 4/29/2024 9:27 PM, Alejandro Jimenez wrote: > Add a stat to query when PIT is in reinject mode, which can have a large > performance impact due to disabling SVM AVIC. > When using in-kernel irqchip, QEMU and KVM default to creating a PIT in > reinject mode, since this is necessary for old guest operating systems that > use the PIT for timing. Unfortunately, reinject mode relies on EOI > interception and so SVM AVIC must be inhibited when the PIT is set up using > this mode. > > Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@xxxxxxxxxx> Reviewed-by: Vasant Hegde <vasant.hegde@xxxxxxx> -Vasant > --- > arch/x86/include/asm/kvm_host.h | 1 + > arch/x86/kvm/i8254.c | 2 ++ > arch/x86/kvm/x86.c | 3 ++- > 3 files changed, 5 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index f3b40cfebec4..e7e3213cefae 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -1535,6 +1535,7 @@ struct kvm_vm_stat { > u64 max_mmu_page_hash_collisions; > u64 max_mmu_rmap_size; > u64 synic_auto_eoi_used; > + u64 pit_reinject_mode; > }; > > struct kvm_vcpu_stat { > diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c > index cd57a517d04a..44e593e909a1 100644 > --- a/arch/x86/kvm/i8254.c > +++ b/arch/x86/kvm/i8254.c > @@ -316,6 +316,8 @@ void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject) > kvm_unregister_irq_mask_notifier(kvm, 0, &pit->mask_notifier); > } > > + kvm->stat.pit_reinject_mode = reinject; > + > atomic_set(&ps->reinject, reinject); > } > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 27e339133068..03cb933920cb 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -257,7 +257,8 @@ const struct _kvm_stats_desc kvm_vm_stats_desc[] = { > STATS_DESC_ICOUNTER(VM, nx_lpage_splits), > STATS_DESC_PCOUNTER(VM, max_mmu_rmap_size), > STATS_DESC_PCOUNTER(VM, max_mmu_page_hash_collisions), > - STATS_DESC_IBOOLEAN(VM, synic_auto_eoi_used) > + STATS_DESC_IBOOLEAN(VM, synic_auto_eoi_used), > + STATS_DESC_IBOOLEAN(VM, pit_reinject_mode) > }; > > const struct kvm_stats_header kvm_vm_stats_header = {