6ada861951
When guest page size > host page size, this test can fail due to the SIGBUS protection hack. Avoid this by making sure that the file size is at least one guest page. Visible with alpha guest on x86_64 host. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com> Acked-by: Helge Deller <deller@gmx.de> Message-Id: <20240102015808.132373-26-richard.henderson@linaro.org>
73 lines
1.7 KiB
C
73 lines
1.7 KiB
C
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <sys/mman.h>
|
|
#include <unistd.h>
|
|
|
|
static void test_anonymous(void)
|
|
{
|
|
int pagesize = getpagesize();
|
|
char *page;
|
|
int ret;
|
|
|
|
page = mmap(NULL, pagesize, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
|
assert(page != MAP_FAILED);
|
|
|
|
/* Check that mprotect() does not interfere with MADV_DONTNEED. */
|
|
ret = mprotect(page, pagesize, PROT_READ | PROT_WRITE);
|
|
assert(ret == 0);
|
|
|
|
/* Check that MADV_DONTNEED clears the page. */
|
|
*page = 42;
|
|
ret = madvise(page, pagesize, MADV_DONTNEED);
|
|
assert(ret == 0);
|
|
assert(*page == 0);
|
|
|
|
ret = munmap(page, pagesize);
|
|
assert(ret == 0);
|
|
}
|
|
|
|
static void test_file(void)
|
|
{
|
|
char tempname[] = "/tmp/.cmadviseXXXXXX";
|
|
int pagesize = getpagesize();
|
|
ssize_t written;
|
|
char c = 42;
|
|
char *page;
|
|
int ret;
|
|
int fd;
|
|
|
|
fd = mkstemp(tempname);
|
|
assert(fd != -1);
|
|
ret = unlink(tempname);
|
|
assert(ret == 0);
|
|
written = write(fd, &c, sizeof(c));
|
|
assert(written == sizeof(c));
|
|
ret = ftruncate(fd, pagesize);
|
|
assert(ret == 0);
|
|
page = mmap(NULL, pagesize, PROT_READ, MAP_PRIVATE, fd, 0);
|
|
assert(page != MAP_FAILED);
|
|
|
|
/* Check that mprotect() does not interfere with MADV_DONTNEED. */
|
|
ret = mprotect(page, pagesize, PROT_READ | PROT_WRITE);
|
|
assert(ret == 0);
|
|
|
|
/* Check that MADV_DONTNEED resets the page. */
|
|
*page = 0;
|
|
ret = madvise(page, pagesize, MADV_DONTNEED);
|
|
assert(ret == 0);
|
|
assert(*page == c);
|
|
|
|
ret = munmap(page, pagesize);
|
|
assert(ret == 0);
|
|
ret = close(fd);
|
|
assert(ret == 0);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
test_anonymous();
|
|
test_file();
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|