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/<pid>/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 <aleksandr.mikhalitsyn@canonical.com>
This commit is contained in:
Alexander Mikhalitsyn 2025-04-06 20:42:26 +02:00 committed by Andrei Vagin
parent 5843cbf975
commit cc047d595f
2 changed files with 11 additions and 0 deletions

View file

@ -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)

View file

@ -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)