Automatically merge adjacent and compatible VmMappings

This commit is contained in:
Wang Siyuan
2025-06-21 12:39:48 +00:00
committed by Junyang Zhang
parent c5d57d5216
commit f442cc6d81
4 changed files with 205 additions and 20 deletions

View File

@ -5,7 +5,8 @@
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include "../test.h"
#define PAGE_SIZE 4096
@ -106,3 +107,54 @@ FN_TEST(mmap_and_mremap_fixed)
TEST_SUCC(munmap(addr1, PAGE_SIZE));
}
END_TEST()
FN_TEST(mmap_and_mremap_auto_merge_anon)
{
char *addr = CHECK_MM(mmap(NULL, 6 * PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
TEST_SUCC(munmap(addr, 6 * PAGE_SIZE));
CHECK_MM(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0));
strcpy(addr, content);
CHECK_MM(mmap(addr + 2 * PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0));
CHECK_MM(mmap(addr + PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0));
char *new_addr = CHECK_MM(mremap(addr, 3 * PAGE_SIZE, 3 * PAGE_SIZE,
MREMAP_MAYMOVE | MREMAP_FIXED,
addr + 3 * PAGE_SIZE));
TEST_RES(strcmp(new_addr, content), _ret == 0);
TEST_SUCC(munmap(new_addr, 3 * PAGE_SIZE));
}
END_TEST()
FN_TEST(mmap_and_mremap_auto_merge_file)
{
const char *filename = "mremap_test_file";
int fd = TEST_SUCC(open(filename, O_CREAT | O_RDWR, 0600));
TEST_SUCC(ftruncate(fd, 6 * PAGE_SIZE));
char *addr = CHECK_MM(mmap(NULL, 6 * PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE, fd, 0));
TEST_SUCC(munmap(addr, 6 * PAGE_SIZE));
CHECK_MM(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_FIXED, fd, 0));
strcpy(addr, content);
CHECK_MM(mmap(addr + 2 * PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_FIXED, fd, 2 * PAGE_SIZE));
CHECK_MM(mmap(addr + PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_FIXED, fd, PAGE_SIZE));
char *new_addr = CHECK_MM(mremap(addr, 3 * PAGE_SIZE, 3 * PAGE_SIZE,
MREMAP_MAYMOVE | MREMAP_FIXED,
addr + 3 * PAGE_SIZE));
TEST_RES(strcmp(new_addr, content), _ret == 0);
TEST_SUCC(munmap(new_addr, 3 * PAGE_SIZE));
close(fd);
unlink(filename);
}
END_TEST()