Re: [PATCH 2/5] drm/exec: don't immediately add the prelocked obj

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 03.07.24 um 17:51 schrieb Thomas Hellström:
On Wed, 2024-07-03 at 15:25 +0200, Christian König wrote:
Some contended objects might never be locked again in the case of
eviction
handling for example.

Make sure that those doesn't show up in the list of locked objects
until
they are explicitely mentioned.
Could you be a bit more specific in the commit message about in what
situations that is bad?

The prelocked object is not necessarily expected to be in the list of locked objects.

I ran into issues because amdgpu tried to validate all locked objects and so tried to also validate the prelocked one (which was only locked for eviction).

That obviously didn't made much sense.

Regards,
Christian.


/Thomas



Signed-off-by: Christian König <christian.koenig@xxxxxxx>
---
  drivers/gpu/drm/drm_exec.c | 18 +++++++++---------
  1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/drm_exec.c b/drivers/gpu/drm/drm_exec.c
index 2da094bdf8a4..220df336fbd9 100644
--- a/drivers/gpu/drm/drm_exec.c
+++ b/drivers/gpu/drm/drm_exec.c
@@ -61,8 +61,11 @@ static void drm_exec_unlock_all(struct drm_exec
*exec)
  		drm_gem_object_put(obj);
  	}
- drm_gem_object_put(exec->prelocked);
-	exec->prelocked = NULL;
+	if (exec->prelocked) {
+		dma_resv_unlock(exec->prelocked->resv);
+		drm_gem_object_put(exec->prelocked);
+		exec->prelocked = NULL;
+	}
  }
 /**
@@ -179,16 +182,9 @@ static int drm_exec_lock_contended(struct
drm_exec *exec)
  		dma_resv_lock_slow(obj->resv, &exec->ticket);
  	}
- ret = drm_exec_obj_locked(exec, obj);
-	if (unlikely(ret))
-		goto error_unlock;
-
  	exec->prelocked = obj;
  	return 0;
-error_unlock:
-	dma_resv_unlock(obj->resv);
-
  error_dropref:
  	drm_gem_object_put(obj);
  	return ret;
@@ -214,6 +210,10 @@ int drm_exec_lock_obj(struct drm_exec *exec,
struct drm_gem_object *obj)
  		return ret;
  if (exec->prelocked == obj) {
+		ret = drm_exec_obj_locked(exec, obj);
+		if (unlikely(ret))
+			return ret;
+
  		drm_gem_object_put(exec->prelocked);
  		exec->prelocked = NULL;
  		return 0;




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux