mbox series

[v4,0/6] KVM: x86/mmu: Fix wrong usages of range-based tlb flushing

Message ID cover.1665214747.git.houwenlong.hwl@antgroup.com (mailing list archive)
Headers show
Series KVM: x86/mmu: Fix wrong usages of range-based tlb flushing | expand

Message

Hou Wenlong Oct. 10, 2022, 12:19 p.m. UTC
Commit c3134ce240eed ("KVM: Replace old tlb flush function with new one
to flush a specified range.") replaces old tlb flush function with
kvm_flush_remote_tlbs_with_address() to do tlb flushing. However, the
gfn range of tlb flushing is wrong in some cases. E.g., when a spte is
dropped, the start gfn of tlb flushing should be the gfn of spte not the
base gfn of SP which contains the spte. Although, as Paolo said, Hyper-V
may treat a 1-page flush the same if the address points to a huge page,
and no fixes are reported so far. So it seems that it works well for
Hyper-V. But it would be better to use the correct size for huge page.
So this patchset would fix them and introduce some helper functions as
David suggested to make the code clear.

Changed from v3:
- Move patch 1 after kvm_flush_remote_tlbs_sptep() is introduced,
  Drop kvm_flush_remote_tlbs_direct_sp() helper and use
  kvm_flush_remote_tlbs_sptep() instead.
- Wrap changelogs at ~75 chars.

Changed from v2:
- Introduce kvm_flush_remote_tlbs_gfn() in Patch 1 early.
- Move round_gfn_for_level() in tdp_iter.c into mmu_internal.h for
  common usage and cleanup the call sites of rounding down the GFN.
- Drop Patch 6.

Changed from v1:
- Align down gfn in kvm_set_pte_rmapp() instead of change iterator->gfn
  in rmap_walk_init_level() in Patch 2.
- Introduce some helper functions for common operations as David
  suggested.

v3: https://lore.kernel.org/kvm/cover.1663929851.git.houwenlong.hwl@antgroup.com

Hou Wenlong (6):
  KVM: x86/mmu: Move round_gfn_for_level() helper into mmu_internal.h
  KVM: x86/mmu: Fix wrong gfn range of tlb flushing in
    kvm_set_pte_rmapp()
  KVM: x86/mmu: Reduce gfn range of tlb flushing in
    tdp_mmu_map_handle_target_level()
  KVM: x86/mmu: Fix wrong start gfn of tlb flushing with range
  KVM: x86/mmu: Fix wrong gfn range of tlb flushing in
    validate_direct_spte()
  KVM: x86/mmu: Cleanup range-based flushing for given page

 arch/x86/kvm/mmu/mmu.c          | 36 +++++++++++++++++++++------------
 arch/x86/kvm/mmu/mmu_internal.h | 15 ++++++++++++++
 arch/x86/kvm/mmu/paging_tmpl.h  |  5 ++---
 arch/x86/kvm/mmu/tdp_iter.c     | 11 +++-------
 arch/x86/kvm/mmu/tdp_mmu.c      |  6 ++----
 5 files changed, 45 insertions(+), 28 deletions(-)

--
2.31.1

Comments

Sean Christopherson Jan. 19, 2023, 8:54 p.m. UTC | #1
On Mon, 10 Oct 2022 20:19:11 +0800, Hou Wenlong wrote:
> Commit c3134ce240eed ("KVM: Replace old tlb flush function with new one
> to flush a specified range.") replaces old tlb flush function with
> kvm_flush_remote_tlbs_with_address() to do tlb flushing. However, the
> gfn range of tlb flushing is wrong in some cases. E.g., when a spte is
> dropped, the start gfn of tlb flushing should be the gfn of spte not the
> base gfn of SP which contains the spte. Although, as Paolo said, Hyper-V
> may treat a 1-page flush the same if the address points to a huge page,
> and no fixes are reported so far. So it seems that it works well for
> Hyper-V. But it would be better to use the correct size for huge page.
> So this patchset would fix them and introduce some helper functions as
> David suggested to make the code clear.
> 
> [...]

David and/or Hou, it's probably a good idea to double check my results, there
were a few minor conflicts and I doubt anything would fail if I messed up.

Applied to kvm-x86 mmu, thanks!

[1/6] KVM: x86/mmu: Move round_gfn_for_level() helper into mmu_internal.h
      https://github.com/kvm-x86/linux/commit/bb05964f0a3c
[2/6] KVM: x86/mmu: Fix wrong gfn range of tlb flushing in kvm_set_pte_rmapp()
      https://github.com/kvm-x86/linux/commit/564246ae7da2
[3/6] KVM: x86/mmu: Reduce gfn range of tlb flushing in tdp_mmu_map_handle_target_level()
      https://github.com/kvm-x86/linux/commit/c6753e20e09d
[4/6] KVM: x86/mmu: Fix wrong start gfn of tlb flushing with range
      https://github.com/kvm-x86/linux/commit/4fa7e22ed6ed
[5/6] KVM: x86/mmu: Fix wrong gfn range of tlb flushing in validate_direct_spte()
      https://github.com/kvm-x86/linux/commit/976d07c25056
[6/6] KVM: x86/mmu: Cleanup range-based flushing for given page
      https://github.com/kvm-x86/linux/commit/f9309825c4b1

--
https://github.com/kvm-x86/linux/tree/next
https://github.com/kvm-x86/linux/tree/fixes
Sean Christopherson Jan. 19, 2023, 11:09 p.m. UTC | #2
On Thu, Jan 19, 2023, Sean Christopherson wrote:
> On Mon, 10 Oct 2022 20:19:11 +0800, Hou Wenlong wrote:
> > Commit c3134ce240eed ("KVM: Replace old tlb flush function with new one
> > to flush a specified range.") replaces old tlb flush function with
> > kvm_flush_remote_tlbs_with_address() to do tlb flushing. However, the
> > gfn range of tlb flushing is wrong in some cases. E.g., when a spte is
> > dropped, the start gfn of tlb flushing should be the gfn of spte not the
> > base gfn of SP which contains the spte. Although, as Paolo said, Hyper-V
> > may treat a 1-page flush the same if the address points to a huge page,
> > and no fixes are reported so far. So it seems that it works well for
> > Hyper-V. But it would be better to use the correct size for huge page.
> > So this patchset would fix them and introduce some helper functions as
> > David suggested to make the code clear.
> > 
> > [...]
> 
> David and/or Hou, it's probably a good idea to double check my results, there
> were a few minor conflicts and I doubt anything would fail if I messed up.

Gah, doesn't even compile because I missed a paranthesis.  Messed up my scripts
and didn't pull 'mmu' into 'next.

Force pushed, new hashes are below.  Testing now...

[1/6] KVM: x86/mmu: Move round_gfn_for_level() helper into mmu_internal.h
      https://github.com/kvm-x86/linux/commit/bb05964f0a3c
[2/6] KVM: x86/mmu: Fix wrong gfn range of tlb flushing in kvm_set_pte_rmapp()
      https://github.com/kvm-x86/linux/commit/c61baeaa2a14
[3/6] KVM: x86/mmu: Reduce gfn range of tlb flushing in tdp_mmu_map_handle_target_level()
      https://github.com/kvm-x86/linux/commit/24c17bc3def7
[4/6] KVM: x86/mmu: Fix wrong start gfn of tlb flushing with range
      https://github.com/kvm-x86/linux/commit/873f68d8dac3
[5/6] KVM: x86/mmu: Fix wrong gfn range of tlb flushing in validate_direct_spte()
      https://github.com/kvm-x86/linux/commit/22f34c933198
[6/6] KVM: x86/mmu: Cleanup range-based flushing for given page
      https://github.com/kvm-x86/linux/commit/e7b406974086