On 4/9/25 07:48, Arunpravin Paneer Selvam wrote:
> Fix lockdep warnings.
> 
> [  +0.000024] WARNING: CPU: 10 PID: 1909 at drivers/gpu/drm/drm_syncobj.c:456 
> drm_syncobj_find_fence+0x58c/0x6e0
> [  +0.000519] CPU: 10 UID: 1000 PID: 1909 Comm: gnome-shel:cs0 Tainted: G     
>    W  OE      6.12.0+ #18
> [  +0.000008] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [  +0.000004] Hardware name: ASUS System Product Name/TUF GAMING B650-PLUS, 
> BIOS 3072 12/20/2024
> [  +0.000004] RIP: 0010:drm_syncobj_find_fence+0x58c/0x6e0
> [  +0.000006] RSP: 0018:ffff88846d9ef680 EFLAGS: 00010202
> [  +0.000008] RAX: 0000000000000000 RBX: 0000000000001388 RCX: 
> 0000000000000001
> [  +0.000004] RDX: 1ffff1108f5ad1da RSI: 0000000000000001 RDI: 
> ffff88847ad68ed0
> [  +0.000005] RBP: ffff88846d9ef770 R08: 0000000000000000 R09: 
> 0000000000000000
> [  +0.000004] R10: 0000000000000000 R11: 0000000000000000 R12: 
> ffff88847ad68000
> [  +0.000004] R13: 0000000000000002 R14: ffff888149353d00 R15: 
> 000000000000000f
> [  +0.000005] FS:  00007269977fe6c0(0000) GS:ffff888409500000(0000) 
> knlGS:0000000000000000
> [  +0.000005] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [  +0.000004] CR2: 0000643a866b50d0 CR3: 0000000469eb2000 CR4: 
> 0000000000f50ef0
> [  +0.000005] PKRU: 55555554
> [  +0.000004] Call Trace:
> [  +0.000004]  <TASK>
> [  +0.000005]  ? show_regs+0x6c/0x80
> [  +0.000010]  ? __warn+0xd2/0x2d0
> [  +0.000008]  ? drm_syncobj_find_fence+0x58c/0x6e0
> [  +0.000009]  ? report_bug+0x282/0x2f0
> [  +0.000014]  ? handle_bug+0x6e/0xc0
> [  +0.000008]  ? exc_invalid_op+0x18/0x50
> [  +0.000007]  ? asm_exc_invalid_op+0x1b/0x20
> [  +0.000020]  ? drm_syncobj_find_fence+0x58c/0x6e0
> [  +0.000012]  ? __pfx_drm_syncobj_find_fence+0x10/0x10
> [  +0.000012]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000006]  ? lock_is_held_type+0xa3/0x130
> [  +0.000016]  amdgpu_userq_wait_ioctl+0x92d/0x2200 [amdgpu]
> [  +0.000257]  ? amdgpu_userq_wait_ioctl+0x92d/0x2200 [amdgpu]
> [  +0.000180]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000006]  ? __lock_acquire+0x1b19/0x69c0
> [  +0.000022]  ? __pfx_amdgpu_userq_wait_ioctl+0x10/0x10 [amdgpu]
> [  +0.000179]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000006]  ? __kasan_check_read+0x11/0x20
> [  +0.000007]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? mark_lock+0xfd/0x17c0
> [  +0.000012]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? lock_acquire.part.0+0x116/0x360
> [  +0.000006]  ? drm_dev_enter+0x51/0x190
> [  +0.000008]  ? __pfx___lock_acquire+0x10/0x10
> [  +0.000008]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? find_held_lock+0x36/0x140
> [  +0.000021]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? lock_acquire+0x7c/0xc0
> [  +0.000005]  ? drm_dev_enter+0x51/0x190
> [  +0.000027]  drm_ioctl_kernel+0x18b/0x330
> [  +0.000008]  ? __pfx_amdgpu_userq_wait_ioctl+0x10/0x10 [amdgpu]
> [  +0.000181]  ? __pfx_drm_ioctl_kernel+0x10/0x10
> [  +0.000005]  ? lock_acquire+0x7c/0xc0
> [  +0.000009]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? __kasan_check_write+0x14/0x30
> [  +0.000005]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000010]  drm_ioctl+0x589/0xd00
> [  +0.000006]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000006]  ? __pfx_amdgpu_userq_wait_ioctl+0x10/0x10 [amdgpu]
> [  +0.000187]  ? __pfx_drm_ioctl+0x10/0x10
> [  +0.000007]  ? __pm_runtime_resume+0x80/0x110
> [  +0.000021]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? trace_hardirqs_on+0x53/0x60
> [  +0.000007]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? _raw_spin_unlock_irqrestore+0x51/0x80
> [  +0.000013]  amdgpu_drm_ioctl+0xd2/0x1c0 [amdgpu]
> [  +0.000182]  __x64_sys_ioctl+0x13a/0x1c0
> [  +0.000012]  x64_sys_call+0x11ad/0x25f0
> [  +0.000007]  do_syscall_64+0x91/0x180
> [  +0.000007]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? do_syscall_64+0x9d/0x180
> [  +0.000005]  ? syscall_exit_to_user_mode+0x95/0x260
> [  +0.000008]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? do_syscall_64+0x9d/0x180
> [  +0.000009]  ? __pfx___do_sys_prctl+0x10/0x10
> [  +0.000012]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000009]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000007]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? syscall_exit_to_user_mode+0x95/0x260
> [  +0.000008]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? do_syscall_64+0x9d/0x180
> [  +0.000009]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000009]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000007]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? irqentry_exit_to_user_mode+0x8b/0x260
> [  +0.000007]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? irqentry_exit+0x77/0xb0
> [  +0.000005]  ? srso_alias_return_thunk+0x5/0xfbef5
> [  +0.000005]  ? exc_page_fault+0x93/0x150
> [  +0.000009]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
> [  +0.000005] RIP: 0033:0x7269b0324ded
> [  +0.000006] Code: 04 25 28 00 00 00 48 89 45 c8 31 c0 48 8d 45 10 c7 45 b0 
> 10 00 00 00 48 89 45 b8 48 8d 45 d0 48 89 45 c0 b8 10 00 00 00 0f 05 <89> c2 
> 3d 00 f0 ff ff 77 1a 48 8b 45 c8 64 48 2b 04 25 28 00 00 00
> [  +0.000005] RSP: 002b:00007269977fc9b0 EFLAGS: 00000246 ORIG_RAX: 
> 0000000000000010
> [  +0.000008] RAX: ffffffffffffffda RBX: 00007269977fcb00 RCX: 
> 00007269b0324ded
> [  +0.000004] RDX: 00007269977fcb00 RSI: 00000000c0406458 RDI: 
> 000000000000000d
> [  +0.000004] RBP: 00007269977fca00 R08: 00007269977fcc1c R09: 
> 0000000000000000
> [  +0.000005] R10: 000000000000000f R11: 0000000000000246 R12: 
> 000000000000000d
> [  +0.000004] R13: 00005bce7c309a50 R14: 00007269977fca30 R15: 
> 0000000000000000
> [  +0.000021]  </TASK>
> [  +0.000005] irq event stamp: 1359
> [  +0.000004] hardirqs last  enabled at (1365): [<ffffffffaa8693a9>] 
> __up_console_sem+0x79/0xa0
> [  +0.000007] hardirqs last disabled at (1370): [<ffffffffaa86938e>] 
> __up_console_sem+0x5e/0xa0
> [  +0.000005] softirqs last  enabled at (756): [<ffffffffaa67377e>] 
> __irq_exit_rcu+0x17e/0x1d0
> [  +0.000006] softirqs last disabled at (749): [<ffffffffaa67377e>] 
> __irq_exit_rcu+0x17e/0x1d0
> [  +0.000005] ---[ end trace 0000000000000000 ]---
> 
> Signed-off-by: Arunpravin Paneer Selvam <arunpravin.paneersel...@amd.com>
> ---
>  .../gpu/drm/amd/amdgpu/amdgpu_userq_fence.c   | 116 +++++++++++-------
>  1 file changed, 69 insertions(+), 47 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> index d5b35b5df527..c5de39a8ff98 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> @@ -395,6 +395,43 @@ static void amdgpu_userq_fence_cleanup(struct dma_fence 
> *fence)
>       dma_fence_put(fence);
>  }
>  
> +static int amdgpu_userq_exec_lock(struct drm_exec *exec, u32 flags,
> +                               struct drm_gem_object **rgobj,
> +                               struct drm_gem_object **wgobj,
> +                               u32 num_read_handles,
> +                               u32 num_write_handles,
> +                               unsigned int num_fences)
num_fences should always be 1 if I'm not completely mistaken.

> +{
> +     int r;
> +
> +     if (!exec | !rgobj | !wgobj)
> +             return -EINVAL;
> +
> +     drm_exec_init(exec, flags,
> +                   (num_read_handles + num_write_handles));
> +
> +     /* Lock all BOs with retry handling */
> +     drm_exec_until_all_locked(exec) {
> +             r = drm_exec_prepare_array(exec, rgobj, num_read_handles, 
> num_fences);
> +             drm_exec_retry_on_contention(exec);
> +             if (r)
> +                     drm_exec_fini(exec);

Don't call drm_exec_fini() here. Rather just return the error.

> +
> +             r = drm_exec_prepare_array(exec, wgobj, num_write_handles, 
> num_fences);
> +             drm_exec_retry_on_contention(exec);
> +             if (r)
> +                     drm_exec_fini(exec);
Same here.

> +     }
> +
> +     return r;
> +}
> +
> +static void amdgpu_userq_exec_unlock(struct drm_exec *exec)
> +{
> +     if (exec)
> +             drm_exec_fini(exec);
> +}
> +
That looks superflous. Just call drm_exec_fini() in the caller.

Regards,
Christian.

>  int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
>                             struct drm_file *filp)
>  {
> @@ -511,24 +548,14 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, 
> void *data,
>       queue->last_fence = dma_fence_get(fence);
>       mutex_unlock(&userq_mgr->userq_mutex);
>  
> -     drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT,
> -                   (num_read_bo_handles + num_write_bo_handles));
> -
> -     /* Lock all BOs with retry handling */
> -     drm_exec_until_all_locked(&exec) {
> -             r = drm_exec_prepare_array(&exec, gobj_read, 
> num_read_bo_handles, 1);
> -             drm_exec_retry_on_contention(&exec);
> -             if (r) {
> -                     amdgpu_userq_fence_cleanup(fence);
> -                     goto exec_fini;
> -             }
> -
> -             r = drm_exec_prepare_array(&exec, gobj_write, 
> num_write_bo_handles, 1);
> -             drm_exec_retry_on_contention(&exec);
> -             if (r) {
> -                     amdgpu_userq_fence_cleanup(fence);
> -                     goto exec_fini;
> -             }
> +     r = amdgpu_userq_exec_lock(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT,
> +                                gobj_read, gobj_write,
> +                                num_read_bo_handles,
> +                                num_write_bo_handles,
> +                                1);
> +     if (r) {
> +             amdgpu_userq_fence_cleanup(fence);
> +             goto put_gobj_write;
>       }
>  
>       for (i = 0; i < num_read_bo_handles; i++) {
> @@ -546,6 +573,7 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, 
> void *data,
>               dma_resv_add_fence(gobj_write[i]->resv, fence,
>                                  DMA_RESV_USAGE_WRITE);
>       }
> +     amdgpu_userq_exec_unlock(&exec);
>  
>       /* Add the created fence to syncobj/BO's */
>       for (i = 0; i < num_syncobj_handles; i++)
> @@ -554,8 +582,6 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, 
> void *data,
>       /* drop the reference acquired in fence creation function */
>       dma_fence_put(fence);
>  
> -exec_fini:
> -     drm_exec_fini(&exec);
>  put_gobj_write:
>       while (wentry-- > 0)
>               drm_gem_object_put(gobj_write[wentry]);
> @@ -666,26 +692,6 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>               }
>       }
>  
> -     drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT,
> -                   (num_read_bo_handles + num_write_bo_handles));
> -
> -     /* Lock all BOs with retry handling */
> -     drm_exec_until_all_locked(&exec) {
> -             r = drm_exec_prepare_array(&exec, gobj_read, 
> num_read_bo_handles, 1);
> -             drm_exec_retry_on_contention(&exec);
> -             if (r) {
> -                     drm_exec_fini(&exec);
> -                     goto put_gobj_write;
> -             }
> -
> -             r = drm_exec_prepare_array(&exec, gobj_write, 
> num_write_bo_handles, 1);
> -             drm_exec_retry_on_contention(&exec);
> -             if (r) {
> -                     drm_exec_fini(&exec);
> -                     goto put_gobj_write;
> -             }
> -     }
> -
>       if (!wait_info->num_fences) {
>               if (num_points) {
>                       struct dma_fence_unwrap iter;
> @@ -698,7 +704,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>                                                          
> DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT,
>                                                          &fence);
>                               if (r)
> -                                     goto exec_fini;
> +                                     goto put_gobj_write;
>  
>                               dma_fence_unwrap_for_each(f, &iter, fence)
>                                       num_fences++;
> @@ -716,12 +722,20 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, 
> void *data,
>                                                  
> DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT,
>                                                  &fence);
>                       if (r)
> -                             goto exec_fini;
> +                             goto put_gobj_write;
>  
>                       num_fences++;
>                       dma_fence_put(fence);
>               }
>  
> +             r = amdgpu_userq_exec_lock(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT,
> +                                        gobj_read, gobj_write,
> +                                        num_read_bo_handles,
> +                                        num_write_bo_handles,
> +                                        1);
> +             if (r)
> +                     goto put_gobj_write;
> +
>               /* Count GEM objects fence */
>               for (i = 0; i < num_read_bo_handles; i++) {
>                       struct dma_resv_iter resv_cursor;
> @@ -740,7 +754,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>                                               DMA_RESV_USAGE_WRITE, fence)
>                               num_fences++;
>               }
> -
> +             amdgpu_userq_exec_unlock(&exec);
>               /*
>                * Passing num_fences = 0 means that userspace doesn't want to
>                * retrieve userq_fence_info. If num_fences = 0 we skip filling
> @@ -753,7 +767,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>               fence_info = kmalloc_array(wait_info->num_fences, 
> sizeof(*fence_info), GFP_KERNEL);
>               if (!fence_info) {
>                       r = -ENOMEM;
> -                     goto exec_fini;
> +                     goto put_gobj_write;
>               }
>  
>               /* Array of fences */
> @@ -763,6 +777,14 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>                       goto free_fence_info;
>               }
>  
> +             r = amdgpu_userq_exec_lock(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT,
> +                                        gobj_read, gobj_write,
> +                                        num_read_bo_handles,
> +                                        num_write_bo_handles,
> +                                        1);
> +             if (r)
> +                     goto free_fences;
> +
>               /* Retrieve GEM read objects fence */
>               for (i = 0; i < num_read_bo_handles; i++) {
>                       struct dma_resv_iter resv_cursor;
> @@ -772,6 +794,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>                                               DMA_RESV_USAGE_READ, fence) {
>                               if (WARN_ON_ONCE(num_fences >= 
> wait_info->num_fences)) {
>                                       r = -EINVAL;
> +                                     amdgpu_userq_exec_unlock(&exec);
>                                       goto free_fences;
>                               }
>  
> @@ -789,6 +812,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>                                               DMA_RESV_USAGE_WRITE, fence) {
>                               if (WARN_ON_ONCE(num_fences >= 
> wait_info->num_fences)) {
>                                       r = -EINVAL;
> +                                     amdgpu_userq_exec_unlock(&exec);
>                                       goto free_fences;
>                               }
>  
> @@ -796,6 +820,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>                               dma_fence_get(fence);
>                       }
>               }
> +             amdgpu_userq_exec_unlock(&exec);
>  
>               if (num_points) {
>                       struct dma_fence_unwrap iter;
> @@ -901,7 +926,6 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>               kfree(fence_info);
>       }
>  
> -     drm_exec_fini(&exec);
>       for (i = 0; i < num_read_bo_handles; i++)
>               drm_gem_object_put(gobj_read[i]);
>       kfree(gobj_read);
> @@ -924,8 +948,6 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void 
> *data,
>       kfree(fences);
>  free_fence_info:
>       kfree(fence_info);
> -exec_fini:
> -     drm_exec_fini(&exec);
>  put_gobj_write:
>       while (wentry-- > 0)
>               drm_gem_object_put(gobj_write[wentry]);

Reply via email to