• Jinjie Ruan's avatar
    kunit: test: Fix the possible memory leak in executor_test · 8040345f
    Jinjie Ruan authored
    When CONFIG_KUNIT_ALL_TESTS=y, making CONFIG_DEBUG_KMEMLEAK=y and
    CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN=y, the below memory leak is detected.
    
    If kunit_filter_suites() succeeds, not only copy but also filtered_suite
    and filtered_suite->test_cases should be freed.
    
    So as Rae suggested, to avoid the suite set never be freed when
    KUNIT_ASSERT_EQ() fails and exits after kunit_filter_suites() succeeds,
    update kfree_at_end() func to free_suite_set_at_end() to use
    kunit_free_suite_set() to free them as kunit_module_exit() and
    kunit_run_all_tests() do it. As the second arg got of
    free_suite_set_at_end() is a local variable, copy it for free to avoid
    wild-memory-access. After applying this patch, the following memory leak
    is never detected.
    
    unreferenced object 0xffff8881001de400 (size 1024):
      comm "kunit_try_catch", pid 1396, jiffies 4294720452 (age 932.801s)
      hex dump (first 32 bytes):
        73 75 69 74 65 32 00 00 00 00 00 00 00 00 00 00  suite2..........
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff817db753>] __kmalloc_node_track_caller+0x53/0x150
        [<ffffffff817bd242>] kmemdup+0x22/0x50
        [<ffffffff829e961d>] kunit_filter_suites+0x44d/0xcc0
        [<ffffffff829eb69f>] filter_suites_test+0x12f/0x360
        [<ffffffff829e802a>] kunit_generic_run_threadfn_adapter+0x4a/0x90
        [<ffffffff81236fc6>] kthread+0x2b6/0x380
        [<ffffffff81096afd>] ret_from_fork+0x2d/0x70
        [<ffffffff81003511>] ret_from_fork_asm+0x11/0x20
    unreferenced object 0xffff8881052cd388 (size 192):
      comm "kunit_try_catch", pid 1396, jiffies 4294720452 (age 932.801s)
      hex dump (first 32 bytes):
        a0 85 9e 82 ff ff ff ff 80 cd 7c 84 ff ff ff ff  ..........|.....
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff817dbad2>] __kmalloc+0x52/0x150
        [<ffffffff829e9651>] kunit_filter_suites+0x481/0xcc0
        [<ffffffff829eb69f>] filter_suites_test+0x12f/0x360
        [<ffffffff829e802a>] kunit_generic_run_threadfn_adapter+0x4a/0x90
        [<ffffffff81236fc6>] kthread+0x2b6/0x380
        [<ffffffff81096afd>] ret_from_fork+0x2d/0x70
        [<ffffffff81003511>] ret_from_fork_asm+0x11/0x20
    
    unreferenced object 0xffff888100da8400 (size 1024):
      comm "kunit_try_catch", pid 1398, jiffies 4294720454 (age 781.945s)
      hex dump (first 32 bytes):
        73 75 69 74 65 32 00 00 00 00 00 00 00 00 00 00  suite2..........
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff817db753>] __kmalloc_node_track_caller+0x53/0x150
        [<ffffffff817bd242>] kmemdup+0x22/0x50
        [<ffffffff829e961d>] kunit_filter_suites+0x44d/0xcc0
        [<ffffffff829eb13f>] filter_suites_test_glob_test+0x12f/0x560
        [<ffffffff829e802a>] kunit_generic_run_threadfn_adapter+0x4a/0x90
        [<ffffffff81236fc6>] kthread+0x2b6/0x380
        [<ffffffff81096afd>] ret_from_fork+0x2d/0x70
        [<ffffffff81003511>] ret_from_fork_asm+0x11/0x20
    unreferenced object 0xffff888105117878 (size 96):
      comm "kunit_try_catch", pid 1398, jiffies 4294720454 (age 781.945s)
      hex dump (first 32 bytes):
        a0 85 9e 82 ff ff ff ff a0 ac 7c 84 ff ff ff ff  ..........|.....
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff817dbad2>] __kmalloc+0x52/0x150
        [<ffffffff829e9651>] kunit_filter_suites+0x481/0xcc0
        [<ffffffff829eb13f>] filter_suites_test_glob_test+0x12f/0x560
        [<ffffffff829e802a>] kunit_generic_run_threadfn_adapter+0x4a/0x90
        [<ffffffff81236fc6>] kthread+0x2b6/0x380
        [<ffffffff81096afd>] ret_from_fork+0x2d/0x70
        [<ffffffff81003511>] ret_from_fork_asm+0x11/0x20
    unreferenced object 0xffff888102c31c00 (size 1024):
      comm "kunit_try_catch", pid 1404, jiffies 4294720460 (age 781.948s)
      hex dump (first 32 bytes):
        6e 6f 72 6d 61 6c 5f 73 75 69 74 65 00 00 00 00  normal_suite....
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff817db753>] __kmalloc_node_track_caller+0x53/0x150
        [<ffffffff817bd242>] kmemdup+0x22/0x50
        [<ffffffff829ecf17>] kunit_filter_attr_tests+0xf7/0x860
        [<ffffffff829e99ff>] kunit_filter_suites+0x82f/0xcc0
        [<ffffffff829ea975>] filter_attr_test+0x195/0x5f0
        [<ffffffff829e802a>] kunit_generic_run_threadfn_adapter+0x4a/0x90
        [<ffffffff81236fc6>] kthread+0x2b6/0x380
        [<ffffffff81096afd>] ret_from_fork+0x2d/0x70
        [<ffffffff81003511>] ret_from_fork_asm+0x11/0x20
    unreferenced object 0xffff8881052cd250 (size 192):
      comm "kunit_try_catch", pid 1404, jiffies 4294720460 (age 781.948s)
      hex dump (first 32 bytes):
        a0 85 9e 82 ff ff ff ff 00 a9 7c 84 ff ff ff ff  ..........|.....
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff817dbad2>] __kmalloc+0x52/0x150
        [<ffffffff829ecfc1>] kunit_filter_attr_tests+0x1a1/0x860
        [<ffffffff829e99ff>] kunit_filter_suites+0x82f/0xcc0
        [<ffffffff829ea975>] filter_attr_test+0x195/0x5f0
        [<ffffffff829e802a>] kunit_generic_run_threadfn_adapter+0x4a/0x90
        [<ffffffff81236fc6>] kthread+0x2b6/0x380
        [<ffffffff81096afd>] ret_from_fork+0x2d/0x70
        [<ffffffff81003511>] ret_from_fork_asm+0x11/0x20
    unreferenced object 0xffff888104f4e400 (size 1024):
      comm "kunit_try_catch", pid 1408, jiffies 4294720464 (age 781.944s)
      hex dump (first 32 bytes):
        73 75 69 74 65 00 00 00 00 00 00 00 00 00 00 00  suite...........
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff817db753>] __kmalloc_node_track_caller+0x53/0x150
        [<ffffffff817bd242>] kmemdup+0x22/0x50
        [<ffffffff829ecf17>] kunit_filter_attr_tests+0xf7/0x860
        [<ffffffff829e99ff>] kunit_filter_suites+0x82f/0xcc0
        [<ffffffff829e9fc3>] filter_attr_skip_test+0x133/0x6e0
        [<ffffffff829e802a>] kunit_generic_run_threadfn_adapter+0x4a/0x90
        [<ffffffff81236fc6>] kthread+0x2b6/0x380
        [<ffffffff81096afd>] ret_from_fork+0x2d/0x70
        [<ffffffff81003511>] ret_from_fork_asm+0x11/0x20
    unreferenced object 0xffff8881052cc620 (size 192):
      comm "kunit_try_catch", pid 1408, jiffies 4294720464 (age 781.944s)
      hex dump (first 32 bytes):
        a0 85 9e 82 ff ff ff ff c0 a8 7c 84 ff ff ff ff  ..........|.....
        00 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00  ................
      backtrace:
        [<ffffffff817dbad2>] __kmalloc+0x52/0x150
        [<ffffffff829ecfc1>] kunit_filter_attr_tests+0x1a1/0x860
        [<ffffffff829e99ff>] kunit_filter_suites+0x82f/0xcc0
        [<ffffffff829e9fc3>] filter_attr_skip_test+0x133/0x6e0
        [<ffffffff829e802a>] kunit_generic_run_threadfn_adapter+0x4a/0x90
        [<ffffffff81236fc6>] kthread+0x2b6/0x380
        [<ffffffff81096afd>] ret_from_fork+0x2d/0x70
        [<ffffffff81003511>] ret_from_fork_asm+0x11/0x20
    
    Fixes: e5857d39 ("kunit: flatten kunit_suite*** to kunit_suite** in .kunit_test_suites")
    Fixes: 76066f93 ("kunit: add tests for filtering attributes")
    Signed-off-by: default avatarJinjie Ruan <ruanjinjie@huawei.com>
    Suggested-by: default avatarRae Moar <rmoar@google.com>
    Reviewed-by: default avatarDavid Gow <davidgow@google.com>
    Suggested-by: default avatarDavid Gow <davidgow@google.com>
    Reported-by: default avatarkernel test robot <lkp@intel.com>
    Closes: https://lore.kernel.org/oe-kbuild-all/202309142251.uJ8saAZv-lkp@intel.com/
    Closes: https://lore.kernel.org/oe-kbuild-all/202309270433.wGmFRGjd-lkp@intel.com/Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    8040345f
executor_test.c 9.46 KB