Commit cf7992bf authored by Luis Chamberlain's avatar Luis Chamberlain Committed by Andrew Morton

shmem: move reclaim check early on writepages()

i915_gem requires huge folios to be split when swapping.  However we have
check for usage of writepages() to ensure it used only for swap purposes
later.  Avoid the splits if we're not being called for reclaim, even if
they should in theory not happen.

This makes the conditions easier to follow on shem_writepage().

Link: https://lkml.kernel.org/r/20230309230545.2930737-4-mcgrof@kernel.orgSigned-off-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
Reviewed-by: default avatarYosry Ahmed <yosryahmed@google.com>
Reviewed-by: default avatarChristian Brauner <brauner@kernel.org>
Tested-by: default avatarXin Hao <xhao@linux.alibaba.com>
Reviewed-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
Cc: Adam Manzanares <a.manzanares@samsung.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Hugh Dickins <hughd@google.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Pankaj Raghav <p.raghav@samsung.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 8ccee8c1
...@@ -1337,6 +1337,16 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc) ...@@ -1337,6 +1337,16 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)
swp_entry_t swap; swp_entry_t swap;
pgoff_t index; pgoff_t index;
/*
* Our capabilities prevent regular writeback or sync from ever calling
* shmem_writepage; but a stacking filesystem might use ->writepage of
* its underlying filesystem, in which case tmpfs should write out to
* swap only in response to memory pressure, and not for the writeback
* threads or sync.
*/
if (WARN_ON_ONCE(!wbc->for_reclaim))
goto redirty;
/* /*
* If /sys/kernel/mm/transparent_hugepage/shmem_enabled is "always" or * If /sys/kernel/mm/transparent_hugepage/shmem_enabled is "always" or
* "force", drivers/gpu/drm/i915/gem/i915_gem_shmem.c gets huge pages, * "force", drivers/gpu/drm/i915/gem/i915_gem_shmem.c gets huge pages,
...@@ -1357,18 +1367,6 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc) ...@@ -1357,18 +1367,6 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)
if (!total_swap_pages) if (!total_swap_pages)
goto redirty; goto redirty;
/*
* Our capabilities prevent regular writeback or sync from ever calling
* shmem_writepage; but a stacking filesystem might use ->writepage of
* its underlying filesystem, in which case tmpfs should write out to
* swap only in response to memory pressure, and not for the writeback
* threads or sync.
*/
if (!wbc->for_reclaim) {
WARN_ON_ONCE(1); /* Still happens? Tell us about it! */
goto redirty;
}
/* /*
* This is somewhat ridiculous, but without plumbing a SWAP_MAP_FALLOC * This is somewhat ridiculous, but without plumbing a SWAP_MAP_FALLOC
* value into swapfile.c, the only way we can correctly account for a * value into swapfile.c, the only way we can correctly account for a
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment