From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36A57383316 for ; Fri, 10 Jul 2026 19:08:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783710490; cv=none; b=BEuBMJDE95S01d2c0lann5z1uTEzkAj/WGkn39lh2k5Z0puQGoYvO+RZZLcTDSIVAvlc7r8RtPvMVUULvX5EoPDlykaFuBGg8B7y7qVxTaeBuFjWyBXeMW0pXGpiYKANSm4zB2g39x0l8PlQvmO6aVIMxm1aRuASEwLIUwNZg9A= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783710490; c=relaxed/simple; bh=aqm8yGyCWw4llUJmn5E89xwhye6LShLTV655OnxnLqc=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=eLPHgn8zGOxe8qfC3F/wtBWmPCQJFQdlLkGm0PoTqqV/VoB4V14Oi8HHR93X19QJR49xHYet0mmq0SsgljrcnQDov63C0qg80H3PQEMIMRsGWqmjn0IEzQIsVzp88wANpQhW4Ta36pkD7YtRPz8CrFE9UKsqE4uAPM/wTrVgyOs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=MXptIFHb; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="MXptIFHb" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-493ae59eca6so6472875e9.1 for ; Fri, 10 Jul 2026 12:08:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783710485; x=1784315285; darn=vger.kernel.org; h=content-transfer-encoding:reply-to:content-type:mime-version :references:in-reply-to:message-id:date:subject:to:from:from:to:cc :subject:date:message-id:reply-to:content-type; bh=yBVaMK4L9gyjT+EoEO4978A5AdaqzcXPIfWDlt2pVck=; b=MXptIFHbejzY3xLgHkKiSFBf345Qocwg5vOe6+mIKxCyn0tZkd3a/1J6lXOR8twCCp a+IchsTjOMnnpBrmbMKIceGnOG4cs+/8PKBGVrYM5/mthJRPcpk6LtxkLuJTjKSJeDaq vJ7wx4Hn4TuzxUaKQFBTuywKIkp8UcajtDbq4PqMmhHdn8+2KrooKY8KBB8qDe16qGXI HJSmAfZtG40N2mBN8eDQ2OwqlbCJci9++m+DvfK2sdL+SrDgHOlZmfN8o8+MKIEFiJCP DWTFosawmZ194k97IN4Hv33d9WsALGCb7iRcMG+MNZK2EYNxgD+/pCM7kICge1V3102r xzZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783710485; x=1784315285; h=content-transfer-encoding:reply-to:content-type:mime-version :references:in-reply-to:message-id:date:subject:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=yBVaMK4L9gyjT+EoEO4978A5AdaqzcXPIfWDlt2pVck=; b=VHHmTjbDVLFVgEU/hOYI1a3DJtUwqgF20bRrS074wWBh4w22Tp16DhJ0S5ZAFTW6+f aUPoIhJbHcWPOEJ24NtfJwMThZOOgylGMharPW4n0NUpTaInHLkAMPU+c8Zqh5pnpHlv 9h5UqyutwFNXutWmTUzcaS04LVvNfrjA8xpTt7EYAEAG8jZpmnyY3P9YF/kzpcYvT/Ob uWpiqxKhgqH5BXBjCk/G9++5wQdDmgzETP2gC/ulKDmGvl/sEYpwFYHViGcrIRR7TTYA H0kAYYbafSdXoDyP3j35dkR+2ZP7q40ytciuV97SAbh1uTi66Mh9J0gZU3xsoTK2r6Ky CfMw== X-Forwarded-Encrypted: i=1; AHgh+RqLVcZO+WGY1KerpBP6X86W5JpOblayvdbn8EHqAqMjc7hM2HzqeppRb8MXlCcTqO52o942jlUlD/SWZvo=@vger.kernel.org X-Gm-Message-State: AOJu0YxRgGge9riD7tM68PBtLVu55otNnXPNU3JhXJ04sj7q9S3zrNIN hmi8EARVpkOwi6tnqKC/J14fVjEFUqg2B2vuT7hhhud7nQA9P65nJaaa X-Gm-Gg: AfdE7ckFnTuIzPcSs+zVRSbRxKzKw4Tpk5KPmsakx4ZI2LLoFniW7+RESEow3szlc/M fhakMairUdzIiF6AhLNfwczocSkNlCbcTF2e8B+YXiVzQwnbgxJstYqUkx/Or1PLY3pDS6wbYv+ OeNb86vq4m+PmEFI2AK3PxL+QSonI8+co+995xAo4RA5OfFU00tZWTwsoRvlEfETIORususnwhs +5xX3FLzMwXDTNwj363sKcKbTLOuEFzo8EAAVCGlbS28kQe+hT5IbAIIZrnB5/EuAgvIBl+a9d0 YdjOuncpLlHOK5MT/kd2p55doRr+voygi1uyXbAgqyDmedElpurttFaVU/qIHqpDodBpXY/FP3w xRhNfBTa8W5ROJrlB76rMGtICz1n47LBrpU+Ee1cvEyojxvhFngj0oU8ArIqvhTitQ8zA7mZotl DFwy4iLTXPMtEfcMBvI8hKw7t+tNWQPntsQmjK X-Received: by 2002:a05:600c:564b:b0:493:e79e:da98 with SMTP id 5b1f17b1804b1-493f8837fdbmr510375e9.39.1783710484544; Fri, 10 Jul 2026 12:08:04 -0700 (PDT) Received: from able.fritz.box ([2a00:e180:154f:ec00:aa08:de24:db33:4496]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-493f567eadfsm55000755e9.6.2026.07.10.12.08.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 12:08:04 -0700 (PDT) From: "=?UTF-8?q?Christian=20K=C3=B6nig?=" X-Google-Original-From: =?UTF-8?q?Christian=20K=C3=B6nig?= To: thomas.hellstrom@linux.intel.com, dakr@kernel.org, ecourtney@nvidia.com, simona@ffwll.ch, matthew.brost@intel.com, nat@pixelcluster.dev, airlied@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, amd-gfx@lists.freedesktop.org Subject: [PATCH 10/12] drm/exec: add drm_exec_lock_resv function Date: Fri, 10 Jul 2026 20:52:50 +0200 Message-ID: <20260710190752.2355-11-christian.koenig@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260710190752.2355-1-christian.koenig@amd.com> References: <20260710190752.2355-1-christian.koenig@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Reply-To: christian.koenig@amd.com Content-Transfer-Encoding: 8bit Restructure the drm_exec object to work with dma_resv references instead of GEM object references. Add the new function dma_exec_lock_resv() to lock individual dma_resv objects and so allow higher level implementations to handle contention purely on dma_resv objects. WIP! Don't commit like that! Signed-off-by: Christian König --- drivers/gpu/drm/drm_exec.c | 75 ++++++++++++++++++++++---------------- drivers/gpu/drm/drm_gem.c | 2 + include/drm/drm_exec.h | 9 +++-- 3 files changed, 50 insertions(+), 36 deletions(-) diff --git a/drivers/gpu/drm/drm_exec.c b/drivers/gpu/drm/drm_exec.c index fa923852fae45..382bf7bcd5ff3 100644 --- a/drivers/gpu/drm/drm_exec.c +++ b/drivers/gpu/drm/drm_exec.c @@ -58,8 +58,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); + dma_resv_put(exec->prelocked); + exec->prelocked = NULL; + } } /** @@ -101,7 +104,7 @@ void drm_exec_fini(struct drm_exec *exec) drm_exec_unlock_all(exec); kvfree(exec->objects); if (exec->contended != DRM_EXEC_DUMMY) { - drm_gem_object_put(exec->contended); + dma_resv_put(exec->contended); ww_acquire_fini(&exec->ticket); } } @@ -158,50 +161,41 @@ static int drm_exec_obj_locked(struct drm_exec *exec, /* Make sure the contended object is locked first */ static int drm_exec_lock_contended(struct drm_exec *exec) { - struct drm_gem_object *obj = exec->contended; + struct dma_resv *resv = exec->contended; int ret; - if (likely(!obj)) + if (likely(!resv)) return 0; /* Always cleanup the contention so that error handling can kick in */ exec->contended = NULL; if (exec->flags & DRM_EXEC_INTERRUPTIBLE_WAIT) { - ret = dma_resv_lock_slow_interruptible(obj->resv, - &exec->ticket); + ret = dma_resv_lock_slow_interruptible(resv, &exec->ticket); if (unlikely(ret)) goto error_dropref; } else { - dma_resv_lock_slow(obj->resv, &exec->ticket); + dma_resv_lock_slow(resv, &exec->ticket); } - ret = drm_exec_obj_locked(exec, obj); - if (unlikely(ret)) - goto error_unlock; - - exec->prelocked = obj; + exec->prelocked = resv; return 0; -error_unlock: - dma_resv_unlock(obj->resv); - error_dropref: - drm_gem_object_put(obj); + dma_resv_put(resv); return ret; } /** - * drm_exec_lock_obj - lock a GEM object for use + * drm_exec_lock_resv - lock a dma_resv object * @exec: the drm_exec object with the state - * @obj: the GEM object to lock + * @resv: the dma_resv object to lock * - * Lock a GEM object for use and grab a reference to it. + * Lock a dma_resv object for use or grab a reference to it on contention. * * Returns: -EDEADLK if a contention is detected, -EALREADY when object is - * already locked (can be suppressed by setting the DRM_EXEC_IGNORE_DUPLICATES - * flag), -ENOMEM when memory allocation failed and zero for success. + * already locked, -ENOMEM when memory allocation failed and zero for success. */ -int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj) +int drm_exec_lock_resv(struct drm_exec *exec, struct dma_resv *resv) { int ret; @@ -209,22 +203,39 @@ int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj) if (unlikely(ret)) return ret; - if (exec->prelocked == obj) { - drm_gem_object_put(exec->prelocked); + if (exec->prelocked == resv) { + dma_resv_put(exec->prelocked); exec->prelocked = NULL; return 0; } if (exec->flags & DRM_EXEC_INTERRUPTIBLE_WAIT) - ret = dma_resv_lock_interruptible(obj->resv, &exec->ticket); + ret = dma_resv_lock_interruptible(resv, &exec->ticket); else - ret = dma_resv_lock(obj->resv, &exec->ticket); + ret = dma_resv_lock(resv, &exec->ticket); - if (unlikely(ret == -EDEADLK)) { - drm_gem_object_get(obj); - exec->contended = obj; - return -EDEADLK; - } + if (unlikely(ret == -EDEADLK)) + exec->contended = dma_resv_get(resv); + return ret; +} +EXPORT_SYMBOL(drm_exec_lock_resv); + +/** + * drm_exec_lock_obj - lock a GEM object for use + * @exec: the drm_exec object with the state + * @obj: the GEM object to lock + * + * Lock a GEM object for use and grab a reference to it. + * + * Returns: -EDEADLK if a contention is detected, -EALREADY when object is + * already locked (can be suppressed by setting the DRM_EXEC_IGNORE_DUPLICATES + * flag), -ENOMEM when memory allocation failed and zero for success. + */ +int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj) +{ + int ret; + + ret = drm_exec_lock_resv(exec, obj->resv); if (unlikely(ret == -EALREADY) && exec->flags & DRM_EXEC_IGNORE_DUPLICATES) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index bbcbd25f014f0..f5cf9ad596a67 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -229,6 +229,8 @@ void drm_gem_private_object_init(struct drm_device *dev, obj->size = size; mutex_init(&obj->gpuva.lock); dma_resv_init(&obj->_resv); + + /* TODO: This needs to go away for drm_exec to work correctly!!! */ if (!obj->resv) obj->resv = dma_resv_get(&obj->_resv); diff --git a/include/drm/drm_exec.h b/include/drm/drm_exec.h index 8725ba92ff916..9daedb676d7b1 100644 --- a/include/drm/drm_exec.h +++ b/include/drm/drm_exec.h @@ -47,14 +47,14 @@ struct drm_exec { struct drm_gem_object **objects; /** - * @contended: contended GEM object we backed off for + * @contended: contended dma_resv object we backed off for */ - struct drm_gem_object *contended; + struct dma_resv *contended; /** - * @prelocked: already locked GEM object due to contention + * @prelocked: already locked dma_resv object due to contention */ - struct drm_gem_object *prelocked; + struct dma_resv *prelocked; }; /** @@ -175,6 +175,7 @@ static inline struct ww_acquire_ctx *drm_exec_ticket(struct drm_exec *exec) void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned nr); void drm_exec_fini(struct drm_exec *exec); bool drm_exec_cleanup(struct drm_exec *exec); +int drm_exec_lock_resv(struct drm_exec *exec, struct dma_resv *resv); int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj); void drm_exec_unlock_obj(struct drm_exec *exec, struct drm_gem_object *obj); int drm_exec_prepare_obj(struct drm_exec *exec, struct drm_gem_object *obj, -- 2.43.0