2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-09-01 06:45:35 +00:00

zdtm: Add MAP_HUGETLB memory mapping test

This commit add a test for checkpoint/restore MAP_HUGETLB memory mappings.
A new zdtm helper get_mapping_dev() is added to get the device number of
the memory mapping.

Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
This commit is contained in:
Bui Quang Minh
2021-10-26 22:22:08 +07:00
committed by Andrei Vagin
parent 70caf63592
commit e2e02bc83e
6 changed files with 139 additions and 1 deletions

View File

@@ -2566,6 +2566,17 @@ def clean_stuff(opts):
f.clean()
def set_nr_hugepages(nr):
orig_hugepages = 0
with open("/proc/sys/vm/nr_hugepages", "r") as f:
orig_hugepages = int(f.read())
with open("/proc/sys/vm/nr_hugepages", "w") as f:
f.write("{}\n".format(nr))
return orig_hugepages
#
# main() starts here
#
@@ -2738,7 +2749,11 @@ if opts['action'] == 'run':
for tst in test_classes.values():
tst.available()
orig_hugepages = set_nr_hugepages(20)
opts['action'](opts)
set_nr_hugepages(orig_hugepages)
for tst in test_classes.values():
tst.cleanup()

View File

@@ -4,7 +4,7 @@ CFLAGS += $(USERCFLAGS)
LIB := libzdtmtst.a
LIBSRC := datagen.c msg.c parseargs.c test.c streamutil.c lock.c ns.c tcp.c unix.c fs.c sysctl.c
LIBSRC := datagen.c msg.c parseargs.c test.c streamutil.c lock.c ns.c tcp.c unix.c fs.c sysctl.c mem.c
PKG_CONFIG ?= pkg-config
pkg-config-check = $(shell sh -c '$(PKG_CONFIG) $(1) && echo y')

32
test/zdtm/lib/mem.c Normal file
View File

@@ -0,0 +1,32 @@
#include <sys/sysmacros.h>
#include <string.h>
#include <stdint.h>
#include "zdtmtst.h"
dev_t get_mapping_dev(void *addr)
{
char buf[1024];
FILE *f;
unsigned int major, minor;
int ret;
f = fopen("/proc/self/maps", "r");
if (f == NULL) {
pr_perror("Failed to open maps file");
return (dev_t)-1;
}
while (fgets(buf, sizeof(buf), f)) {
if ((unsigned long)addr == strtoul(buf, NULL, 16)) {
ret = sscanf(buf, "%*x-%*x %*c%*c%*c%*c %*x %x:%x", &major, &minor);
if (ret != 2) {
pr_err("Can't parse /proc/self/maps\n");
return (dev_t)-1;
}
return makedev(major, minor);
}
}
return (dev_t)-1;
}

View File

@@ -164,6 +164,7 @@ extern const char *test_doc;
extern int tcp_init_server_with_opts(int family, int *port, struct zdtm_tcp_opts *opts);
extern pid_t sys_clone_unified(unsigned long flags, void *child_stack, void *parent_tid, void *child_tid,
unsigned long newtls);
extern dev_t get_mapping_dev(void *addr);
#define ssprintf(s, fmt, ...) \
({ \

View File

@@ -131,6 +131,7 @@ TST_NOFILE := \
maps02 \
maps04 \
maps05 \
maps09 \
mlock_setuid \
xids00 \
groups \

89
test/zdtm/static/maps09.c Normal file
View File

@@ -0,0 +1,89 @@
#include <sys/mman.h>
#include "zdtmtst.h"
#define MEM_SIZE (4UL * (1UL << 20)) /* 4MB */
#define MEM_OFFSET (MEM_SIZE - PAGE_SIZE)
const char *test_doc = "Test MAP_HUGETLB mapping";
const char *test_author = "Bui Quang Minh <minhquangbui99@gmail.com>";
int main(int argc, char **argv)
{
void *m1, *m2;
dev_t dev1, dev2;
uint32_t crc;
test_init(argc, argv);
m1 = mmap(NULL, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_HUGETLB | MAP_SHARED | MAP_ANONYMOUS, 0, 0);
if (m1 == MAP_FAILED) {
pr_perror("Failed to mmap %lu Mb anonymous shared memory", MEM_SIZE >> 20);
return 1;
}
dev1 = get_mapping_dev(m1);
if (dev1 == (dev_t)-1) {
fail("Can't get mapping dev");
return 1;
}
m2 = mmap(NULL, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if (m2 == MAP_FAILED) {
pr_perror("Failed to mmap %lu Mb anonymous private memory", MEM_SIZE >> 20);
return 1;
}
dev2 = get_mapping_dev(m2);
if (dev2 == (dev_t)-1) {
fail("Can't get mapping dev");
return 1;
}
crc = ~0;
datagen(m1, PAGE_SIZE, &crc);
crc = ~0;
datagen(m1 + MEM_OFFSET, PAGE_SIZE, &crc);
crc = ~0;
datagen(m2, PAGE_SIZE, &crc);
crc = ~0;
datagen(m2 + MEM_OFFSET, PAGE_SIZE, &crc);
crc = ~0;
test_daemon();
test_waitsig();
crc = ~0;
if (datachk(m1, PAGE_SIZE, &crc)) {
fail("Data mismatch");
return 1;
}
crc = ~0;
if (datachk(m1 + MEM_OFFSET, PAGE_SIZE, &crc)) {
fail("Data mismatch");
return 1;
}
crc = ~0;
if (datachk(m2, PAGE_SIZE, &crc)) {
fail("Data mismatch");
return 1;
}
crc = ~0;
if (datachk(m2 + MEM_OFFSET, PAGE_SIZE, &crc)) {
fail("Data mismatch");
return 1;
}
if (dev1 != get_mapping_dev(m1)) {
fail("Mapping dev mismatch");
return 1;
}
if (dev2 != get_mapping_dev(m2)) {
fail("Mapping dev mismatch");
return 1;
}
pass();
return 0;
}