• Sandipan Das's avatar
    perf/x86/amd/uncore: Fix memory leak for events array · bdfe3459
    Sandipan Das authored
    When a CPU comes online, the per-CPU NB and LLC uncore contexts are
    freed but not the events array within the context structure. This
    causes a memory leak as identified by the kmemleak detector.
    
      [...]
      unreferenced object 0xffff8c5944b8e320 (size 32):
        comm "swapper/0", pid 1, jiffies 4294670387 (age 151.072s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        backtrace:
          [<000000000759fb79>] amd_uncore_cpu_up_prepare+0xaf/0x230
          [<00000000ddc9e126>] cpuhp_invoke_callback+0x2cf/0x470
          [<0000000093e727d4>] cpuhp_issue_call+0x14d/0x170
          [<0000000045464d54>] __cpuhp_setup_state_cpuslocked+0x11e/0x330
          [<0000000069f67cbd>] __cpuhp_setup_state+0x6b/0x110
          [<0000000015365e0f>] amd_uncore_init+0x260/0x321
          [<00000000089152d2>] do_one_initcall+0x3f/0x1f0
          [<000000002d0bd18d>] kernel_init_freeable+0x1ca/0x212
          [<0000000030be8dde>] kernel_init+0x11/0x120
          [<0000000059709e59>] ret_from_fork+0x22/0x30
      unreferenced object 0xffff8c5944b8dd40 (size 64):
        comm "swapper/0", pid 1, jiffies 4294670387 (age 151.072s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        backtrace:
          [<00000000306efe8b>] amd_uncore_cpu_up_prepare+0x183/0x230
          [<00000000ddc9e126>] cpuhp_invoke_callback+0x2cf/0x470
          [<0000000093e727d4>] cpuhp_issue_call+0x14d/0x170
          [<0000000045464d54>] __cpuhp_setup_state_cpuslocked+0x11e/0x330
          [<0000000069f67cbd>] __cpuhp_setup_state+0x6b/0x110
          [<0000000015365e0f>] amd_uncore_init+0x260/0x321
          [<00000000089152d2>] do_one_initcall+0x3f/0x1f0
          [<000000002d0bd18d>] kernel_init_freeable+0x1ca/0x212
          [<0000000030be8dde>] kernel_init+0x11/0x120
          [<0000000059709e59>] ret_from_fork+0x22/0x30
      [...]
    
    Fix the problem by freeing the events array before freeing the uncore
    context.
    
    Fixes: 39621c58 ("perf/x86/amd/uncore: Use dynamic events array")
    Reported-by: default avatarRavi Bangoria <ravi.bangoria@amd.com>
    Signed-off-by: default avatarSandipan Das <sandipan.das@amd.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Tested-by: default avatarRavi Bangoria <ravi.bangoria@amd.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/4fa9e5ac6d6e41fa889101e7af7e6ba372cfea52.1662613255.git.sandipan.das@amd.com
    bdfe3459
uncore.c 20.1 KB