• Uladzislau Rezki (Sony)'s avatar
    vmalloc: add test driver to analyse vmalloc allocator · 3f21a6b7
    Uladzislau Rezki (Sony) authored
    This adds a new kernel module for analysis of vmalloc allocator.  It is
    only enabled as a module.  There are two main reasons this module should
    be used for: performance evaluation and stressing of vmalloc subsystem.
    
    It consists of several test cases.  As of now there are 8.  The module
    has five parameters we can specify to change its the behaviour.
    
    1) run_test_mask - set of tests to be run
    
    id: 1,   name: fix_size_alloc_test
    id: 2,   name: full_fit_alloc_test
    id: 4,   name: long_busy_list_alloc_test
    id: 8,   name: random_size_alloc_test
    id: 16,  name: fix_align_alloc_test
    id: 32,  name: random_size_align_alloc_test
    id: 64,  name: align_shift_alloc_test
    id: 128, name: pcpu_alloc_test
    
    By default all tests are in run test mask.  If you want to select some
    specific tests it is possible to pass the mask.  For example for first,
    second and fourth tests we go 11 value.
    
    2) test_repeat_count - how many times each test should be repeated
    By default it is one time per test. It is possible to pass any number.
    As high the value is the test duration gets increased.
    
    3) test_loop_count - internal test loop counter. By default it is set
    to 1000000.
    
    4) single_cpu_test - use one CPU to run the tests
    By default this parameter is set to false. It means that all online
    CPUs execute tests. By setting it to 1, the tests are executed by
    first online CPU only.
    
    5) sequential_test_order - run tests in sequential order
    By default this parameter is set to false. It means that before running
    tests the order is shuffled. It is possible to make it sequential, just
    set it to 1.
    
    Performance analysis:
    In order to evaluate performance of vmalloc allocations, usually it
    makes sense to use only one CPU that runs tests, use sequential order,
    number of repeat tests can be different as well as set of test mask.
    
    For example if we want to run all tests, to use one CPU and repeat each
    test 3 times. Insert the module passing following parameters:
    
    single_cpu_test=1 sequential_test_order=1 test_repeat_count=3
    
    with following output:
    
    <snip>
    Summary: fix_size_alloc_test passed: 3 failed: 0 repeat: 3 loops: 1000000 avg: 901177 usec
    Summary: full_fit_alloc_test passed: 3 failed: 0 repeat: 3 loops: 1000000 avg: 1039341 usec
    Summary: long_busy_list_alloc_test passed: 3 failed: 0 repeat: 3 loops: 1000000 avg: 11775763 usec
    Summary: random_size_alloc_test passed 3: failed: 0 repeat: 3 loops: 1000000 avg: 6081992 usec
    Summary: fix_align_alloc_test passed: 3 failed: 0 repeat: 3, loops: 1000000 avg: 2003712 usec
    Summary: random_size_align_alloc_test passed: 3 failed: 0 repeat: 3 loops: 1000000 avg: 2895689 usec
    Summary: align_shift_alloc_test passed: 0 failed: 3 repeat: 3 loops: 1000000 avg: 573 usec
    Summary: pcpu_alloc_test passed: 3 failed: 0 repeat: 3 loops: 1000000 avg: 95802 usec
    All test took CPU0=192945605995 cycles
    <snip>
    
    The align_shift_alloc_test is expected to be failed.
    
    Stressing:
    In order to stress the vmalloc subsystem we run all available test cases
    on all available CPUs simultaneously. In order to prevent constant behaviour
    pattern, the test cases array is shuffled by default to randomize the order
    of test execution.
    
    For example if we want to run all tests(default), use all online CPUs(default)
    with shuffled order(default) and to repeat each test 30 times. The command
    would be like:
    
    modprobe vmalloc_test test_repeat_count=30
    
    Expected results are the system is alive, there are no any BUG_ONs or Kernel
    Panics the tests are completed, no memory leaks.
    
    [urezki@gmail.com: fix 32-bit builds]
      Link: http://lkml.kernel.org/r/20190106214839.ffvjvmrn52uqog7k@pc636
    [urezki@gmail.com: make CONFIG_TEST_VMALLOC depend on CONFIG_MMU]
      Link: http://lkml.kernel.org/r/20190219085441.s6bg2gpy4esny5vw@pc636
    Link: http://lkml.kernel.org/r/20190103142108.20744-3-urezki@gmail.comSigned-off-by: default avatarUladzislau Rezki (Sony) <urezki@gmail.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Oleksiy Avramchenko <oleksiy.avramchenko@sonymobile.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3f21a6b7
test_vmalloc.c 10.6 KB