From cc047d595f742e416220d2d7740334500eb96a85 Mon Sep 17 00:00:00 2001 From: Alexander Mikhalitsyn Date: Sun, 6 Apr 2025 20:42:26 +0200 Subject: [PATCH] criu/mem: dump: skip MADV_GUARD pages content dump 1. get info about MADV_GUARD_INSTALL-protected pages with help of pagemap by looking for PME_GUARD_REGION flag if /proc//pagemap is used or by looking for PAGE_IS_GUARD flag if ioctl(PAGEMAP_SCAN) is used 2. skip those pages Signed-off-by: Alexander Mikhalitsyn --- criu/include/mem.h | 1 + criu/mem.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/criu/include/mem.h b/criu/include/mem.h index 0ce97822b..b2cbd4b64 100644 --- a/criu/include/mem.h +++ b/criu/include/mem.h @@ -35,6 +35,7 @@ extern int parasite_dump_pages_seized(struct pstree_item *item, struct vm_area_l #define PME_PRESENT (1ULL << 63) #define PME_SWAP (1ULL << 62) #define PME_FILE (1ULL << 61) +#define PME_GUARD_REGION (1ULL << 58) #define PME_SOFT_DIRTY (1ULL << 55) #define PME_PSHIFT_BITS (6) #define PME_STATUS_BITS (3) diff --git a/criu/mem.c b/criu/mem.c index 9fcf7a44c..58c4130c6 100644 --- a/criu/mem.c +++ b/criu/mem.c @@ -143,12 +143,18 @@ int should_dump_page(pmc_t *pmc, VmaEntry *vmae, u64 vaddr, struct page_info *pa return 0; } + if (pmc->regs[pmc->regs_idx].categories & PAGE_IS_GUARD) + goto skip_guard_page; + page_info->softdirty = pmc->regs[pmc->regs_idx].categories & PAGE_IS_SOFT_DIRTY; page_info->next = vaddr; return 0; } else { u64 pme = pmc->map[PAGE_PFN(vaddr - pmc->start)]; + if (pme & PME_GUARD_REGION) + goto skip_guard_page; + /* * Optimisation for private mapping pages, that haven't * yet being COW-ed @@ -173,6 +179,10 @@ err: "%#016" PRIx64 "-%#016" PRIx64 " vaddr=%#016" PRIx64 "\n", vmae->start, vmae->end, vaddr); return -1; + +skip_guard_page: + page_info->next = vaddr + PAGE_SIZE; + return 0; } bool page_is_zero(u64 pme)