在 2024/1/24 22:41, Chenyuan Yang 写道: > Hi Zhihao, > > Thanks very much for your reply and further exploration of this crash! > > I have attached the config to reproduce this memory leak. For the > command line, you can use qemu to boot the kernel (You need to build > the bullseye-image first). > ``` > mkdir -p logs > qemu-system-x86_64 \ > -m 2G \ > -smp 2 \ > -kernel linux/arch/x86/boot/bzImage \ > -append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \ > -drive file=image/bullseye-qemu.img,format=raw \ > -net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \ > -net nic,model=e1000 \ > -enable-kvm \ > -nographic \ > -pidfile vm.pid \ > ``` > > In qemu, you can run > ``` > gcc -pthread repro.c -o exe > ./exe > ``` > to reproduce the memory leak. > The bad news is that I can't reproduce the problem with your kernel config. The good news is that I seem to find the cause of the problem by code reviewing: alloc_ai -> kmem_cache_create -> kmem_cache_create_usercopy: s = __kmem_cache_alias s = find_mergeable // cannot find mergeable kmem_cache, s = NULL create_cache s = kmem_cache_zalloc __kmem_cache_create(s) sysfs_slab_add kobject_init_and_add(&s->kobj) kobject_init(kobj) // kobj->kref = 1 kobject_add_varg kobject_set_name_vargs kvasprintf_const kstrdup_const kstrdup kmalloc_track_caller // allocated memory kobj->name = s // assign allocated memory to kobj->name kobject_add_internal create_dir // failed caused by ENOMEM // kobj->name won't be released even 's' is released You can reproduce it by executing ubiattach -m0 with reproduce.diff applied: [root@localhost ~]# cat /sys/kernel/debug/kmemleak unreferenced object 0xffff88813b488080 (size 16): comm "ubiattach", pid 9535, jiffies 4294943095 hex dump (first 16 bytes): 3a 30 30 30 30 30 35 36 00 00 00 00 00 00 00 00 :0000056........ backtrace (crc 8a117ab9): [] __kmalloc_node_track_caller+0x322/0x420 [] kstrdup+0x3c/0x70 [] kstrdup_const+0x5f/0x70 [] kvasprintf_const+0xc6/0x110 [] kobject_set_name_vargs+0x40/0xd0 [] kobject_init_and_add+0x8b/0xf0 [] sysfs_slab_add+0x119/0x1e0 [] __kmem_cache_create+0x41c/0x590 [] kmem_cache_create_usercopy+0x169/0x300 [] kmem_cache_create+0x11/0x20 [] ubi_attach+0xc6/0x1de0 [] ubi_attach_mtd_dev+0x8a3/0x1120 [] ctrl_cdev_ioctl+0x1fc/0x270 [] __x64_sys_ioctl+0xf2/0x140 [] do_syscall_64+0x50/0x140 [] entry_SYSCALL_64_after_hwframe+0x63/0x6b There are two ways to fix it: 1. Release kobj->name directly in the error baranch of kobject_add_internal() after calling create_dir(). 2. Put kobj's refcnt in the error baranch of kobject_add_internal() after calling create_dir(). I'm not sure which one is better or whether there are other fix methods, maybe you can send an email in kobj related mailiing lists to confirm the problem.