16 Dec, 2020

5 commits

  • gup_test_init() is only called during initialization, mark it as __init to
    save some memory.

    Link: https://lkml.kernel.org/r/20201103081016.16532-1-song.bao.hua@hisilicon.com
    Signed-off-by: Barry Song
    Reviewed-by: Jason Gunthorpe
    Cc: John Hubbard
    Cc: Ralph Campbell
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Barry Song
     
  • For quite a while, I was doing a quick hack to gup_test.c (previously,
    gup_benchmark.c) whenever I wanted to try out my changes to dump_page().
    This makes that hack unnecessary, and instead allows anyone to easily get
    the same coverage from a user space program. That saves a lot of time
    because you don't have to change the kernel, in order to test different
    pages and options.

    The new sub-test takes advantage of the existing gup_test infrastructure,
    which already provides a simple user space program, some allocated user
    space pages, an ioctl call, pinning of those pages (via either
    get_user_pages or pin_user_pages) and a corresponding kernel-side test
    invocation. There's not much more required, mainly just a couple of
    inputs from the user.

    In fact, the new test re-uses the existing command line options in order
    to get various helpful combinations (THP or normal, _fast or slow gup, gup
    vs. pup, and more).

    New command line options are: which pages to dump, and what type of
    "get/pin" to use.

    In order to figure out which pages to dump, the logic is:

    * If the user doesn't specify anything, the page 0 (the first page in
    the address range that the program sets up for testing) is dumped.

    * Or, the user can type up to 8 page indices anywhere on the command
    line. If you type more than 8, then it uses the first 8 and ignores the
    remaining items.

    For example:

    ./gup_test -ct -F 1 0 19 0x1000

    Meaning:
    -c: dump pages sub-test
    -t: use THP pages
    -F 1: use pin_user_pages() instead of get_user_pages()
    0 19 0x1000: dump pages 0, 19, and 4096

    Link: https://lkml.kernel.org/r/20201026064021.3545418-7-jhubbard@nvidia.com
    Signed-off-by: John Hubbard
    Cc: Jérôme Glisse
    Cc: Jonathan Corbet
    Cc: Ralph Campbell
    Cc: Shuah Khan
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    John Hubbard
     
  • Therefore, some minor cleanup and improvements are in order:

    1. Rename the other items appropriately.

    2. Stop reporting timing information on the non-benchmark items. It's
    still being recorded and is available, but there's no point in
    cluttering up the report with data that no one reasonably needs to
    check.

    3. Don't do iterations, for non-benchmark items.

    4. Print out a shorter, more appropriate report for the non-benchmark
    tests.

    5. Add the command that was run, to the report. This really helps, as
    there are quite a lot of options now.

    6. Use a larger integer type for cmd, now that it's being compared
    Otherwise it doesn't work, because in this case cmd is about 3 billion,
    which is the perfect size for problems with signed vs unsigned int.

    Link: https://lkml.kernel.org/r/20201026064021.3545418-6-jhubbard@nvidia.com
    Signed-off-by: John Hubbard
    Cc: Jérôme Glisse
    Cc: Jonathan Corbet
    Cc: Ralph Campbell
    Cc: Shuah Khan
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    John Hubbard
     
  • Avoid the need to copy-paste the gup_test ioctl commands and the struct
    gup_test definition, between the kernel and the user space application, by
    providing a new header file for these. This allows easier and safer
    adding of new ioctl calls, as well as reducing the overall line count.

    Details: The header file has to be able to compile independently, because
    of the arguably unfortunate way that the Makefile is written: the Makefile
    tries to build all of its prerequisites, when really it should be only
    building the .c files, and leaving the other prerequisites (LOCAL_HDRS) as
    pure dependencies.

    That Makefile limitation is probably not worth fixing, but it explains why
    one of the includes had to be moved into the new header file.

    Also: simplify the ioctl struct (struct gup_test), by deleting the unused
    __expansion[10] field. This sort of thing is what you might see in a
    stable ABI, but this low-level, kernel-developer-oriented selftests/vm
    system is very much not subject to ABI stability. So "expansion" and
    "reserved" fields are unnecessary here.

    Link: https://lkml.kernel.org/r/20201026064021.3545418-3-jhubbard@nvidia.com
    Signed-off-by: John Hubbard
    Cc: Jérôme Glisse
    Cc: Jonathan Corbet
    Cc: Ralph Campbell
    Cc: Shuah Khan
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    John Hubbard
     
  • Patch series "selftests/vm: gup_test, hmm-tests, assorted improvements", v3.

    Summary: This series provides two main things, and a number of smaller
    supporting goodies. The two main points are:

    1) Add a new sub-test to gup_test, which in turn is a renamed version
    of gup_benchmark. This sub-test allows nicer testing of dump_pages(),
    at least on user-space pages.

    For quite a while, I was doing a quick hack to gup_test.c whenever I
    wanted to try out changes to dump_page(). Then Matthew Wilcox asked me
    what I meant when I said "I used my dump_page() unit test", and I
    realized that it might be nice to check in a polished up version of
    that.

    Details about how it works and how to use it are in the commit
    description for patch #6 ("selftests/vm: gup_test: introduce the
    dump_pages() sub-test").

    2) Fixes a limitation of hmm-tests: these tests are incredibly useful,
    but only if people actually build and run them. And it turns out that
    libhugetlbfs is a little too effective at throwing a wrench in the
    works, there. So I've added a little configuration check that removes
    just two of the 21 hmm-tests, if libhugetlbfs is not available.

    Further details in the commit description of patch #8
    ("selftests/vm: hmm-tests: remove the libhugetlbfs dependency").

    Other smaller things that this series does:

    a) Remove code duplication by creating gup_test.h.

    b) Clear up the sub-test organization, and their invocation within
    run_vmtests.sh.

    c) Other minor assorted improvements.

    [1] v2 is here:
    https://lore.kernel.org/linux-doc/20200929212747.251804-1-jhubbard@nvidia.com/

    [2] https://lore.kernel.org/r/CAHk-=wgh-TMPHLY3jueHX7Y2fWh3D+nMBqVS__AZm6-oorquWA@mail.gmail.com

    This patch (of 9):

    Rename nearly every "gup_benchmark" reference and file name to "gup_test".
    The one exception is for the actual gup benchmark test itself.

    The current code already does a *little* bit more than benchmarking, and
    definitely covers more than get_user_pages_fast(). More importantly,
    however, subsequent patches are about to add some functionality that is
    non-benchmark related.

    Closely related changes:

    * Kconfig: in addition to renaming the options from GUP_BENCHMARK to
    GUP_TEST, update the help text to reflect that it's no longer a
    benchmark-only test.

    Link: https://lkml.kernel.org/r/20201026064021.3545418-1-jhubbard@nvidia.com
    Link: https://lkml.kernel.org/r/20201026064021.3545418-2-jhubbard@nvidia.com
    Signed-off-by: John Hubbard
    Cc: Jonathan Corbet
    Cc: Jérôme Glisse
    Cc: Ralph Campbell
    Cc: Shuah Khan
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    John Hubbard