[Nouveau] nouveau lockdep splat on init

Maarten Lankhorst maarten.lankhorst at canonical.com
Tue Jan 15 07:08:09 PST 2013


Testing airlied's current drm-fixes branch gives me this, with lockdep enabled:

[   40.864179] =============================================
[   40.864179] [ INFO: possible recursive locking detected ]
[   40.864179] 3.8.0-rc3-patser+ #915 Tainted: G        W   
[   40.864179] ---------------------------------------------
[   40.864179] modprobe/524 is trying to acquire lock:
[   40.864179]  (&subdev->mutex){+.+.+.}, at: [<ffffffffa0333ba3>] nouveau_instobj_create_+0x43/0x90 [nouveau]
[   40.864179] 
[   40.864179] but task is already holding lock:
[   40.864179]  (&subdev->mutex){+.+.+.}, at: [<ffffffffa03467f4>] nv50_disp_data_ctor+0x94/0x160 [nouveau]
[   40.864179] 
[   40.864179] other info that might help us debug this:
[   40.864179]  Possible unsafe locking scenario:
[   40.864179] 
[   40.864179]        CPU0
[   40.864179]        ----
[   40.864179]   lock(&subdev->mutex);
[   40.864179]   lock(&subdev->mutex);
[   40.864179] 
[   40.864179]  *** DEADLOCK ***
[   40.864179] 
[   40.864179]  May be due to missing lock nesting notation
[   40.864179] 
[   40.864179] 4 locks held by modprobe/524:
[   40.864179]  #0:  (&__lockdep_no_validate__){......}, at: [<ffffffff81410ea3>] __driver_attach+0x53/0xb0
[   40.864179]  #1:  (&__lockdep_no_validate__){......}, at: [<ffffffff81410eb1>] __driver_attach+0x61/0xb0
[   40.864179]  #2:  (drm_global_mutex){+.+.+.}, at: [<ffffffffa0094437>] drm_get_pci_dev+0xb7/0x2a0 [drm]
[   40.864179]  #3:  (&subdev->mutex){+.+.+.}, at: [<ffffffffa03467f4>] nv50_disp_data_ctor+0x94/0x160 [nouveau]
[   40.864179] 
[   40.864179] stack backtrace:
[   40.864179] Pid: 524, comm: modprobe Tainted: G        W    3.8.0-rc3-patser+ #915
[   40.864179] Call Trace:
[   40.864179]  [<ffffffff8109cd63>] __lock_acquire+0x783/0x1d90
[   40.864179]  [<ffffffff8109c9cf>] ? __lock_acquire+0x3ef/0x1d90
[   40.864179]  [<ffffffff8109b4d2>] ? mark_held_locks+0x82/0x130
[   40.864179]  [<ffffffff8135160e>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[   40.864179]  [<ffffffff8109e8e6>] lock_acquire+0x96/0xc0
[   40.864179]  [<ffffffffa0333ba3>] ? nouveau_instobj_create_+0x43/0x90 [nouveau]
[   40.864179]  [<ffffffffa02fc3fc>] ? nouveau_object_create_+0x9c/0xf0 [nouveau]
[   40.864179]  [<ffffffffa0333ba3>] ? nouveau_instobj_create_+0x43/0x90 [nouveau]
[   40.864179]  [<ffffffff816f5abe>] mutex_lock_nested+0x5e/0x390
[   40.864179]  [<ffffffffa0333ba3>] ? nouveau_instobj_create_+0x43/0x90 [nouveau]
[   40.864179]  [<ffffffff816fa790>] ? _raw_spin_unlock+0x30/0x60
[   40.864179]  [<ffffffffa02fc42e>] ? nouveau_object_create_+0xce/0xf0 [nouveau]
[   40.864179]  [<ffffffff816fa6ab>] ? _raw_spin_unlock_irq+0x2b/0x60
[   40.864179]  [<ffffffffa0333ba3>] nouveau_instobj_create_+0x43/0x90 [nouveau]
[   40.864179]  [<ffffffffa0334e91>] nv50_instobj_ctor+0xa1/0x1b0 [nouveau]
[   40.864179]  [<ffffffff8107126a>] ? finish_task_switch+0x3a/0x110
[   40.864179]  [<ffffffffa02fc103>] nouveau_object_ctor+0x33/0xe0 [nouveau]
[   40.864179]  [<ffffffffa0334cbf>] nv50_instmem_alloc+0x2f/0x40 [nouveau]
[   40.864179]  [<ffffffffa02fa34d>] nouveau_gpuobj_create_+0x38d/0x4c0 [nouveau]
[   40.864179]  [<ffffffffa02f74ac>] nouveau_engctx_create_+0x17c/0x3d0 [nouveau]
[   40.864179]  [<ffffffffa0346891>] nv50_disp_data_ctor+0x131/0x160 [nouveau]
[   40.864179]  [<ffffffffa02fe3f2>] ? nouveau_subdev_reset+0x72/0xb0 [nouveau]
[   40.864179]  [<ffffffffa02fc103>] nouveau_object_ctor+0x33/0xe0 [nouveau]
[   40.864179]  [<ffffffffa02fce6a>] nouveau_object_new+0x14a/0x2b0 [nouveau]
[   40.864179]  [<ffffffffa043171a>] nv50_display_create+0x1ea/0x9a0 [nouveau]
[   40.864179]  [<ffffffff81060582>] ? __cancel_work_timer+0x72/0xc0
[   40.864179]  [<ffffffffa03fe7b4>] nouveau_display_create+0x4c4/0x900 [nouveau]
[   40.864179]  [<ffffffffa03e6da2>] nouveau_drm_load+0x3b2/0x960 [nouveau]
[   40.864179]  [<ffffffff8140e599>] ? device_register+0x19/0x20
[   40.864179]  [<ffffffffa0095d11>] ? drm_sysfs_device_add+0x81/0xb0 [drm]
[   40.864179]  [<ffffffffa00944f9>] drm_get_pci_dev+0x179/0x2a0 [drm]
[   40.864179]  [<ffffffff8137042d>] ? __pci_set_master+0x4d/0x80
[   40.864179]  [<ffffffffa03e646a>] nouveau_drm_probe+0x25a/0x290 [nouveau]
[   40.864179]  [<ffffffff816fa71d>] ? _raw_spin_unlock_irqrestore+0x3d/0x80
[   40.864179]  [<ffffffff81374566>] local_pci_probe+0x46/0x80
[   40.864179]  [<ffffffff81375db9>] pci_device_probe+0xf9/0x120
[   40.864179]  [<ffffffff81410c86>] driver_probe_device+0x76/0x240
[   40.864179]  [<ffffffff81410ef3>] __driver_attach+0xa3/0xb0
[   40.864179]  [<ffffffff81410e50>] ? driver_probe_device+0x240/0x240
[   40.864179]  [<ffffffff8140f0e6>] bus_for_each_dev+0x56/0x90
[   40.864179]  [<ffffffff814107e9>] driver_attach+0x19/0x20
[   40.864179]  [<ffffffff81410388>] bus_add_driver+0x188/0x270
[   40.864179]  [<ffffffff81411425>] driver_register+0x75/0x150
[   40.864179]  [<ffffffff81374dcf>] __pci_register_driver+0x5f/0x70
[   40.864179]  [<ffffffffa009473a>] drm_pci_init+0x11a/0x130 [drm]
[   40.864179]  [<ffffffff8140b2c0>] ? vga_switcheroo_register_handler+0x40/0x90
[   40.864179]  [<ffffffffa04a3000>] ? 0xffffffffa04a2fff
[   40.864179]  [<ffffffffa04a304d>] nouveau_drm_init+0x4d/0x1000 [nouveau]
[   40.864179]  [<ffffffff810001fa>] do_one_initcall+0x3a/0x170
[   40.864179]  [<ffffffff810a9f72>] load_module+0x1a52/0x2020
[   40.864179]  [<ffffffff810a7150>] ? get_modinfo.isra.30+0xc0/0xc0
[   40.864179]  [<ffffffff8135160e>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[   40.864179]  [<ffffffff810aa611>] sys_init_module+0xd1/0x100
[   40.864179]  [<ffffffff81700752>] system_call_fastpath+0x16/0x1b

I don't understand the need for the mutex_lock in that code though, wouldn't it be better for the caller to ensure that this code is only called once?

~Maarten



More information about the Nouveau mailing list