[PATCH v3 5/5] tests/tcg/linux-test: Add linux-madvise test

Ilya Leoshkevich posted 5 patches 3 years, 5 months ago
Maintainers: Richard Henderson <richard.henderson@linaro.org>, Paolo Bonzini <pbonzini@redhat.com>, Laurent Vivier <laurent@vivier.eu>, Taylor Simpson <tsimpson@quicinc.com>, "Alex Bennée" <alex.bennee@linaro.org>
[PATCH v3 5/5] tests/tcg/linux-test: Add linux-madvise test
Posted by Ilya Leoshkevich 3 years, 5 months ago
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>
---
 tests/tcg/multiarch/linux/linux-madvise.c | 70 +++++++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100644 tests/tcg/multiarch/linux/linux-madvise.c

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;
+}
-- 
2.37.2
Re: [PATCH v3 5/5] tests/tcg/linux-test: Add linux-madvise test
Posted by Laurent Vivier 3 years, 4 months ago
Le 06/09/2022 à 02:08, Ilya Leoshkevich a écrit :
> 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>
> ---
>   tests/tcg/multiarch/linux/linux-madvise.c | 70 +++++++++++++++++++++++
>   1 file changed, 70 insertions(+)
>   create mode 100644 tests/tcg/multiarch/linux/linux-madvise.c
> 
> 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;
> +}
Applied to my linux-user-for-7.2 branch.

Thanks,
Laurent