[V3,00/14] kvm: x86/mmu: Share the same code to invalidate each vTLB entry

Message ID 20230216154115.710033-1-jiangshanlai@gmail.com
Headers
Series kvm: x86/mmu: Share the same code to invalidate each vTLB entry |

Message

Lai Jiangshan Feb. 16, 2023, 3:41 p.m. UTC
  From: Lai Jiangshan <jiangshan.ljs@antgroup.com>

FNAME(invlpg) and FNAME(sync_page) invalidate vTLB entries but in
slightly different methods.

Make them use the same method and share the same code.

Patch 1: Address a subtle bug reported by Sean Christopherson.
Patch 2-6: Add FNAME(sync_page)
Patch 7-14: Refactor code which uses FNAME(invlpg) and finally use FNAME(sync_page).

Changed from V2:
	Convert the address type and fix subtle bug
	Check mmu->sync_page pointer before calling it
	Fix the defination of KVM_MMU_ROOT_XXX

[V2]: https://lore.kernel.org/lkml/20230207155735.2845-1-jiangshanlai@gmail.com/
[V1]: https://lore.kernel.org/lkml/20230105095848.6061-1-jiangshanlai@gmail.com/

Lai Jiangshan (13):
  KVM: x86/mmu: Use 64-bit address to invalidate to fix a subtle bug
  kvm: x86/mmu: Move the check in FNAME(sync_page) as
    kvm_sync_page_check()
  kvm: x86/mmu: Check mmu->sync_page pointer in kvm_sync_page_check()
  kvm: x86/mmu: Set mmu->sync_page as NULL for direct paging
  kvm: x86/mmu: Move the code out of FNAME(sync_page)'s loop body into
    mmu.c
  kvm: x86/mmu: Reduce the update to the spte in FNAME(sync_spte)
  kvm: x86/mmu: Use KVM_MMU_ROOT_XXX for kvm_mmu_invalidate_addr()
  kvm: x86/mmu: Use kvm_mmu_invalidate_addr() in kvm_mmu_invpcid_gva()
  kvm: x86/mmu: Use kvm_mmu_invalidate_addr() in
    nested_ept_invalidate_addr()
  kvm: x86/mmu: Allow the roots to be invalid in FNAME(invlpg)
  kvm: x86/mmu: Remove FNAME(invlpg) and use FNAME(sync_spte) to update
    vTLB instead.
  kvm: x86/mmu: Remove @no_dirty_log from FNAME(prefetch_gpte)
  kvm: x86/mmu: Skip calling mmu->sync_spte() when the spte is 0

Sean Christopherson (1):
  KVM: x86/mmu: Sanity check input to kvm_mmu_free_roots()

 arch/x86/include/asm/kvm_host.h |  17 ++-
 arch/x86/kvm/mmu/mmu.c          | 201 ++++++++++++++++++++----------
 arch/x86/kvm/mmu/paging_tmpl.h  | 209 +++++++++-----------------------
 arch/x86/kvm/vmx/nested.c       |   5 +-
 arch/x86/kvm/x86.c              |   4 +-
 5 files changed, 205 insertions(+), 231 deletions(-)
  

Comments

Sean Christopherson March 23, 2023, 10:50 p.m. UTC | #1
On Thu, 16 Feb 2023 23:41:06 +0800, Lai Jiangshan wrote:
> From: Lai Jiangshan <jiangshan.ljs@antgroup.com>
> 
> FNAME(invlpg) and FNAME(sync_page) invalidate vTLB entries but in
> slightly different methods.
> 
> Make them use the same method and share the same code.
> 
> [...]

Applied to kvm-x86 mmu, thanks!  Made a few tweaks, I'll respond to invididual
patches (if I haven't already; and if I forget, I apologize in advance).

[01/14] KVM: x86/mmu: Use 64-bit address to invalidate to fix a subtle bug
        https://github.com/kvm-x86/linux/commit/753b43c9d1b7
[02/14] kvm: x86/mmu: Move the check in FNAME(sync_page) as kvm_sync_page_check()
        https://github.com/kvm-x86/linux/commit/90e444702a7c
[03/14] kvm: x86/mmu: Check mmu->sync_page pointer in kvm_sync_page_check()
        https://github.com/kvm-x86/linux/commit/51dddf6c49b9
[04/14] kvm: x86/mmu: Set mmu->sync_page as NULL for direct paging
        https://github.com/kvm-x86/linux/commit/8ef228c20cae
[05/14] kvm: x86/mmu: Move the code out of FNAME(sync_page)'s loop body into mmu.c
        https://github.com/kvm-x86/linux/commit/c3c6c9fc5d24
[06/14] kvm: x86/mmu: Reduce the update to the spte in FNAME(sync_spte)
        https://github.com/kvm-x86/linux/commit/e6722d9211b2
[07/14] KVM: x86/mmu: Sanity check input to kvm_mmu_free_roots()
        https://github.com/kvm-x86/linux/commit/f94db0c8b9fa
[08/14] kvm: x86/mmu: Use KVM_MMU_ROOT_XXX for kvm_mmu_invalidate_addr()
        https://github.com/kvm-x86/linux/commit/cd42853e9530
[09/14] kvm: x86/mmu: Use kvm_mmu_invalidate_addr() in kvm_mmu_invpcid_gva()
        https://github.com/kvm-x86/linux/commit/9ebc3f51da6f
[10/14] kvm: x86/mmu: Use kvm_mmu_invalidate_addr() in nested_ept_invalidate_addr()
        https://github.com/kvm-x86/linux/commit/2c86c444e275
[11/14] kvm: x86/mmu: Allow the roots to be invalid in FNAME(invlpg)
        https://github.com/kvm-x86/linux/commit/ed335278bd12
[12/14] kvm: x86/mmu: Remove FNAME(invlpg) and use FNAME(sync_spte) to update vTLB instead.
        https://github.com/kvm-x86/linux/commit/9fd4a4e3a3d9
[13/14] kvm: x86/mmu: Remove @no_dirty_log from FNAME(prefetch_gpte)
        https://github.com/kvm-x86/linux/commit/91ca7672dc73
[14/14] kvm: x86/mmu: Skip calling mmu->sync_spte() when the spte is 0
        https://github.com/kvm-x86/linux/commit/19ace7d6ca15

--
https://github.com/kvm-x86/linux/tree/next
https://github.com/kvm-x86/linux/tree/fixes