mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-22 18:05:10 +00:00
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:
parent
c7395f4cbe
commit
afb2e6c3f9
4 changed files with 8 additions and 3 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue