On 12/12/2018 11:35 PM, Dmitry Safonov wrote: > Hi Waiman, > > On 12/12/18 10:28 PM, Waiman Long wrote: >> The db->lock is a raw spinlock and so the lock hold time is supposed >> to be short. This will not be the case when printk() is being involved >> in some of the critical sections. In order to avoid the long hold time, >> in case some messages need to be printed, the debug_object_is_on_stack() >> and debug_print_object() calls are now moved out of those critical >> sections. >> >> Holding the db->lock while calling printk() may lead to deadlock if >> printk() somehow requires the allocation/freeing of debug object that >> happens to be in the same hash bucket or a circular lock dependency >> warning from lockdep as reported in https://lkml.org/lkml/2018/12/11/143. >> >> [ 87.209665] WARNING: possible circular locking dependency detected >> [ 87.210547] 4.20.0-rc4-00057-gc96cf92 #1 Tainted: G W >> [ 87.211449] ------------------------------------------------------ >> [ 87.212405] getty/519 is trying to acquire lock: >> [ 87.213074] (____ptrval____) (&obj_hash[i].lock){-.-.}, at: >> debug_check_no_obj_freed+0xb4/0x302 >> [ 87.214343] >> [ 87.214343] but task is already holding lock: >> [ 87.215174] (____ptrval____) (&port_lock_key){-.-.}, at: >> uart_shutdown+0x3a3/0x4e2 >> [ 87.216260] >> [ 87.216260] which lock already depends on the new lock. >> >> This patch was also found to be able to fix a boot hanging problem >> when the initramfs image was switched on after a debugobjects splat >> from the EFI code. >> >> Signed-off-by: Waiman Long <long...@redhat.com> >> --- > I've tried to review it and found minor issues like missed > debug_object_is_on_stack() for initializing already active object. > > But than I come to opinion that it's just generally unsafe: > debug_obj life-time is protected by bucket's spin_lock. > Check the conditions when free_object() is being called.
The bucket lock is for protecting the insertion and deletion of debug_obj to/from the bucket list as well as searching within the bucket list. It has nothing to do with the life time of the debug_obj itself. Cheers, Longman