pagemap: change PagemapEntry.nr_pages to uint64 to support huge mappings

Update the nr_pages field in PagemapEntry to uint64 to prepare for
checkpointing and restoring huge memory mappings.

Backward compatibility with older pagemap images is preserved.

Signed-off-by: Andrei Vagin <avagin@gmail.com>
This commit is contained in:
Andrei Vagin 2025-09-18 14:48:42 +00:00 committed by Andrei Vagin
parent c7395f4cbe
commit afb2e6c3f9
4 changed files with 8 additions and 3 deletions

View file

@ -121,7 +121,7 @@ extern int dedup_one_iovec(struct page_read *pr, unsigned long base, unsigned lo
static inline unsigned long pagemap_len(PagemapEntry *pe)
{
return (unsigned long)pe->nr_pages * PAGE_SIZE;
return pe->nr_pages * PAGE_SIZE;
}
static inline bool page_read_has_parent(struct page_read *pr)

View file

@ -326,6 +326,7 @@ static int write_pagemap_loc(struct page_xfer *xfer, struct iovec *iov, u32 flag
pe.nr_pages = iov->iov_len / PAGE_SIZE;
pe.has_flags = true;
pe.flags = flags;
pe.has_nr_pages = true;
if (flags & PE_PRESENT) {
if (opts.auto_dedup && xfer->parent != NULL) {

View file

@ -171,7 +171,7 @@ static int seek_pagemap(struct page_read *pr, unsigned long vaddr)
static inline void pagemap_bound_check(PagemapEntry *pe, unsigned long vaddr, int nr)
{
if (vaddr < pe->vaddr || (vaddr - pe->vaddr) / PAGE_SIZE + nr > pe->nr_pages) {
pr_err("Page read err %" PRIx64 ":%u vs %lx:%u\n", pe->vaddr, pe->nr_pages, vaddr, nr);
pr_err("Page read err %" PRIx64 ":%lu vs %lx:%u\n", pe->vaddr, pe->nr_pages, vaddr, nr);
BUG();
}
}
@ -682,6 +682,9 @@ static void init_compat_pagemap_entry(PagemapEntry *pe)
pe->flags |= PE_PARENT;
else if (!pe->has_flags)
pe->flags = PE_PRESENT;
if (!pe->has_nr_pages)
pe->nr_pages = pe->compat_nr_pages;
}
/*

View file

@ -10,7 +10,8 @@ message pagemap_head {
message pagemap_entry {
required uint64 vaddr = 1 [(criu).hex = true];
required uint32 nr_pages = 2;
required uint32 compat_nr_pages = 2;
optional bool in_parent = 3;
optional uint32 flags = 4 [(criu).flags = "pmap.flags" ];
optional uint64 nr_pages = 5;
}