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