From ee542e043e44d9c238168c618f45087afe331e43 Mon Sep 17 00:00:00 2001 From: Ruihan Li Date: Sat, 21 Jun 2025 23:43:46 +0800 Subject: [PATCH] Improve the test framework for MM syscalls --- test/apps/mmap/mmap_and_mremap.c | 57 +++++++++++--------------------- test/apps/mmap/mmap_readahead.c | 6 ++-- test/apps/mmap/mmap_vmrss.c | 23 +++++-------- test/apps/network/test.h | 4 +-- 4 files changed, 34 insertions(+), 56 deletions(-) diff --git a/test/apps/mmap/mmap_and_mremap.c b/test/apps/mmap/mmap_and_mremap.c index 91f1de5bd..4d6fada4b 100644 --- a/test/apps/mmap/mmap_and_mremap.c +++ b/test/apps/mmap/mmap_and_mremap.c @@ -1,48 +1,35 @@ // SPDX-License-Identifier: MPL-2.0 #define _GNU_SOURCE -#include -#include + #include #include #include -#include + #include "../network/test.h" #define PAGE_SIZE 4096 const char *content = "kjfkljk*wigo&h"; -void *x_mmap(void *addr, size_t length, int prot, int flags, int fd, - off_t offset) -{ - void *result = mmap(addr, length, prot, flags, fd, offset); - if (result == MAP_FAILED) { - perror("mmap"); - exit(EXIT_FAILURE); - } - return result; -} +#define CHECK_MM(func) CHECK_WITH(func, _ret != MAP_FAILED) FN_TEST(mmap_and_mremap) { - char *addr = x_mmap(NULL, 3 * PAGE_SIZE, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + char *addr = CHECK_MM(mmap(NULL, 3 * PAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); TEST_SUCC(munmap(addr, 3 * PAGE_SIZE)); - addr = x_mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + addr = CHECK_MM(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0)); strcpy(addr, content); - char *addr2 = x_mmap(addr + 2 * PAGE_SIZE, PAGE_SIZE, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + char *addr2 = CHECK_MM( + mmap(addr + 2 * PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0)); - char *new_addr = mremap(addr, PAGE_SIZE, 3 * PAGE_SIZE, MREMAP_MAYMOVE); - if (new_addr == MAP_FAILED) { - perror("mremap"); - exit(EXIT_FAILURE); - } + char *new_addr = CHECK_MM( + mremap(addr, PAGE_SIZE, 3 * PAGE_SIZE, MREMAP_MAYMOVE)); // The following operation (if uncommented) would cause a segmentation fault. // strcpy(addr, "Writing to old address"); @@ -58,8 +45,8 @@ END_TEST() FN_TEST(mmap_and_mremap_fixed) { - char *addr1 = x_mmap(NULL, PAGE_SIZE * 2, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + char *addr1 = CHECK_MM(mmap(NULL, PAGE_SIZE * 2, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); strcpy(addr1, content); // Unmap a target region to ensure we know it's free @@ -67,19 +54,15 @@ FN_TEST(mmap_and_mremap_fixed) TEST_SUCC(munmap(addr2, PAGE_SIZE)); // free it for mremap // Remap from the first address to the second address - if (mremap(addr1, PAGE_SIZE, PAGE_SIZE, MREMAP_MAYMOVE | MREMAP_FIXED, - addr2) != addr2) { - perror("mremap"); - exit(EXIT_FAILURE); - } + CHECK_WITH(mremap(addr1, PAGE_SIZE, PAGE_SIZE, + MREMAP_MAYMOVE | MREMAP_FIXED, addr2), + _ret == addr2); TEST_RES(strcmp(addr2, content), _ret == 0); // Remap from the second address to the first address - if (mremap(addr2, PAGE_SIZE, PAGE_SIZE, MREMAP_MAYMOVE | MREMAP_FIXED, - addr1) != addr1) { - perror("mremap"); - exit(EXIT_FAILURE); - } + CHECK_WITH(mremap(addr2, PAGE_SIZE, PAGE_SIZE, + MREMAP_MAYMOVE | MREMAP_FIXED, addr1), + _ret == addr1); TEST_RES(strcmp(addr1, content), _ret == 0); TEST_SUCC(munmap(addr1, PAGE_SIZE)); diff --git a/test/apps/mmap/mmap_readahead.c b/test/apps/mmap/mmap_readahead.c index f2d176031..253b1fbdf 100644 --- a/test/apps/mmap/mmap_readahead.c +++ b/test/apps/mmap/mmap_readahead.c @@ -22,9 +22,9 @@ FN_SETUP(mmap_readahead) CHECK(ftruncate(fd, PAGE_SIZE * NR_PAGES)); - addr = mmap(NULL, PAGE_SIZE * NR_PAGES, PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0); - CHECK(addr == MAP_FAILED ? -1 : 0); + addr = CHECK_WITH(mmap(NULL, PAGE_SIZE * NR_PAGES, + PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0), + _ret != MAP_FAILED); } END_SETUP() diff --git a/test/apps/mmap/mmap_vmrss.c b/test/apps/mmap/mmap_vmrss.c index 6de2a9032..e71d341f7 100644 --- a/test/apps/mmap/mmap_vmrss.c +++ b/test/apps/mmap/mmap_vmrss.c @@ -47,7 +47,7 @@ long get_vm_rss_kb(rss_type type) target_field = "VmRSS:"; break; default: - perror("Unknown rss_type\n"); + fprintf(stderr, "Unknown rss_type\n"); exit(1); } @@ -68,14 +68,12 @@ long get_vm_rss_kb(rss_type type) return rss_kb; } +#define CHECK_MM(func) CHECK_WITH(func, _ret != MAP_FAILED) + FN_TEST(rss_anon) { - void *mem = mmap(NULL, TOTAL_SIZE, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (mem == MAP_FAILED) { - perror("mmap"); - exit(1); - } + void *mem = CHECK_MM(mmap(NULL, TOTAL_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); // The first call to `TEST_SUCC` and `get_vm_rss_kb()` may trigger // lazy mapping of additional pages, such as shared libraries or files. @@ -122,11 +120,8 @@ FN_TEST(rss_file) long rss_file_before = TEST_SUCC(get_vm_rss_kb(file)); long rss_before = TEST_SUCC(get_vm_rss_kb(total)); - void *mem = mmap(NULL, TOTAL_SIZE, PROT_READ, MAP_PRIVATE, fd, 0); - if (mem == MAP_FAILED) { - perror("mmap"); - exit(1); - } + void *mem = + CHECK_MM(mmap(NULL, TOTAL_SIZE, PROT_READ, MAP_PRIVATE, fd, 0)); // Trigger page faults for (int i = 0; i < NUM_PAGES; ++i) { @@ -146,7 +141,7 @@ FN_TEST(rss_file) TEST_RES(get_vm_rss_kb(file), _ret == rss_file_before); TEST_RES(get_vm_rss_kb(total), _ret == rss_before); - close(fd); - unlink(filename); + TEST_SUCC(close(fd)); + TEST_SUCC(unlink(filename)); } END_TEST() diff --git a/test/apps/network/test.h b/test/apps/network/test.h index d06b854a9..4c9badeca 100644 --- a/test/apps/network/test.h +++ b/test/apps/network/test.h @@ -47,7 +47,7 @@ #define __CHECK(func, cond) \ errno = 0; \ - long _ret = (func); \ + __auto_type _ret = (func); \ if (!(cond)) { \ fprintf(stderr, \ "fatal error: %s: `" #cond "` is false after `" #func \ @@ -100,7 +100,7 @@ static int __total_failures; #define __TEST(func, err, cond) \ errno = 0; \ - long _ret = (func); \ + __auto_type _ret = (func); \ if (errno != (err)) { \ __tests_failed++; \ fprintf(stderr, \