1. 05 Jan, 2024 2 commits
    • Suren Baghdasaryan's avatar
      userfaultfd: fix move_pages_pte() splitting folio under RCU read lock · 982ae058
      Suren Baghdasaryan authored
      While testing the split PMD path with lockdep enabled I've got an "Invalid
      wait context" error caused by split_huge_page_to_list() trying to lock
      anon_vma->rwsem while inside RCU read section.  The issues is due to
      move_pages_pte() calling split_folio() under RCU read lock.  Fix this by
      unmapping the PTEs and exiting RCU read section before splitting the folio
      and then retrying.  The same retry pattern is used when locking the folio
      or anon_vma in this function.  After splitting the large folio we unlock
      and release it because after the split the old folio might not be the one
      that contains the src_addr.
      
      Link: https://lkml.kernel.org/r/20240102233256.1077959-1-surenb@google.com
      Fixes: adef4406 ("userfaultfd: UFFDIO_MOVE uABI")
      Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
      Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Cc: Andrea Arcangeli <aarcange@redhat.com>
      Cc: Axel Rasmussen <axelrasmussen@google.com>
      Cc: Brian Geffon <bgeffon@google.com>
      Cc: Christian Brauner <brauner@kernel.org>
      Cc: David Hildenbrand <david@redhat.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Jann Horn <jannh@google.com>
      Cc: Kalesh Singh <kaleshsingh@google.com>
      Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
      Cc: Lokesh Gidra <lokeshgidra@google.com>
      Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
      Cc: Michal Hocko <mhocko@suse.com>
      Cc: Mike Rapoport (IBM) <rppt@kernel.org>
      Cc: Nicolas Geoffray <ngeoffray@google.com>
      Cc: Ryan Roberts <ryan.roberts@arm.com>
      Cc: Shuah Khan <shuah@kernel.org>
      Cc: ZhangPeng <zhangpeng362@huawei.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      982ae058
    • Matthew Wilcox (Oracle)'s avatar
      buffer: fix unintended successful return · bcd30d4c
      Matthew Wilcox (Oracle) authored
      If try_to_free_buffers() succeeded and then folio_alloc_buffers() failed,
      grow_dev_folio() would return success.  This would be incorrect; memory
      allocation failure is supposed to result in a failure.  It's a harmless
      bug; the caller will simply go around the loop one more time and
      grow_dev_folio() will correctly return a failure that time.  But it was an
      unintended change and looks like a more serious bug than it is.
      
      While I'm in here, improve the commentary about why we return success even
      though we failed.
      
      Link: https://lkml.kernel.org/r/20240101093848.2017115-1-willy@infradead.org
      Fixes: 6d840a18 ("buffer: return bool from grow_dev_folio()")
      Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
      Reported-by: default avatarRyusuke Konishi <konishi.ryusuke@gmail.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      bcd30d4c
  2. 30 Dec, 2023 1 commit
    • Nhat Pham's avatar
      zswap: memcontrol: implement zswap writeback disabling · 501a06fe
      Nhat Pham authored
      During our experiment with zswap, we sometimes observe swap IOs due to
      occasional zswap store failures and writebacks-to-swap.  These swapping
      IOs prevent many users who cannot tolerate swapping from adopting zswap to
      save memory and improve performance where possible.
      
      This patch adds the option to disable this behavior entirely: do not
      writeback to backing swapping device when a zswap store attempt fail, and
      do not write pages in the zswap pool back to the backing swap device (both
      when the pool is full, and when the new zswap shrinker is called).
      
      This new behavior can be opted-in/out on a per-cgroup basis via a new
      cgroup file.  By default, writebacks to swap device is enabled, which is
      the previous behavior.  Initially, writeback is enabled for the root
      cgroup, and a newly created cgroup will inherit the current setting of its
      parent.
      
      Note that this is subtly different from setting memory.swap.max to 0, as
      it still allows for pages to be stored in the zswap pool (which itself
      consumes swap space in its current form).
      
      This patch should be applied on top of the zswap shrinker series:
      
      https://lore.kernel.org/linux-mm/20231130194023.4102148-1-nphamcs@gmail.com/
      
      as it also disables the zswap shrinker, a major source of zswap
      writebacks.
      
      For the most part, this feature is motivated by internal parties who
      have already established their opinions regarding swapping - the
      workloads that are highly sensitive to IO, and especially those who are
      using servers with really slow disk performance (for instance, massive
      but slow HDDs).  For these folks, it's impossible to convince them to
      even entertain zswap if swapping also comes as a packaged deal. 
      Writeback disabling is quite a useful feature in these situations - on
      a mixed workloads deployment, they can disable writeback for the more
      IO-sensitive workloads, and enable writeback for other background
      workloads.
      
      For instance, on a server with HDD, I allocate memories and populate
      them with random values (so that zswap store will always fail), and
      specify memory.high low enough to trigger reclaim.  The time it takes
      to allocate the memories and just read through it a couple of times
      (doing silly things like computing the values' average etc.):
      
      zswap.writeback disabled:
      real 0m30.537s
      user 0m23.687s
      sys 0m6.637s
      0 pages swapped in
      0 pages swapped out
      
      zswap.writeback enabled:
      real 0m45.061s
      user 0m24.310s
      sys 0m8.892s
      712686 pages swapped in
      461093 pages swapped out
      
      (the last two lines are from vmstat -s).
      
      [nphamcs@gmail.com: add a comment about recurring zswap store failures leading to reclaim inefficiency]
        Link: https://lkml.kernel.org/r/20231221005725.3446672-1-nphamcs@gmail.com
      Link: https://lkml.kernel.org/r/20231207192406.3809579-1-nphamcs@gmail.comSigned-off-by: default avatarNhat Pham <nphamcs@gmail.com>
      Suggested-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
      Reviewed-by: default avatarYosry Ahmed <yosryahmed@google.com>
      Acked-by: default avatarChris Li <chrisl@kernel.org>
      Cc: Dan Streetman <ddstreet@ieee.org>
      Cc: David Heidelberg <david@ixit.cz>
      Cc: Domenico Cerasuolo <cerasuolodomenico@gmail.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      Cc: Michal Hocko <mhocko@kernel.org>
      Cc: Mike Rapoport (IBM) <rppt@kernel.org>
      Cc: Muchun Song <muchun.song@linux.dev>
      Cc: Roman Gushchin <roman.gushchin@linux.dev>
      Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
      Cc: Seth Jennings <sjenning@redhat.com>
      Cc: Shakeel Butt <shakeelb@google.com>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Vitaly Wool <vitaly.wool@konsulko.com>
      Cc: Zefan Li <lizefan.x@bytedance.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      501a06fe
  3. 29 Dec, 2023 37 commits