On Mon, Dec 18, 2023 at 07:13:27AM -0800, Sean Christopherson wrote: > On Mon, Dec 18, 2023, Tao Su wrote: > > When host doesn't support 5-level EPT, bits 51:48 of the guest physical > > address must all be zero, otherwise an EPT violation always occurs and > > current handler can't resolve this if the gpa is in RAM region. Hence, > > instruction will keep being executed repeatedly, which causes infinite > > EPT violation. > > > > Six KVM selftests are timeout due to this issue: > > kvm:access_tracking_perf_test > > kvm:demand_paging_test > > kvm:dirty_log_test > > kvm:dirty_log_perf_test > > kvm:kvm_page_table_test > > kvm:memslot_modification_stress_test > > > > The above selftests add a RAM region close to max_gfn, if host has 52 > > physical bits but doesn't support 5-level EPT, these will trigger infinite > > EPT violation when access the RAM region. > > > > Since current Intel CPUID doesn't report max guest physical bits like AMD, > > introduce kvm_mmu_tdp_maxphyaddr() to limit guest physical bits when tdp is > > enabled and report the max guest physical bits which is smaller than host. > > > > When guest physical bits is smaller than host, some GPA are illegal from > > guest's perspective, but are still legal from hardware's perspective, > > which should be trapped to inject #PF. Current KVM already has a parameter > > allow_smaller_maxphyaddr to support the case when guest.MAXPHYADDR < > > host.MAXPHYADDR, which is disabled by default when EPT is enabled, user > > can enable it when loading kvm-intel module. When allow_smaller_maxphyaddr > > is enabled and guest accesses an illegal address from guest's perspective, > > KVM will utilize EPT violation and emulate the instruction to inject #PF > > and determine #PF error code. > > No, fix the selftests, it's not KVM's responsibility to advertise the correct > guest.MAXPHYADDR. This patch is not for fixing these selftests, it is for fixing the issue exposed by the selftests. KVM has responsibility to report a correct guest.MAXPHYADDR, which lets userspace set a valid physical bits to KVM. Actually, KVM will stuck in a loop if it tries to build spte with any bit of bits[51:48] set, e.g., assign a huge RAM to guest. Thanks, Tao