diff options
author | Andrea Arcangeli <aarcange@redhat.com> | 2021-12-08 02:23:15 -0500 |
---|---|---|
committer | Andrea Arcangeli <aarcange@redhat.com> | 2023-11-11 22:03:38 -0500 |
commit | 671b5ac3da49479aa54b2163de16b016a35a1bda (patch) | |
tree | a4a265db61e846d30c3a8baef3c0e8b41a080bd9 | |
parent | a0712530d5667eed20d1eb30c2664341e94b77af (diff) | |
download | aa-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.c | 11 |
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))); |