On Fri, Jul 22, 2022 at 04:07:47PM +0200, David Hildenbrand wrote: > On 22.07.22 16:00, David Hildenbrand wrote: > > On 22.07.22 15:44, Peter Xu wrote: > >> 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 don't think we need that? SOFTDIRTY tracking enabled should be > > sufficient, or what am I missing? > > > > I think you're right that it doesn't work with tmpfile. I do wonder why, > because I'd have thought that it's sufficient for > vma_wants_writenotify() to return "1" due to the > vma_soft_dirty_enabled() check. I can't say I know the whole rational of this, but I think it's below that will start to return 0 already before the soft-dirty check: if (pgprot_val(vm_page_prot) != pgprot_val(vm_pgprot_modify(vm_page_prot, vm_flags))) return 0; in vma_wants_writenotify(). -- Peter Xu