On 9/12/20 12:08 PM, Paolo Bonzini wrote: > On 11/09/20 21:27, Babu Moger wrote: >> The following series adds the support for PCID/INVPCID on AMD guests. >> While doing it re-structured the vmcb_control_area data structure to >> combine all the intercept vectors into one 32 bit array. Makes it easy >> for future additions. Re-arranged few pcid related code to make it common >> between SVM and VMX. >> >> INVPCID interceptions are added only when the guest is running with shadow >> page table enabled. In this case the hypervisor needs to handle the tlbflush >> based on the type of invpcid instruction. >> >> For the guests with nested page table (NPT) support, the INVPCID feature >> works as running it natively. KVM does not need to do any special handling. >> >> AMD documentation for INVPCID feature is available at "AMD64 Architecture >> Programmer’s Manual Volume 2: System Programming, Pub. 24593 Rev. 3.34(or later)" >> >> The documentation can be obtained at the links below: >> Link: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.amd.com%2Fsystem%2Ffiles%2FTechDocs%2F24593.pdf&data=02%7C01%7Cbabu.moger%40amd.com%7Cd2bca7c6209743a7fe0e08d8573e70fd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637355274033139116&sdata=C3EGywJcz3rAPmjckWGKbm7GkHR1Xyrl%2BIL9sEijhcQ%3D&reserved=0 >> Link: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.kernel.org%2Fshow_bug.cgi%3Fid%3D206537&data=02%7C01%7Cbabu.moger%40amd.com%7Cd2bca7c6209743a7fe0e08d8573e70fd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637355274033139116&sdata=29n8WNNpcUgVQRUyxbiSPcWJGTL5uV%2FaHgHXU1b9BjI%3D&reserved=0 >> --- >> >> v6: >> One minor change in patch #04. Otherwise same as v5. >> Updated all the patches by Reviewed-by. >> >> v5: >> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F159846887637.18873.14677728679411578606.stgit%40bmoger-ubuntu%2F&data=02%7C01%7Cbabu.moger%40amd.com%7Cd2bca7c6209743a7fe0e08d8573e70fd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637355274033139116&sdata=D7HvBj6OArmpKsiaZj0Qk3mIHWYOOUN23f53ajhQpOY%3D&reserved=0 >> All the changes are related to rebase. >> Aplies cleanly on mainline and kvm(master) tree. >> Resending it to get some attention. >> >> v4: >> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F159676101387.12805.18038347880482984693.stgit%40bmoger-ubuntu%2F&data=02%7C01%7Cbabu.moger%40amd.com%7Cd2bca7c6209743a7fe0e08d8573e70fd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637355274033139116&sdata=7og620g0qsxee7Wd60emz5YdbA44Al4tiUJX5n46MhE%3D&reserved=0 >> 1. Changed the functions __set_intercept/__clr_intercept/__is_intercept to >> to vmcb_set_intercept/vmcb_clr_intercept/vmcb_is_intercept by passing >> vmcb_control_area structure(Suggested by Paolo). >> 2. Rearranged the commit 7a35e515a7055 ("KVM: VMX: Properly handle kvm_read/write_guest_virt*()) >> to make it common across both SVM/VMX(Suggested by Jim Mattson). >> 3. Took care of few other comments from Jim Mattson. Dropped "Reviewed-by" >> on few patches which I have changed since v3. >> >> v3: >> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F159597929496.12744.14654593948763926416.stgit%40bmoger-ubuntu%2F&data=02%7C01%7Cbabu.moger%40amd.com%7Cd2bca7c6209743a7fe0e08d8573e70fd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637355274033139116&sdata=hvPNH827bmo1VL%2F%2FIv%2F%2ByQdVBygOpI1tkgQ6ASf5Wt8%3D&reserved=0 >> 1. Addressing the comments from Jim Mattson. Follow the v2 link below >> for the context. >> 2. Introduced the generic __set_intercept, __clr_intercept and is_intercept >> using native __set_bit, clear_bit and test_bit. >> 3. Combined all the intercepts vectors into single 32 bit array. >> 4. Removed set_intercept_cr, clr_intercept_cr, set_exception_intercepts, >> clr_exception_intercept etc. Used the generic set_intercept and >> clr_intercept where applicable. >> 5. Tested both L1 guest and l2 nested guests. >> >> v2: >> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F159234483706.6230.13753828995249423191.stgit%40bmoger-ubuntu%2F&data=02%7C01%7Cbabu.moger%40amd.com%7Cd2bca7c6209743a7fe0e08d8573e70fd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637355274033139116&sdata=rP%2BlRJ91tk1VXS3YX8TdP2L9vORiIj8gN3ZZLKIXfeY%3D&reserved=0 >> - Taken care of few comments from Jim Mattson. >> - KVM interceptions added only when tdp is off. No interceptions >> when tdp is on. >> - Reverted the fault priority to original order in VMX. >> >> v1: >> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F159191202523.31436.11959784252237488867.stgit%40bmoger-ubuntu%2F&data=02%7C01%7Cbabu.moger%40amd.com%7Cd2bca7c6209743a7fe0e08d8573e70fd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637355274033139116&sdata=IGmv%2BLF60dmGVSCwcTU6sTDMvW1%2BEWUqTA5K%2FAowuxM%3D&reserved=0 >> >> Babu Moger (12): >> KVM: SVM: Introduce vmcb_(set_intercept/clr_intercept/_is_intercept) >> KVM: SVM: Change intercept_cr to generic intercepts >> KVM: SVM: Change intercept_dr to generic intercepts >> KVM: SVM: Modify intercept_exceptions to generic intercepts >> KVM: SVM: Modify 64 bit intercept field to two 32 bit vectors >> KVM: SVM: Add new intercept vector in vmcb_control_area >> KVM: nSVM: Cleanup nested_state data structure >> KVM: SVM: Remove set_cr_intercept, clr_cr_intercept and is_cr_intercept >> KVM: SVM: Remove set_exception_intercept and clr_exception_intercept >> KVM: X86: Rename and move the function vmx_handle_memory_failure to x86.c >> KVM: X86: Move handling of INVPCID types to x86 >> KVM:SVM: Enable INVPCID feature on AMD >> >> >> arch/x86/include/asm/svm.h | 117 +++++++++++++++++++++++++---------- >> arch/x86/include/uapi/asm/svm.h | 2 + >> arch/x86/kvm/svm/nested.c | 66 +++++++++----------- >> arch/x86/kvm/svm/svm.c | 131 ++++++++++++++++++++++++++------------- >> arch/x86/kvm/svm/svm.h | 87 +++++++++----------------- >> arch/x86/kvm/trace.h | 21 ++++-- >> arch/x86/kvm/vmx/nested.c | 12 ++-- >> arch/x86/kvm/vmx/vmx.c | 95 ---------------------------- >> arch/x86/kvm/vmx/vmx.h | 2 - >> arch/x86/kvm/x86.c | 106 ++++++++++++++++++++++++++++++++ >> arch/x86/kvm/x86.h | 3 + >> 11 files changed, 364 insertions(+), 278 deletions(-) >> >> -- >> Signature >> > > Queued except for patch 9 with only some changes to the names (mostly > replacing "vector" with "word"). It should get to kvm.git on Monday or > Tuesday, please give it a shot. Thanks Paolo. Tested Guest/nested guest/kvm units tests. Everything works as expected.