aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAndrea Arcangeli <aarcange@redhat.com>2021-12-08 02:23:15 -0500
committerAndrea Arcangeli <aarcange@redhat.com>2023-11-11 22:03:38 -0500
commit671b5ac3da49479aa54b2163de16b016a35a1bda (patch)
treea4a265db61e846d30c3a8baef3c0e8b41a080bd9
parenta0712530d5667eed20d1eb30c2664341e94b77af (diff)
downloadaa-671b5ac3da49479aa54b2163de16b016a35a1bda.tar.gz
randprotect: KSM: break_ksm: use the COR fault
If the KSM merge fails the PageKsm must be broken and converted back to an Anon page, but this has to be done with the COR fault to avoid reopening the KSM COW side channel. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
-rw-r--r--mm/ksm.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/mm/ksm.c b/mm/ksm.c
index 89528490ddcb4d..0da3a1f285a12c 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -542,11 +542,16 @@ static int break_ksm(struct vm_area_struct *vma, unsigned long addr)
FOLL_GET | FOLL_MIGRATION | FOLL_REMOTE);
if (IS_ERR_OR_NULL(page))
break;
- if (PageKsm(page))
+ if (PageKsm(page)) {
+ bool cor = is_ksm_random_distribution_enabled();
ret = handle_mm_fault(vma, addr,
- FAULT_FLAG_WRITE | FAULT_FLAG_REMOTE,
+ (cor ?
+ FAULT_FLAG_UNSHARE |
+ FAULT_FLAG_UNSHARE_MM_SYNC :
+ FAULT_FLAG_WRITE) |
+ FAULT_FLAG_REMOTE,
NULL);
- else
+ } else
ret = VM_FAULT_WRITE;
put_page(page);
} while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | VM_FAULT_OOM)));