KVM: PPC: Book3S HV P9: Use large decrementer for HDEC
authorNicholas Piggin <npiggin@gmail.com>
Tue, 23 Nov 2021 09:51:43 +0000 (19:51 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 24 Nov 2021 10:08:57 +0000 (21:08 +1100)
On processors that don't suppress the HDEC exceptions when LPCR[HDICE]=0,
this could help reduce needless guest exits due to leftover exceptions on
entering the guest.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20211123095231.1036501-6-npiggin@gmail.com
arch/powerpc/include/asm/time.h
arch/powerpc/kernel/time.c
arch/powerpc/kvm/book3s_hv_p9_entry.c

index fd09b47..69b6be6 100644 (file)
@@ -18,6 +18,8 @@
 #include <asm/vdso/timebase.h>
 
 /* time.c */
+extern u64 decrementer_max;
+
 extern unsigned long tb_ticks_per_jiffy;
 extern unsigned long tb_ticks_per_usec;
 extern unsigned long tb_ticks_per_sec;
index 374950a..2769d56 100644 (file)
@@ -88,6 +88,7 @@ static struct clocksource clocksource_timebase = {
 
 #define DECREMENTER_DEFAULT_MAX 0x7FFFFFFF
 u64 decrementer_max = DECREMENTER_DEFAULT_MAX;
+EXPORT_SYMBOL_GPL(decrementer_max); /* for KVM HDEC */
 
 static int decrementer_set_next_event(unsigned long evt,
                                      struct clock_event_device *dev);
index 961b3d7..0ff9ddb 100644 (file)
@@ -504,7 +504,8 @@ tm_return_to_guest:
                vc->tb_offset_applied = 0;
        }
 
-       mtspr(SPRN_HDEC, 0x7fffffff);
+       /* HDEC must be at least as large as DEC, so decrementer_max fits */
+       mtspr(SPRN_HDEC, decrementer_max);
 
        save_clear_guest_mmu(kvm, vcpu);
        switch_mmu_to_host(kvm, host_pidr);