aboutsummaryrefslogtreecommitdiff
path: root/tests/tcg
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2022-09-06 02:08:39 +0200
committerLaurent Vivier <laurent@vivier.eu>2022-09-27 09:30:46 +0200
commit38b870cc8c5e9d079649d8769c8f271f28953d24 (patch)
tree6ecb6b410e97034b2899ebfa1d6f671cc3b4afe9 /tests/tcg
parentf93b76958a358e82bfdd1474598fe75184afeb4d (diff)
tests/tcg/linux-test: Add linux-madvise test
Add a test that checks madvise(MADV_DONTNEED) behavior with anonymous and file mappings in order to prevent regressions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220906000839.1672934-6-iii@linux.ibm.com> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Diffstat (limited to 'tests/tcg')
-rw-r--r--tests/tcg/multiarch/linux/linux-madvise.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/tcg/multiarch/linux/linux-madvise.c b/tests/tcg/multiarch/linux/linux-madvise.c
new file mode 100644
index 0000000000..29d0997e68
--- /dev/null
+++ b/tests/tcg/multiarch/linux/linux-madvise.c
@@ -0,0 +1,70 @@
+#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));
+ 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;
+}