On 3/10/26 08:02, Prike Liang wrote: > In the userq fence gather and emit IOCTL path we acquire BO locks > (via drm_exec/dma_resv_lock)before calling drm_syncobj_find_fence(). > This causes drm_syncobj_find_fence() to complain because it is entered > with locks held while the WAIT_FOR_SUBMIT flag is set in the calling context. > > However, the userq userspace path does not rely on DRM_IOCTL_SYNCOBJ_WAIT to > wait on fences that are dependencies of userq submissions.
That's not correct. > All waiting is > handled separately, so the WAIT_FOR_SUBMIT flag is effectively unused for > this IOCTL. > > Therefore, we simply clear the WAIT_FOR_SUBMIT flag for this path. This avoids > the lockdep / drm_syncobj_find_fence() warning about being called under a > locked > context, and has no functional impact on userq behavior since > DRM_IOCTL_SYNCOBJ_WAIT > is not part of the userq synchronization model. That doesn't event remotely work. See the patches I've send out a month ago or so for the correct fix. Regards, Christian. > > Signed-off-by: Prike Liang <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c > index 76f32fd768fb..7a309b0130d8 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c > @@ -708,7 +708,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void > *data, > for (i = 0; i < num_points; i++) { > r = drm_syncobj_find_fence(filp, > timeline_handles[i], > timeline_points[i], > - > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, > + 0, > &fence); > if (r) > goto exec_fini; > @@ -726,7 +726,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void > *data, > > r = drm_syncobj_find_fence(filp, syncobj_handles[i], > 0, > - > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, > + 0, > &fence); > if (r) > goto exec_fini; > @@ -818,7 +818,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void > *data, > for (i = 0; i < num_points; i++) { > r = drm_syncobj_find_fence(filp, > timeline_handles[i], > timeline_points[i], > - > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, > + 0, > &fence); > if (r) > goto free_fences; > @@ -844,7 +844,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void > *data, > > r = drm_syncobj_find_fence(filp, syncobj_handles[i], > 0, > - > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, > + 0, > &fence); > if (r) > goto free_fences;
