Vlastimil Babka 3d7214
From: Alistair Popple <apopple@nvidia.com>
Vlastimil Babka 3d7214
Date: Mon, 14 Nov 2022 22:55:37 +1100
Vlastimil Babka 3d7214
Subject: mm/memory: return vm_fault_t result from migrate_to_ram() callback
Vlastimil Babka 3d7214
Git-commit: 4a955bed882e734807024afd8f53213d4c61ff97
Vlastimil Babka 3d7214
Patch-mainline: v6.1-rc7
Vlastimil Babka 3d7214
References: jsc#PED-1294
Vlastimil Babka 3d7214
Vlastimil Babka 3d7214
The migrate_to_ram() callback should always succeed, but in rare cases can
Vlastimil Babka 3d7214
fail usually returning VM_FAULT_SIGBUS.  Commit 16ce101db85d
Vlastimil Babka 3d7214
("mm/memory.c: fix race when faulting a device private page") incorrectly
Vlastimil Babka 3d7214
stopped passing the return code up the stack.  Fix this by setting the ret
Vlastimil Babka 3d7214
variable, restoring the previous behaviour on migrate_to_ram() failure.
Vlastimil Babka 3d7214
Vlastimil Babka 3d7214
Link: https://lkml.kernel.org/r/20221114115537.727371-1-apopple@nvidia.com
Vlastimil Babka 3d7214
Fixes: 16ce101db85d ("mm/memory.c: fix race when faulting a device private page")
Vlastimil Babka 3d7214
Signed-off-by: Alistair Popple <apopple@nvidia.com>
Vlastimil Babka 3d7214
Acked-by: David Hildenbrand <david@redhat.com>
Vlastimil Babka 3d7214
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Vlastimil Babka 3d7214
Cc: Ralph Campbell <rcampbell@nvidia.com>
Vlastimil Babka 3d7214
Cc: John Hubbard <jhubbard@nvidia.com>
Vlastimil Babka 3d7214
Cc: Alex Sierra <alex.sierra@amd.com>
Vlastimil Babka 3d7214
Cc: Ben Skeggs <bskeggs@redhat.com>
Vlastimil Babka 3d7214
Cc: Lyude Paul <lyude@redhat.com>
Vlastimil Babka 3d7214
Cc: Jason Gunthorpe <jgg@nvidia.com>
Vlastimil Babka 3d7214
Cc: Michael Ellerman <mpe@ellerman.id.au>
Vlastimil Babka 3d7214
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Vlastimil Babka 3d7214
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Vlastimil Babka 3d7214
---
Vlastimil Babka 3d7214
 mm/memory.c |    2 +-
Vlastimil Babka 3d7214
 1 file changed, 1 insertion(+), 1 deletion(-)
Vlastimil Babka 3d7214
Vlastimil Babka 3d7214
--- a/mm/memory.c
Vlastimil Babka 3d7214
+++ b/mm/memory.c
Vlastimil Babka 3d7214
@@ -3513,7 +3513,7 @@ vm_fault_t do_swap_page(struct vm_fault
Vlastimil Babka 3d7214
 			 */
Vlastimil Babka 3d7214
 			get_page(vmf->page);
Vlastimil Babka 3d7214
 			pte_unmap_unlock(vmf->pte, vmf->ptl);
Vlastimil Babka 3d7214
-			vmf->page->pgmap->ops->migrate_to_ram(vmf);
Vlastimil Babka 3d7214
+			ret = vmf->page->pgmap->ops->migrate_to_ram(vmf);
Vlastimil Babka 3d7214
 			put_page(vmf->page);
Vlastimil Babka 3d7214
 		} else if (is_hwpoison_entry(entry)) {
Vlastimil Babka 3d7214
 			ret = VM_FAULT_HWPOISON;