Re: [PATCH bpf-next] bpf: Fix kmemleak warnings for percpu hashmap

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2/24/25 9:55 AM, Yonghong Song wrote:
Vlad Poenaru from Meta reported the following kmemleak issues:

   ...
   unreferenced object 0x606fd7c44ac8 (size 32):
     comm "floodgate_agent", pid 5077, jiffies 4294746072
     hex dump (first 32 bytes on cpu 32):
       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 (crc 0):
       pcpu_alloc_noprof+0x730/0xeb0
       bpf_map_alloc_percpu+0x69/0xc0
       prealloc_init+0x9d/0x1b0
       htab_map_alloc+0x363/0x510
       map_create+0x215/0x3a0
       __sys_bpf+0x16b/0x3e0
       __x64_sys_bpf+0x18/0x20
       do_syscall_64+0x7b/0x150
       entry_SYSCALL_64_after_hwframe+0x4b/0x53
   unreferenced object 0x606fd7c44ae8 (size 32):
     comm "floodgate_agent", pid 5077, jiffies 4294746072
     hex dump (first 32 bytes on cpu 32):
       d3 08 00 00 00 00 00 00 d3 08 00 00 00 00 00 00  ................
       00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
     backtrace (crc d197b0fe):
       pcpu_alloc_noprof+0x730/0xeb0
       bpf_map_alloc_percpu+0x69/0xc0
       prealloc_init+0x9d/0x1b0
       htab_map_alloc+0x363/0x510
       map_create+0x215/0x3a0
       __sys_bpf+0x16b/0x3e0
       __x64_sys_bpf+0x18/0x20
       do_syscall_64+0x7b/0x150
       entry_SYSCALL_64_after_hwframe+0x4b/0x53
   ...

Further investigation shows the reason is due to not 8-byte aligned
store of percpu pointer in htab_elem_set_ptr():
   *(void __percpu **)(l->key + key_size) = pptr;

Note that the whole htab_elem alignment is 8 (for x86_64). If the key_size
is 4, that means pptr is stored in a location which is 4 byte aligned but
not 8 byte aligned. In mm/kmemleak.c, scan_block() scans the memory based
on 8 byte stride, so it won't detect above pptr, hence reporting the memory
leak.

In htab_map_alloc(), we already have

         htab->elem_size = sizeof(struct htab_elem) +
                           round_up(htab->map.key_size, 8);
         if (percpu)
                 htab->elem_size += sizeof(void *);
         else
                 htab->elem_size += round_up(htab->map.value_size, 8);

So storing pptr with 8-byte alignment won't cause any problem and can fix
kmemleak too.

Acked-by: Martin KaFai Lau <martin.lau@xxxxxxxxxx>




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux