mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-28 03:43:23 +00:00
Improve the test framework for MM syscalls
This commit is contained in:
committed by
Jianfeng Jiang
parent
93015a6090
commit
ee542e043e
@ -1,48 +1,35 @@
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#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));
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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, \
|
||||
|
Reference in New Issue
Block a user