在 2018/11/23 21:30, Koenig, Christian 写道: > Am 23.11.18 um 14:27 schrieb Zhou, David(ChunMing): >> 在 2018/11/22 19:25, Christian König 写道: >>> Am 22.11.18 um 07:56 schrieb Sharma, Deepak: >>>> when returned fence is not valid mostly due to userspace ignored >>>> previous error causes NULL pointer dereference. >>> Again, this is clearly incorrect. The my other mails on the earlier >>> patch. >> Sorry for I didn't get your history, but looks from the patch itself, it >> is still a valid patch, isn't it? > No, the semantic of amdgpu_ctx_get_fence() is that we return NULL when > the fence is already signaled. > > So this patch could totally break userspace because it changes the > behavior when we try to sync to an already signaled fence. Ah, I got your meaning, how about attached patch? -David > > If that patch was applied then please revert it immediately. > > Christian. > >> -David >>> If you have already pushed the patch then please revert. >>> >>> Christian. >>> >>>> Signed-off-by: Deepak Sharma <Deepak.Sharma@xxxxxxx> >>>> --- >>>> drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 ++ >>>> 1 file changed, 2 insertions(+) >>>> >>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c >>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c >>>> index 024dfbd87f11..14166cd8a12f 100644 >>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c >>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c >>>> @@ -1403,6 +1403,8 @@ static struct dma_fence >>>> *amdgpu_cs_get_fence(struct amdgpu_device *adev, >>>> fence = amdgpu_ctx_get_fence(ctx, entity, user->seq_no); >>>> amdgpu_ctx_put(ctx); >>>> + if(!fence) >>>> + return ERR_PTR(-EINVAL); >>>> return fence; >>>> }
From 3640a18c31e7b786129286615fcdf397e1142451 Mon Sep 17 00:00:00 2001 From: Chunming Zhou <david1.zhou@xxxxxxx> Date: Fri, 23 Nov 2018 22:05:19 +0800 Subject: [PATCH] drm/amdgpu: fix signaled fence isn't handled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Chunming Zhou <david1.zhou@xxxxxxx> Cc: Sharma, Deepak <Deepak.Sharma@xxxxxxx> CC: Christian König <Christian.Koenig@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 3 +++ drivers/gpu/drm/drm_syncobj.c | 1 + include/drm/drm_syncobj.h | 1 + 3 files changed, 5 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 6a823b58b3b8..e960f9864e9f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -1505,6 +1505,9 @@ int amdgpu_cs_fence_to_handle_ioctl(struct drm_device *dev, void *data, if (IS_ERR(fence)) return PTR_ERR(fence); + /* that means fence was signaled */ + if (!fence) + fence = drm_syncobj_get_stub_fence(); switch (info->in.what) { case AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ: r = drm_syncobj_create(&syncobj, 0, fence); diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 5f2df10e51c3..e5621f80d501 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -97,6 +97,7 @@ struct dma_fence *drm_syncobj_get_stub_fence(void) return dma_fence_get(&signaled_fence); } +EXPORT_SYMBOL(drm_syncobj_get_stub_fence); /** * drm_syncobj_find - lookup and reference a sync object. * @file_private: drm file private pointer diff --git a/include/drm/drm_syncobj.h b/include/drm/drm_syncobj.h index 29244cbcd05e..93e9e9b159ab 100644 --- a/include/drm/drm_syncobj.h +++ b/include/drm/drm_syncobj.h @@ -147,5 +147,6 @@ int drm_syncobj_get_handle(struct drm_file *file_private, int drm_syncobj_get_fd(struct drm_syncobj *syncobj, int *p_fd); int drm_syncobj_search_fence(struct drm_syncobj *syncobj, u64 point, u64 flags, struct dma_fence **fence); +struct dma_fence *drm_syncobj_get_stub_fence(void); #endif -- 2.17.1
_______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx