Re: [Nouveau] [PATCH] nouveau: use an rwlock for the event lock.
On 11/7/23 06:32, Dave Airlie wrote: From: Dave Airlie This allows it to break the following circular locking dependency. Aug 10 07:01:29 dg1test kernel: == Aug 10 07:01:29 dg1test kernel: WARNING: possible circular locking dependency detected Aug 10 07:01:29 dg1test kernel: 6.4.0-rc7+ #10 Not tainted Aug 10 07:01:29 dg1test kernel: -- Aug 10 07:01:29 dg1test kernel: wireplumber/2236 is trying to acquire lock: Aug 10 07:01:29 dg1test kernel: 8fca5320da18 (>lock){-...}-{2:2}, at: nouveau_fence_wait_uevent_handler+0x2b/0x100 [nouveau] Aug 10 07:01:29 dg1test kernel: but task is already holding lock: Aug 10 07:01:29 dg1test kernel: 8fca41208610 (>list_lock#2){-...}-{2:2}, at: nvkm_event_ntfy+0x50/0xf0 [nouveau] Aug 10 07:01:29 dg1test kernel: which lock already depends on the new lock. Aug 10 07:01:29 dg1test kernel: the existing dependency chain (in reverse order) is: Aug 10 07:01:29 dg1test kernel: -> #3 (>list_lock#2){-...}-{2:2}: Aug 10 07:01:29 dg1test kernel:_raw_spin_lock_irqsave+0x4b/0x70 Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy+0x50/0xf0 [nouveau] Aug 10 07:01:29 dg1test kernel:ga100_fifo_nonstall_intr+0x24/0x30 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_intr+0x12c/0x240 [nouveau] Aug 10 07:01:29 dg1test kernel:__handle_irq_event_percpu+0x88/0x240 Aug 10 07:01:29 dg1test kernel:handle_irq_event+0x38/0x80 Aug 10 07:01:29 dg1test kernel:handle_edge_irq+0xa3/0x240 Aug 10 07:01:29 dg1test kernel:__common_interrupt+0x72/0x160 Aug 10 07:01:29 dg1test kernel:common_interrupt+0x60/0xe0 Aug 10 07:01:29 dg1test kernel:asm_common_interrupt+0x26/0x40 Aug 10 07:01:29 dg1test kernel: -> #2 (>intr.lock){-...}-{2:2}: Aug 10 07:01:29 dg1test kernel:_raw_spin_lock_irqsave+0x4b/0x70 Aug 10 07:01:29 dg1test kernel:nvkm_inth_allow+0x2c/0x80 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy_state+0x181/0x250 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy_allow+0x63/0xd0 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_uevent_mthd+0x4d/0x70 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_ioctl+0x10b/0x250 [nouveau] Aug 10 07:01:29 dg1test kernel:nvif_object_mthd+0xa8/0x1f0 [nouveau] Aug 10 07:01:29 dg1test kernel:nvif_event_allow+0x2a/0xa0 [nouveau] Aug 10 07:01:29 dg1test kernel:nouveau_fence_enable_signaling+0x78/0x80 [nouveau] Aug 10 07:01:29 dg1test kernel:__dma_fence_enable_signaling+0x5e/0x100 Aug 10 07:01:29 dg1test kernel:dma_fence_add_callback+0x4b/0xd0 Aug 10 07:01:29 dg1test kernel:nouveau_cli_work_queue+0xae/0x110 [nouveau] Aug 10 07:01:29 dg1test kernel:nouveau_gem_object_close+0x1d1/0x2a0 [nouveau] Aug 10 07:01:29 dg1test kernel:drm_gem_handle_delete+0x70/0xe0 [drm] Aug 10 07:01:29 dg1test kernel:drm_ioctl_kernel+0xa5/0x150 [drm] Aug 10 07:01:29 dg1test kernel:drm_ioctl+0x256/0x490 [drm] Aug 10 07:01:29 dg1test kernel:nouveau_drm_ioctl+0x5a/0xb0 [nouveau] Aug 10 07:01:29 dg1test kernel:__x64_sys_ioctl+0x91/0xd0 Aug 10 07:01:29 dg1test kernel:do_syscall_64+0x3c/0x90 Aug 10 07:01:29 dg1test kernel:entry_SYSCALL_64_after_hwframe+0x72/0xdc Aug 10 07:01:29 dg1test kernel: -> #1 (>refs_lock#4){}-{2:2}: Aug 10 07:01:29 dg1test kernel:_raw_spin_lock_irqsave+0x4b/0x70 Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy_state+0x37/0x250 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy_allow+0x63/0xd0 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_uevent_mthd+0x4d/0x70 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_ioctl+0x10b/0x250 [nouveau] Aug 10 07:01:29 dg1test kernel:nvif_object_mthd+0xa8/0x1f0 [nouveau] Aug 10 07:01:29 dg1test kernel:nvif_event_allow+0x2a/0xa0 [nouveau] Aug 10 07:01:29 dg1test kernel:nouveau_fence_enable_signaling+0x78/0x80 [nouveau] Aug 10 07:01:29 dg1test kernel:__dma_fence_enable_signaling+0x5e/0x100 Aug 10 07:01:29 dg1test kernel:dma_fence_add_callback+0x4b/0xd0 Aug 10 07:01:29 dg1test kernel:nouveau_cli_work_queue+0xae/0x110 [nouveau] Aug 10 07:01:29 dg1test kernel:nouveau_gem_object_close+0x1d1/0x2a0 [nouveau] Aug 10 07:01:29 dg1test kernel:drm_gem_handle_delete+0x70/0xe0 [drm] Aug 10 07:01:29 dg1test kernel:drm_ioctl_kernel+0xa5/0x150 [drm] Aug 10 07:01:29 dg1test kernel:drm_ioctl+0x256/0x490 [drm] Aug 10 07:01:29 dg1test kernel:nouveau_drm_ioctl+0x5a/0xb0 [nouveau] Aug 10 07:01:29 dg1test kernel:__x64_sys_ioctl+0x91/0xd0 Aug 10 07:01:29 dg1test kernel:
[Nouveau] [PATCH] nouveau: use an rwlock for the event lock.
From: Dave Airlie This allows it to break the following circular locking dependency. Aug 10 07:01:29 dg1test kernel: == Aug 10 07:01:29 dg1test kernel: WARNING: possible circular locking dependency detected Aug 10 07:01:29 dg1test kernel: 6.4.0-rc7+ #10 Not tainted Aug 10 07:01:29 dg1test kernel: -- Aug 10 07:01:29 dg1test kernel: wireplumber/2236 is trying to acquire lock: Aug 10 07:01:29 dg1test kernel: 8fca5320da18 (>lock){-...}-{2:2}, at: nouveau_fence_wait_uevent_handler+0x2b/0x100 [nouveau] Aug 10 07:01:29 dg1test kernel: but task is already holding lock: Aug 10 07:01:29 dg1test kernel: 8fca41208610 (>list_lock#2){-...}-{2:2}, at: nvkm_event_ntfy+0x50/0xf0 [nouveau] Aug 10 07:01:29 dg1test kernel: which lock already depends on the new lock. Aug 10 07:01:29 dg1test kernel: the existing dependency chain (in reverse order) is: Aug 10 07:01:29 dg1test kernel: -> #3 (>list_lock#2){-...}-{2:2}: Aug 10 07:01:29 dg1test kernel:_raw_spin_lock_irqsave+0x4b/0x70 Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy+0x50/0xf0 [nouveau] Aug 10 07:01:29 dg1test kernel:ga100_fifo_nonstall_intr+0x24/0x30 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_intr+0x12c/0x240 [nouveau] Aug 10 07:01:29 dg1test kernel:__handle_irq_event_percpu+0x88/0x240 Aug 10 07:01:29 dg1test kernel:handle_irq_event+0x38/0x80 Aug 10 07:01:29 dg1test kernel:handle_edge_irq+0xa3/0x240 Aug 10 07:01:29 dg1test kernel:__common_interrupt+0x72/0x160 Aug 10 07:01:29 dg1test kernel:common_interrupt+0x60/0xe0 Aug 10 07:01:29 dg1test kernel:asm_common_interrupt+0x26/0x40 Aug 10 07:01:29 dg1test kernel: -> #2 (>intr.lock){-...}-{2:2}: Aug 10 07:01:29 dg1test kernel:_raw_spin_lock_irqsave+0x4b/0x70 Aug 10 07:01:29 dg1test kernel:nvkm_inth_allow+0x2c/0x80 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy_state+0x181/0x250 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy_allow+0x63/0xd0 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_uevent_mthd+0x4d/0x70 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_ioctl+0x10b/0x250 [nouveau] Aug 10 07:01:29 dg1test kernel:nvif_object_mthd+0xa8/0x1f0 [nouveau] Aug 10 07:01:29 dg1test kernel:nvif_event_allow+0x2a/0xa0 [nouveau] Aug 10 07:01:29 dg1test kernel:nouveau_fence_enable_signaling+0x78/0x80 [nouveau] Aug 10 07:01:29 dg1test kernel:__dma_fence_enable_signaling+0x5e/0x100 Aug 10 07:01:29 dg1test kernel:dma_fence_add_callback+0x4b/0xd0 Aug 10 07:01:29 dg1test kernel:nouveau_cli_work_queue+0xae/0x110 [nouveau] Aug 10 07:01:29 dg1test kernel:nouveau_gem_object_close+0x1d1/0x2a0 [nouveau] Aug 10 07:01:29 dg1test kernel:drm_gem_handle_delete+0x70/0xe0 [drm] Aug 10 07:01:29 dg1test kernel:drm_ioctl_kernel+0xa5/0x150 [drm] Aug 10 07:01:29 dg1test kernel:drm_ioctl+0x256/0x490 [drm] Aug 10 07:01:29 dg1test kernel:nouveau_drm_ioctl+0x5a/0xb0 [nouveau] Aug 10 07:01:29 dg1test kernel:__x64_sys_ioctl+0x91/0xd0 Aug 10 07:01:29 dg1test kernel:do_syscall_64+0x3c/0x90 Aug 10 07:01:29 dg1test kernel:entry_SYSCALL_64_after_hwframe+0x72/0xdc Aug 10 07:01:29 dg1test kernel: -> #1 (>refs_lock#4){}-{2:2}: Aug 10 07:01:29 dg1test kernel:_raw_spin_lock_irqsave+0x4b/0x70 Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy_state+0x37/0x250 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_event_ntfy_allow+0x63/0xd0 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_uevent_mthd+0x4d/0x70 [nouveau] Aug 10 07:01:29 dg1test kernel:nvkm_ioctl+0x10b/0x250 [nouveau] Aug 10 07:01:29 dg1test kernel:nvif_object_mthd+0xa8/0x1f0 [nouveau] Aug 10 07:01:29 dg1test kernel:nvif_event_allow+0x2a/0xa0 [nouveau] Aug 10 07:01:29 dg1test kernel:nouveau_fence_enable_signaling+0x78/0x80 [nouveau] Aug 10 07:01:29 dg1test kernel:__dma_fence_enable_signaling+0x5e/0x100 Aug 10 07:01:29 dg1test kernel:dma_fence_add_callback+0x4b/0xd0 Aug 10 07:01:29 dg1test kernel:nouveau_cli_work_queue+0xae/0x110 [nouveau] Aug 10 07:01:29 dg1test kernel:nouveau_gem_object_close+0x1d1/0x2a0 [nouveau] Aug 10 07:01:29 dg1test kernel:drm_gem_handle_delete+0x70/0xe0 [drm] Aug 10 07:01:29 dg1test kernel:drm_ioctl_kernel+0xa5/0x150 [drm] Aug 10 07:01:29 dg1test kernel:drm_ioctl+0x256/0x490 [drm] Aug 10 07:01:29 dg1test kernel:nouveau_drm_ioctl+0x5a/0xb0 [nouveau] Aug 10 07:01:29 dg1test kernel:__x64_sys_ioctl+0x91/0xd0 Aug 10 07:01:29 dg1test kernel:do_syscall_64+0x3c/0x90 Aug 10 07:01:29 dg1test kernel: