[Devel] [PATCH VZ9 0/2] mm/swap: fix swapcache page/folio inconsistency

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Thu Feb 1 09:33:15 MSK 2024


This ports the switching from page to folio in add_to_swap_cache().

We saw multiple different hangs on mmap_lock, where the task holding the
lock was livelocked spinning in this stack:

  +-> __x64_sys_ioctl
    +-> kvm_vcpu_ioctl
      +-> kvm_arch_vcpu_ioctl_run
        +-> vcpu_run
          +-> vcpu_enter_guest
            +-> kvm_mmu_page_fault
              +-> kvm_tdp_page_fault
                +-> kvm_faultin_pfn
                  +-> __kvm_faultin_pfn
                    +-> hva_to_pfn
                      +-> get_user_pages_unlocked

  +-> get_user_pages_unlocked
    +-> mmap_read_lock # 1
    +-> __get_user_pages_locked # 2
      +-> for-loop # taken once
        +-> __get_user_pages
          +-> retry-loop # constantly spinning
            +-> faultin_page # return 0 to trigger retry
              +-> handle_mm_fault
                +-> __handle_mm_fault
                  +-> handle_pte_fault
                    +-> do_swap_page
                      +-> lookup_swap_cache # returns non-NULL
                      +-> if (swapcache)
                        +-> if (!folio_test_swapcache || page_private(page) != entry.val)
                          +-> goto out_page
                            +-> return 0

That can be due to an inconsistency in swapcache flag setting/reading,
one can see that PageSwapCache reads the flag from folio, but
SetPageSwapCache/ClearPageSwapCache instead affect the flag from page.

After applying those patches SetPageSwapCache/ClearPageSwapCache become
unused, thus all paths seek this flag from folio now. With it I don't
see any hangs on mmap_lock anymore (on the same test setup).

https://virtuozzo.atlassian.net/browse/PSBM-153264
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>

Matthew Wilcox (Oracle) (2):
  mm/swap: convert __read_swap_cache_async() to use a folio
  mm/swap: convert add_to_swap_cache() to take a folio

 mm/shmem.c      |  2 +-
 mm/swap.h       |  4 +--
 mm/swap_state.c | 71 +++++++++++++++++++++++++------------------------
 3 files changed, 39 insertions(+), 38 deletions(-)

-- 
2.43.0



More information about the Devel mailing list