Re: [PATCH v3 2/3] selftests: soft-dirty: Add test for mprotect

From: Peter Xu
Date: Fri Jul 22 2022 - 09:44:56 EST


On Fri, Jul 22, 2022 at 09:17:34AM +0200, David Hildenbrand wrote:
> On 21.07.22 20:33, Peter Xu wrote:
> > Add two soft-diryt test cases for mprotect() on both anon or file.
>
> s/soft-diryt/soft-dirty/

Fixed.

>
> >
> > Signed-off-by: Peter Xu <peterx@xxxxxxxxxx>
> > ---
> > tools/testing/selftests/vm/soft-dirty.c | 69 ++++++++++++++++++++++++-
> > 1 file changed, 68 insertions(+), 1 deletion(-)
> >
> > diff --git a/tools/testing/selftests/vm/soft-dirty.c b/tools/testing/selftests/vm/soft-dirty.c
> > index 08ab62a4a9d0..7d93906aa43f 100644
> > --- a/tools/testing/selftests/vm/soft-dirty.c
> > +++ b/tools/testing/selftests/vm/soft-dirty.c
> > @@ -121,13 +121,78 @@ static void test_hugepage(int pagemap_fd, int pagesize)
> > free(map);
> > }
> >
> > +static void test_mprotect(int pagemap_fd, int pagesize, bool anon)
> > +{
> > + const char *type[] = {"file", "anon"};
> > + const char *fname = "./soft-dirty-test-file";
> > + int test_fd;
> > + char *map;
>
> Instead of fname, unlink, open, close, unlink you can use a tmpfile
>
> FILE *file;
>
> file = tmpfile();
> if (!file) {
> ksft_test_result_fail("tmpfile() failed\n");
> return;
> }
> test_fd = fileno(file);

Note that tmpfile() should by default fetch from /tmp which is very
possibly a tmpfs afaict. It's tricky in this special test case since I
don't think tmpfs can trigger this bug (shmem doesn't define page_mkwrite).

I wanted to create under this dir to make the best possible bet to trigger
the bug. E.g. major fs will works like xfs, btrfs, extN. It'll stop work
if someone clones the Linux repo under tmpfs but it's rare.

>
> > +
> > + if (anon) {
> > + map = mmap(NULL, pagesize, PROT_READ|PROT_WRITE,
> > + MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
> > + if (!map)
> > + ksft_exit_fail_msg("anon mmap failed\n");
> > + } else {
> > + unlink(fname);
> > + test_fd = open(fname, O_RDWR | O_CREAT);
> > + if (test_fd < 0) {
> > + ksft_test_result_skip("Test %s huge page allocation\n", __func__);
>
> Wrong copy-paste I assume :)

Yeh :) I'll fix it.

>
> > + return;
> > + }
> > + ftruncate(test_fd, pagesize);
> > + map = mmap(NULL, pagesize, PROT_READ|PROT_WRITE,
> > + MAP_SHARED, test_fd, 0);
> > + if (!map)
> > + ksft_exit_fail_msg("file mmap failed\n");
> > + }
> > +
>
> Apart from that LGTM.

Thanks,

--
Peter Xu