Files
mckernel/test/issues/1383/C1383T01.c
Ken Sato 41ea9d16c4 mremap: Fix to work correctly when old_page is large_page
Change-Id: I5a589383644a8098d910e49cd7ade6df325e0366
Refs: #1383
2020-02-13 06:15:25 +00:00

94 lines
1.9 KiB
C

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/mman.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PAGES 3
#define MAP_HUGE_SHIFT 26
static unsigned long ps, hps;
void *hugetlb_mmap(unsigned long size, int pgshift)
{
return mmap(NULL, size, PROT_WRITE | PROT_READ,
MAP_ANONYMOUS | MAP_PRIVATE |
MAP_HUGETLB | (pgshift << MAP_HUGE_SHIFT),
-1, 0);
}
int main(int argc, char **argv)
{
void *p1, *p2, *p3, *p4, *old_addr, *new_addr;
int i, pgshift, err, ret = 0;
unsigned long base_start, base_size, new_start, new_size;
size_t size, remap_size;
if (argc < 2) {
printf("error: too few arguments\n");
ret = -1;
goto out;
}
pgshift = atoi(argv[1]);
hps = (1 << pgshift);
ps = getpagesize();
size = hps * PAGES;
for (i = 0; i < 4; i++) {
p1 = hugetlb_mmap(size, pgshift);
if (p1 == MAP_FAILED) {
perror("mmap fail: ");
ret = -1;
goto out;
}
printf("** mmap p1: %p - %p\n", p1, p1 + size);
p2 = hugetlb_mmap(size, pgshift);
if (p2 == MAP_FAILED) {
perror("mmap fail: ");
ret = -1;
goto out;
}
printf("** mmap p2: %p - %p\n", p2, p2 + size);
p3 = hugetlb_mmap(size, pgshift);
if (p3 == MAP_FAILED) {
perror("mmap fail: ");
ret = -1;
goto out;
}
printf("** mmap p3: %p - %p\n", p3, p3 + size);
/* make page populate */
memset(p1, 0xff, size);
memset(p2, 0xff, size);
memset(p3, 0x77, size);
remap_size = size - ps;
old_addr = p1 + ps * (i >> 1);
new_addr = p3 + ps * (i & 1);
p4 = mremap(old_addr, remap_size, remap_size,
MREMAP_FIXED | MREMAP_MAYMOVE, new_addr);
if (p4 == MAP_FAILED) {
perror("mremap fail: ");
ret = -1;
goto out;
}
if (memcmp(p4, p2, remap_size)) {
printf("memcmp detect DIFF!!\n");
ret = -1;
goto out;
}
printf("*** mremap p4: %p - %p\n", p4, p4 + remap_size);
}
printf("[OK] mremap on HUGETLB\n");
out:
return ret;
}