On Sat, May 23, 2020 at 06:21:01AM -0700, Guenter Roeck wrote:
> On Wed, May 13, 2020 at 06:18:40PM +0300, Heikki Krogerus wrote:
> > In the function kobject_cleanup(), kobject_del(kobj) is
> > called before the kobj->release(). That makes it possible to
> > release the parent of the kobject before the kobject itself.
> > 
> > To fix that, adding function __kboject_del() that does
> 
> s/kboject/kobject/
> 
> > everything that kobject_del() does except release the parent
> > reference. kobject_cleanup() then calls __kobject_del()
> > instead of kobject_del(), and separately decrements the
> > reference count of the parent kobject after kobj->release()
> > has been called.
> > 
> > Reported-by: Naresh Kamboju <[email protected]>
> > Reported-by: kernel test robot <[email protected]>
> > Fixes: 7589238a8cf3 ("Revert "software node: Simplify 
> > software_node_release() function"")
> > Cc: Brendan Higgins <[email protected]>
> > Cc: Randy Dunlap <[email protected]>
> > Suggested-by: "Rafael J. Wysocki" <[email protected]>
> > Signed-off-by: Heikki Krogerus <[email protected]>
> > Reviewed-by: Rafael J. Wysocki <[email protected]>
> > Reviewed-by: Brendan Higgins <[email protected]>
> > Tested-by: Brendan Higgins <[email protected]>
> > Acked-by: Randy Dunlap <[email protected]>
> > Tested-by: Randy Dunlap <[email protected]>
> 
> All my arm64be (arm64 big endian) boot tests crash with this patch
> applied. Reverting it fixes the problem. Crash log and bisect results
> (from pending-fixes branch) below.
> 

arm64 images don't crash but report lots of "poison overwritten" backtraces
like the one below. On arm, I see "refcount_t: underflow", also attached.
I didn't bisect those, but given the context I would suspect the same
culprit.

Guenter

---
[   15.017361] 
=============================================================================
[   15.017561] BUG kmalloc-2k (Not tainted): Poison overwritten
[   15.017632] 
-----------------------------------------------------------------------------
[   15.017632]
[   15.017757] Disabling lock debugging due to kernel taint
[   15.017900] INFO: 0x(____ptrval____)-0x(____ptrval____) @offset=8272. First 
byte 0x6a instead of 0x6b
[   15.018039] INFO: Allocated in i2cdev_attach_adapter.part.10+0x44/0x180 
age=18 cpu=0 pid=1
[   15.018122]  __slab_alloc.isra.91+0x5c/0xc8
[   15.018182]  kmem_cache_alloc_trace+0x228/0x248
[   15.018235]  i2cdev_attach_adapter.part.10+0x44/0x180
[   15.018284]  i2cdev_notifier_call+0x70/0x88
[   15.018329]  notifier_call_chain+0x54/0x98
[   15.018372]  blocking_notifier_call_chain+0x5c/0x80
[   15.018423]  device_add+0x3bc/0x770
[   15.018462]  device_register+0x20/0x30
[   15.018502]  i2c_register_adapter+0xf0/0x400
[   15.018546]  i2c_add_adapter+0x80/0xd8
[   15.018587]  i2c_add_numbered_adapter+0x2c/0x38
[   15.018634]  unittest_i2c_bus_probe+0x9c/0xf0
[   15.018679]  platform_drv_probe+0x54/0xa8
[   15.018722]  really_probe+0xd8/0x330
[   15.018762]  driver_probe_device+0x58/0xf0
[   15.018805]  device_driver_attach+0x74/0x80
[   15.018871] INFO: Freed in i2cdev_dev_release+0x14/0x20 age=4 cpu=0 pid=1
[   15.018933]  kfree+0x3d0/0x3e0
[   15.018969]  i2cdev_dev_release+0x14/0x20
[   15.019011]  device_release+0x2c/0x88
[   15.019054]  kobject_put+0x7c/0x138
[   15.019092]  kobject_put+0x90/0x138
[   15.019133]  cdev_del+0x2c/0x40
[   15.019169]  cdev_device_del+0x40/0x50
[   15.019210]  put_i2c_dev+0x94/0xb0
[   15.019248]  i2cdev_detach_adapter.part.5+0x20/0x30
[   15.019296]  i2cdev_notifier_call+0x80/0x88
[   15.019339]  notifier_call_chain+0x54/0x98
[   15.019381]  blocking_notifier_call_chain+0x5c/0x80
[   15.019428]  device_del+0x84/0x3b0
[   15.019466]  device_unregister+0x18/0x38
[   15.019508]  i2c_del_adapter+0x1e8/0x240
[   15.019549]  unittest_i2c_bus_remove+0x18/0x28
[   15.019632] INFO: Slab 0x(____ptrval____) objects=5 used=5 
fp=0x0000000000000000 flags=0xffff00000010200
[   15.019717] INFO: Object 0x(____ptrval____) @offset=8192 
fp=0x(____ptrval____)
[   15.019717]

---
[   22.415374] ### dt-test ### EXPECT / : i2c i2c-1: Added multiplexed i2c bus 3
[   22.419097] ------------[ cut here ]------------
[   22.419586] WARNING: CPU: 0 PID: 1 at lib/refcount.c:28 
i2cdev_notifier_call+0x54/0x5c
[   22.419708] refcount_t: underflow; use-after-free.
[   22.419860] Modules linked in:
[   22.420074] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 
5.7.0-rc6-00275-gdbacbfd47d67 #1
[   22.420227] Hardware name: Generic OMAP3-GP (Flattened Device Tree)
[   22.420440] [<c03128e0>] (unwind_backtrace) from [<c030c900>] 
(show_stack+0x10/0x14)
[   22.420593] [<c030c900>] (show_stack) from [<c08c8df8>] 
(dump_stack+0xe0/0x10c)
[   22.420715] [<c08c8df8>] (dump_stack) from [<c0348380>] (__warn+0xf4/0x10c)
[   22.420867] [<c0348380>] (__warn) from [<c0348410>] 
(warn_slowpath_fmt+0x78/0xbc)
[   22.420989] [<c0348410>] (warn_slowpath_fmt) from [<c0eed4c8>] 
(i2cdev_notifier_call+0x54/0x5c)
[   22.421142] [<c0eed4c8>] (i2cdev_notifier_call) from [<c03745dc>] 
(notifier_call_chain+0x48/0x84)
[   22.421264] [<c03745dc>] (notifier_call_chain) from [<c0374dc0>] 
(blocking_notifier_call_chain+0x44/0x5c)
[   22.421386] [<c0374dc0>] (blocking_notifier_call_chain) from [<c0ba9c5c>] 
(device_del+0x80/0x3d4)
[   22.421508] [<c0ba9c5c>] (device_del) from [<c0ba9fbc>] 
(device_unregister+0xc/0x20)
[   22.421600] [<c0ba9fbc>] (device_unregister) from [<c0ee83d4>] 
(i2c_del_adapter+0x1ac/0x1f8)
[   22.421722] [<c0ee83d4>] (i2c_del_adapter) from [<c0eee888>] 
(i2c_mux_del_adapters+0x90/0xc8)
[   22.421874] [<c0eee888>] (i2c_mux_del_adapters) from [<c0fd4d50>] 
(unittest_i2c_mux_remove+0xc/0x14)
[   22.421997] [<c0fd4d50>] (unittest_i2c_mux_remove) from [<c0ee7b1c>] 
(i2c_device_remove+0x54/0xa8)
[   22.422119] [<c0ee7b1c>] (i2c_device_remove) from [<c0baea40>] 
(device_release_driver_internal+0xe8/0x1b8)
[   22.422241] [<c0baea40>] (device_release_driver_internal) from [<c0baeb6c>] 
(driver_detach+0x44/0x80)
[   22.422363] [<c0baeb6c>] (driver_detach) from [<c0bad6e4>] 
(bus_remove_driver+0x4c/0xa0)
[   22.422485] [<c0bad6e4>] (bus_remove_driver) from [<c1ca89e4>] 
(of_unittest_overlay+0xc90/0x11a8)
[   22.422576] [<c1ca89e4>] (of_unittest_overlay) from [<c1cab52c>] 
(of_unittest+0x24a0/0x2af0)
[   22.422698] [<c1cab52c>] (of_unittest) from [<c03022d4>] 
(do_one_initcall+0x8c/0x3bc)
[   22.422821] [<c03022d4>] (do_one_initcall) from [<c1c0103c>] 
(kernel_init_freeable+0x1a0/0x204)
[   22.422943] [<c1c0103c>] (kernel_init_freeable) from [<c11fe8c8>] 
(kernel_init+0x8/0x118)
[   22.423065] [<c11fe8c8>] (kernel_init) from [<c0300174>] 
(ret_from_fork+0x14/0x20)
[   22.423187] Exception stack(0xcb0bdfb0 to 0xcb0bdff8)
[   22.423339] dfa0:                                     00000000 00000000 
00000000 00000000
[   22.423492] dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000
[   22.423645] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
[   22.423797] irq event stamp: 774333
[   22.423919] hardirqs last  enabled at (774341): [<c03c1ab0>] 
console_unlock+0x458/0x648
[   22.424011] hardirqs last disabled at (774348): [<c03c171c>] 
console_unlock+0xc4/0x648
[   22.424163] softirqs last  enabled at (774258): [<c0301664>] 
__do_softirq+0x3bc/0x5b4
[   22.424255] softirqs last disabled at (774235): [<c03519a4>] 
irq_exit+0x160/0x170
[   22.424377] ---[ end trace ae0b985481f6b675 ]---

Reply via email to