| From: Luis Chamberlain <mcgrof@kernel.org> |
| Subject: shmem: skip page split if we're not reclaiming |
| Date: Thu, 9 Mar 2023 15:05:43 -0800 |
| |
| In theory when info->flags & VM_LOCKED we should not be getting |
| shem_writepage() called so we should be verifying this with a |
| WARN_ON_ONCE(). Since we should not be swapping then best to ensure we |
| also don't do the folio split earlier too. So just move the check early |
| to avoid folio splits in case its a dubious call. |
| |
| We also have a similar early bail when !total_swap_pages so just move that |
| earlier to avoid the possible folio split in the same situation. |
| |
| Link: https://lkml.kernel.org/r/20230309230545.2930737-5-mcgrof@kernel.org |
| Signed-off-by: Luis Chamberlain <mcgrof@kernel.org> |
| Acked-by: David Hildenbrand <david@redhat.com> |
| Reviewed-by: Christian Brauner <brauner@kernel.org> |
| Reviewed-by: Yosry Ahmed <yosryahmed@google.com> |
| Tested-by: Xin Hao <xhao@linux.alibaba.com> |
| Reviewed-by: Davidlohr 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: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/shmem.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| --- a/mm/shmem.c~shmem-skip-page-split-if-were-not-reclaiming |
| +++ a/mm/shmem.c |
| @@ -1357,6 +1357,12 @@ static int shmem_writepage(struct page * |
| if (WARN_ON_ONCE(!wbc->for_reclaim)) |
| goto redirty; |
| |
| + if (WARN_ON_ONCE(info->flags & VM_LOCKED)) |
| + goto redirty; |
| + |
| + if (!total_swap_pages) |
| + goto redirty; |
| + |
| /* |
| * If /sys/kernel/mm/transparent_hugepage/shmem_enabled is "always" or |
| * "force", drivers/gpu/drm/i915/gem/i915_gem_shmem.c gets huge pages, |
| @@ -1372,10 +1378,6 @@ static int shmem_writepage(struct page * |
| } |
| |
| index = folio->index; |
| - if (info->flags & VM_LOCKED) |
| - goto redirty; |
| - if (!total_swap_pages) |
| - goto redirty; |
| |
| /* |
| * This is somewhat ridiculous, but without plumbing a SWAP_MAP_FALLOC |
| _ |