mremap: Fix to work correctly when old_page is large_page
Change-Id: I5a589383644a8098d910e49cd7ade6df325e0366 Refs: #1383
This commit is contained in:
committed by
Masamichi Takagi
parent
4bbdee395e
commit
41ea9d16c4
93
test/issues/1383/C1383T01.c
Normal file
93
test/issues/1383/C1383T01.c
Normal file
@ -0,0 +1,93 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user