Am 11.01.2017 um 15:09 schrieb Nicolai Hähnle: > On 11.01.2017 12:56, Christian König wrote: >> Am 11.01.2017 um 08:31 schrieb Nicolai Hähnle: >>> From: Nicolai Hähnle <nicolai.haehnle at amd.com> >>> >>> ttm_bo_init checks that the reservation object is locked. This is >>> the caller's responsibility when resv != NULL. Otherwise, the inline >>> reservation object of the newly allocated buffer is used and must >>> explicitly be locked. Using a trylock is fine, since nobody else >>> has a reference to the reservation lock. >> >> Good, catch. But while using trylock is fine, why do you need to use it >> in the first place? > > Or is this a question about trylock vs. lock? > > Actually, now that I think about this again, perhaps the following > sequence would be possible: > > 1. Create the main bo in amdgpu_bo_create. > 2. Other thread, for whatever reason, tries to make space and evict > the bo, and probably locks the reservation for that? > 3. amdgpu_bo_create continues, calls the trylock which now fails. Yes, exactly that was my thinking as well. Please just use the normal uninterruptible locking variant if there isn't a good reason for using trylock. Christian. > > Nicolai > >> >> Regards, >> Christian. >> >>> >>> Signed-off-by: Nicolai Hähnle <nicolai.haehnle at amd.com> >>> --- >>> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 11 +++++++++++ >>> 1 file changed, 11 insertions(+) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>> index 11c12c4d..357eed9 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>> @@ -465,21 +465,32 @@ int amdgpu_bo_create(struct amdgpu_device *adev, >>> amdgpu_ttm_placement_init(adev, &placement, >>> placements, domain, flags); >>> r = amdgpu_bo_create_restricted(adev, size, byte_align, kernel, >>> domain, flags, sg, &placement, >>> resv, bo_ptr); >>> if (r) >>> return r; >>> if (amdgpu_need_backup(adev) && (flags & >>> AMDGPU_GEM_CREATE_SHADOW)) { >>> + if (!resv) { >>> + bool locked; >>> + >>> + locked = ww_mutex_trylock(&(*bo_ptr)->tbo.resv->lock); >>> + WARN_ON(!locked); >>> + } >>> + >>> r = amdgpu_bo_create_shadow(adev, size, byte_align, >>> (*bo_ptr)); >>> + >>> + if (!resv) >>> + ww_mutex_unlock(&(*bo_ptr)->tbo.resv->lock); >>> + >>> if (r) >>> amdgpu_bo_unref(bo_ptr); >>> } >>> return r; >>> } >>> int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev, >>> struct amdgpu_ring *ring, >>> struct amdgpu_bo *bo, >> >> > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx