mm: filter out swapin error entry in shmem mapping
authorMiaohe Lin <linmiaohe@huawei.com>
Thu, 19 May 2022 12:50:30 +0000 (20:50 +0800)
committerakpm <akpm@linux-foundation.org>
Fri, 27 May 2022 16:33:46 +0000 (09:33 -0700)
There might be swapin error entries in shmem mapping.  Filter them out to
avoid "Bad swap file entry" complaint.

Link: https://lkml.kernel.org/r/20220519125030.21486-6-linmiaohe@huawei.com
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Reviewed-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: NeilBrown <neilb@suse.de>
Cc: Peter Xu <peterx@redhat.com>
Cc: Ralph Campbell <rcampbell@nvidia.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/madvise.c
mm/swap_state.c

index 5f45375..d7b4f26 100644 (file)
@@ -248,10 +248,13 @@ static void force_shm_swapin_readahead(struct vm_area_struct *vma,
 
                if (!xa_is_value(page))
                        continue;
+               swap = radix_to_swp_entry(page);
+               /* There might be swapin error entries in shmem mapping. */
+               if (non_swap_entry(swap))
+                       continue;
                xas_pause(&xas);
                rcu_read_unlock();
 
-               swap = radix_to_swp_entry(page);
                page = read_swap_cache_async(swap, GFP_HIGHUSER_MOVABLE,
                                             NULL, 0, false, &splug);
                if (page)
index b9e4ed2..778d57d 100644 (file)
@@ -410,6 +410,9 @@ struct page *find_get_incore_page(struct address_space *mapping, pgoff_t index)
                return NULL;
 
        swp = radix_to_swp_entry(page);
+       /* There might be swapin error entries in shmem mapping. */
+       if (non_swap_entry(swp))
+               return NULL;
        /* Prevent swapoff from happening to us */
        si = get_swap_device(swp);
        if (!si)