-
Notifications
You must be signed in to change notification settings - Fork 615
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Don't dump pages which only contain zero bytes
Signed-off-by: Volker Simonis <[email protected]>
- Loading branch information
Showing
7 changed files
with
146 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -541,6 +541,12 @@ int main(int argc, char *argv[], char *envp[]) | |
" pages images of previous dump\n" | ||
" when used on restore, as soon as page is restored, it\n" | ||
" will be punched from the image\n" | ||
" --zero-pages don't dump pages containing only zero bytes. This is a\n" | ||
" potentially expensive operation because it checks for\n" | ||
" every single process page if it contains only zeros but\n" | ||
" it can significantly decrease the image size if many\n" | ||
Check warning on line 547 in criu/crtools.c GitHub Actions / build
|
||
" such pages exist. It effectively replaces such pages\n" | ||
" which the kernel's zero-page on restore.\n" | ||
" --pre-dump-mode splice - parasite based pre-dumping (default)\n" | ||
" read - process_vm_readv syscall based pre-dumping\n" | ||
"\n" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,8 +3,10 @@ | |
#include <sys/mman.h> | ||
#include <errno.h> | ||
#include <fcntl.h> | ||
#include <string.h> | ||
#include <sys/syscall.h> | ||
#include <sys/prctl.h> | ||
#include <sys/uio.h> | ||
|
||
#include "types.h" | ||
#include "cr_options.h" | ||
|
@@ -31,6 +33,7 @@ | |
#include "prctl.h" | ||
#include "compel/infect-util.h" | ||
#include "pidfd-store.h" | ||
#include "xmalloc.h" | ||
|
||
#include "protobuf.h" | ||
#include "images/pagemap.pb-c.h" | ||
|
@@ -172,17 +175,58 @@ static int generate_iovs(struct pstree_item *item, struct vma_area *vma, struct | |
unsigned long pages[3] = {}; | ||
int ret = 0; | ||
|
||
static char *ZERO_PAGE = NULL; | ||
static char *REMOTE_PAGE = NULL; | ||
int zero = 0; | ||
struct iovec local[2]; | ||
Check warning on line 181 in criu/mem.c GitHub Actions / build
|
||
struct iovec remote[1]; | ||
int nread = 0; | ||
if (opts.zero_pages && ZERO_PAGE == NULL) { | ||
ZERO_PAGE = xmalloc(PAGE_SIZE); | ||
REMOTE_PAGE = xmalloc(PAGE_SIZE); | ||
if (ZERO_PAGE == NULL || REMOTE_PAGE == NULL) { | ||
pr_warn("Can't allocate memory - disabling --zero-pages\n"); | ||
opts.zero_pages = 0; | ||
} else { | ||
Check warning on line 190 in criu/mem.c GitHub Actions / build
|
||
memzero(ZERO_PAGE, PAGE_SIZE); | ||
local[0].iov_base = REMOTE_PAGE; | ||
local[0].iov_len = PAGE_SIZE; | ||
remote[0].iov_base = (void *) 0x0; | ||
remote[0].iov_len = PAGE_SIZE; | ||
} | ||
} | ||
|
||
nr_to_scan = (vma_area_len(vma) - *off) / PAGE_SIZE; | ||
|
||
for (pfn = 0; pfn < nr_to_scan; pfn++) { | ||
unsigned long vaddr; | ||
unsigned int ppb_flags = 0; | ||
int st; | ||
|
||
if (!should_dump_page(vma->e, at[pfn])) | ||
continue; | ||
|
||
vaddr = vma->e->start + *off + pfn * PAGE_SIZE; | ||
/* | ||
* If should_dump_page() returns true, it means the page is in the dumpees resident memory | ||
* (i.e. bit 63 of the page frame number 'at[pfn]' is set) but it is not the zero-page. | ||
*/ | ||
if (should_dump_page(vma->e, at[pfn])) { | ||
if (opts.zero_pages) { | ||
remote[0].iov_base = (void*)vaddr; | ||
Check warning on line 213 in criu/mem.c GitHub Actions / build
|
||
nread = process_vm_readv(item->pid->real, local, 1, remote, 1, 0); | ||
if (nread == PAGE_SIZE) { | ||
zero = memcmp(ZERO_PAGE, REMOTE_PAGE, PAGE_SIZE); | ||
/* | ||
* If the page contains just zeros we can treat it like the zero page and skip it. | ||
* At restore it will be replaced by a reference to the zero page and COWed if accessed. | ||
*/ | ||
if (zero == 0) { | ||
pr_info("Zero page detected at virtual addr = %p\n", (void*)vaddr); | ||
Check warning on line 222 in criu/mem.c GitHub Actions / build
|
||
continue; | ||
} | ||
} | ||
} | ||
} else { | ||
continue; | ||
} | ||
|
||
if (vma_entry_can_be_lazy(vma->e) && !is_stack(item, vaddr)) | ||
ppb_flags |= PPB_LAZY; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
<?xml version = "1.0" encoding = "UTF-8"?> | ||
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > | ||
|
||
<suite name = "Suite2"> | ||
<parameter name="checkpointOpt" value="--zero-pages"/> | ||
<parameter name="restoreOpt" value=""/> | ||
|
||
<test name = "test1-FileRead"> | ||
<parameter name="testname" value="FileRead"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test2-ReadWrite"> | ||
<parameter name="testname" value="ReadWrite"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test3-MemoryMappings"> | ||
<parameter name="testname" value="MemoryMappings"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test4-MultipleFileRead"> | ||
<parameter name="testname" value="MultipleFileRead"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test5-MultipleFileWrite"> | ||
<parameter name="testname" value="MultipleFileWrite"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test6-Sockets"> | ||
<parameter name="testname" value="Sockets"/> | ||
<parameter name="checkpointOpt" value="--tcp-established --zero-pages"/> | ||
<parameter name="restoreOpt" value="--tcp-established"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test7-SocketsListen"> | ||
<parameter name="testname" value="SocketsListen"/> | ||
<parameter name="checkpointOpt" value="--tcp-established --zero-pages"/> | ||
<parameter name="restoreOpt" value="--tcp-established"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test8-SocketsConnect"> | ||
<parameter name="testname" value="SocketsConnect"/> | ||
<parameter name="checkpointOpt" value="--tcp-established --zero-pages"/> | ||
<parameter name="restoreOpt" value="--tcp-established"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test9-SocketsMultiple"> | ||
<parameter name="testname" value="SocketsMultiple"/> | ||
<parameter name="checkpointOpt" value="--tcp-established --zero-pages"/> | ||
<parameter name="restoreOpt" value="--tcp-established"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
</test> | ||
|
||
<test name = "test10-SocketsData"> | ||
<parameter name="testname" value="SocketsData"/> | ||
<parameter name="checkpointOpt" value="--tcp-established --zero-pages"/> | ||
<parameter name="restoreOpt" value="--tcp-established"/> | ||
<classes> | ||
<class name = "org.criu.java.tests.CheckpointRestore"/> | ||
</classes> | ||
|
||
</test> | ||
|
||
</suite> |