Skip to content

Commit 3d8e62d

Browse files
committed
Add test/mremap.c, using MREMAP_FIXED
1 parent f113785 commit 3d8e62d

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

src/mtcp/mtcp_restart.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,8 @@ compute_regions_to_munmap(RestoreInfo *rinfo)
647647

648648
NO_OPTIMIZE
649649
static void
650-
restore_vdso_vvar_work(MemRegion *currentRegion, MemRegion *ckptRegion, const char *regionName)
650+
restore_vdso_vvar_work(MemRegion *currentRegion, MemRegion *ckptRegion,
651+
const char *regionName)
651652
{
652653
int mtcp_sys_errno;
653654

@@ -677,7 +678,8 @@ restore_vdso_vvar(RestoreInfo *rinfo)
677678
{
678679
restore_vdso_vvar_work(&rinfo->currentVdso, &rinfo->ckptHdr.vdso, "[vdso]");
679680
restore_vdso_vvar_work(&rinfo->currentVvar, &rinfo->ckptHdr.vvar, "[vvar]");
680-
restore_vdso_vvar_work(&rinfo->currentVvarVClock, &rinfo->ckptHdr.vvarVClock, "[vvar_vclock]");
681+
restore_vdso_vvar_work(&rinfo->currentVvarVClock, &rinfo->ckptHdr.vvarVClock,
682+
"[vvar_vclock]");
681683

682684
if (rinfo->currentVdso.startAddr != 0) {
683685
mtcp_setauxval(rinfo->environ, AT_SYSINFO_EHDR,
@@ -967,9 +969,9 @@ doAreasOverlap(Area *area, MemRegion *memRegion)
967969
}
968970

969971
/* This uses MREMAP_FIXED | MREMAP_MAYMOVE to move a memory segment.
970-
* Note that we need 'MREMAP_MAYMOVE'. With only 'MREMAP_FIXED', the
971-
* kernel can overwrite an existing memory region.
972-
* Note that 'mremap' and hence 'mremap_move' do not allow overlapping src and dest.
972+
* Note that 'MREMAP_MAYMOVE' is required, if using 'MREMAP_FIXED'.
973+
* Note that 'mremap' and hence 'mremap_move' do not allow overlapping
974+
* src and dest.
973975
*/
974976
NO_OPTIMIZE
975977
static int

test/autotest.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,8 @@ def saveResultsNMI():
897897

898898
runTest("mmap1", 1, ["./test/mmap1"])
899899

900+
runTest("mremap", 1, ["./test/mremap"])
901+
900902
if HAS_SELINUX == "yes":
901903
runTest("selinux1", 1, ["./test/selinux1"])
902904

test/mremap.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#define _GNU_SOURCE
2+
#include <assert.h>
3+
#include <unistd.h>
4+
#include <sys/mman.h>
5+
6+
#define PAGE_SIZE 4096
7+
8+
int main() {
9+
void *old_addr1, *old_addr2, *new_addr;
10+
while (1) {
11+
old_addr1 = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
12+
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
13+
old_addr2 = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
14+
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
15+
munmap(old_addr2, PAGE_SIZE);
16+
// We now know that old_addr1 is mapped and old_addr2 is not mapped.
17+
new_addr = mremap(old_addr1, PAGE_SIZE, PAGE_SIZE,
18+
MREMAP_MAYMOVE | MREMAP_FIXED, old_addr2);
19+
assert (new_addr == old_addr2);
20+
munmap(old_addr2, PAGE_SIZE);
21+
sleep(1);
22+
}
23+
return 0;
24+
}

0 commit comments

Comments
 (0)