• Pavel Tatashin's avatar
    selftests/vm: gup_test: fix test flag · 79dbf135
    Pavel Tatashin authored
    In gup_test both gup_flags and test_flags use the same flags field.
    This is broken.
    
    Farther, in the actual gup_test.c all the passed gup_flags are erased
    and unconditionally replaced with FOLL_WRITE.
    
    Which means that test_flags are ignored, and code like this always
    performs pin dump test:
    
    155  			if (gup->flags & GUP_TEST_FLAG_DUMP_PAGES_USE_PIN)
    156  				nr = pin_user_pages(addr, nr, gup->flags,
    157  						    pages + i, NULL);
    158  			else
    159  				nr = get_user_pages(addr, nr, gup->flags,
    160  						    pages + i, NULL);
    161  			break;
    
    Add a new test_flags field, to allow raw gup_flags to work.  Add a new
    subcommand for DUMP_USER_PAGES_TEST to specify that pin test should be
    performed.
    
    Remove unconditional overwriting of gup_flags via FOLL_WRITE.  But,
    preserve the previous behaviour where FOLL_WRITE was the default flag,
    and add a new option "-W" to unset FOLL_WRITE.
    
    Rename flags with gup_flags.
    
    With the fix, dump works like this:
    
      root@virtme:/# gup_test  -c
      ---- page #0, starting from user virt addr: 0x7f8acb9e4000
      page:00000000d3d2ee27 refcount:2 mapcount:1 mapping:0000000000000000
      index:0x0 pfn:0x100bcf
      anon flags: 0x300000000080016(referenced|uptodate|lru|swapbacked)
      raw: 0300000000080016 ffffd0e204021608 ffffd0e208df2e88 ffff8ea04243ec61
      raw: 0000000000000000 0000000000000000 0000000200000000 0000000000000000
      page dumped because: gup_test: dump_pages() test
      DUMP_USER_PAGES_TEST: done
    
      root@virtme:/# gup_test  -c -p
      ---- page #0, starting from user virt addr: 0x7fd19701b000
      page:00000000baed3c7d refcount:1025 mapcount:1 mapping:0000000000000000
      index:0x0 pfn:0x108008
      anon flags: 0x300000000080014(uptodate|lru|swapbacked)
      raw: 0300000000080014 ffffd0e204200188 ffffd0e205e09088 ffff8ea04243ee71
      raw: 0000000000000000 0000000000000000 0000040100000000 0000000000000000
      page dumped because: gup_test: dump_pages() test
      DUMP_USER_PAGES_TEST: done
    
    Refcount shows the difference between pin vs no-pin case.
    Also change type of nr from int to long, as it counts number of pages.
    
    Link: https://lkml.kernel.org/r/20210215161349.246722-14-pasha.tatashin@soleen.comSigned-off-by: default avatarPavel Tatashin <pasha.tatashin@soleen.com>
    Reviewed-by: default avatarJohn Hubbard <jhubbard@nvidia.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Ira Weiny <ira.weiny@intel.com>
    Cc: James Morris <jmorris@namei.org>
    Cc: Jason Gunthorpe <jgg@nvidia.com>
    Cc: Jason Gunthorpe <jgg@ziepe.ca>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sasha Levin <sashal@kernel.org>
    Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Cc: Tyler Hicks <tyhicks@linux.microsoft.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    79dbf135
gup_test.c 4.17 KB