From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtpout8.mo534.mail-out.ovh.net (smtpout8.mo534.mail-out.ovh.net [54.36.140.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B9513126D6 for ; Mon, 6 Jul 2026 10:16:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.36.140.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783333010; cv=none; b=YOqUJbtqhKAOjvs3UAzIeNy5tlXDdfXWvtMHaXKCBwMy6pBnLWhDkwrFDpQjwv5KMglfsMDxdFJv5wg8JUAFlYYP0uhUwmk6iU8Q2c1vlaSLBHhsqXAiuqrZWArbLlKhPewN/UM1aaW6owSCCkNyNXZfCqK6P9Lowwsb6rFCqp4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783333010; c=relaxed/simple; bh=73xOWsUNj17p1uIynBj/IferflKv0MZJ1tTeiPl+rhA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=W3ed8FEmtHAbEFU9xIEff+LenINXb4KZnP/dnx7xesh2JlDTHVWld9MBkrKLYyOodxRUV4seqdSM/W88PepZm7gsfRTbt5erjctMwDe+JS7vkDw2bKrf5ntPL8lSnzyKl84Nk/WQqIyvQ4H2x/u2f4wyZJpPpAsJahVuvT6LQnY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pixelcluster.dev; spf=pass smtp.mailfrom=pixelcluster.dev; dkim=pass (2048-bit key) header.d=pixelcluster.dev header.i=@pixelcluster.dev header.b=g9bm8HDG; arc=none smtp.client-ip=54.36.140.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pixelcluster.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pixelcluster.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pixelcluster.dev header.i=@pixelcluster.dev header.b="g9bm8HDG" Received: from director3.derp.mail-out.ovh.net (director3.derp.mail-out.ovh.net [152.228.215.222]) by mo534.mail-out.ovh.net (Postfix) with ESMTPS id 4gv0SC1QPYz6JPw; Mon, 6 Jul 2026 10:08:43 +0000 (UTC) Received: from director3.derp.mail-out.ovh.net (director3.derp.mail-out.ovh.net. [127.0.0.1]) by director3.derp.mail-out.ovh.net (inspect_sender_mail_agent) with SMTP for ; Mon, 6 Jul 2026 10:08:43 +0000 (UTC) Received: from mta6.priv.ovhmail-u1.ea.mail.ovh.net (unknown [10.110.101.1]) by director3.derp.mail-out.ovh.net (Postfix) with ESMTPS id 4gv0SC0HkGz5vVf; Mon, 6 Jul 2026 10:08:43 +0000 (UTC) Received: from pixelcluster.dev (unknown [10.1.6.11]) (Authenticated sender: nat@pixelcluster.dev) by mta6.priv.ovhmail-u1.ea.mail.ovh.net (Postfix) with ESMTPSA id C78D98E1903; Mon, 6 Jul 2026 10:08:40 +0000 (UTC) Authentication-Results:garm.ovh; auth=pass (GARM-104R005c18bf4c1-4a57-40e9-bf8d-5f756da7189f, F224CF1D020274B13B21E639C91833BCDAC0997A) smtp.auth=nat@pixelcluster.dev X-OVh-ClientIp:88.133.252.134 From: Natalie Vock Date: Mon, 06 Jul 2026 12:07:43 +0200 Subject: [PATCH v2 01/10] drm/exec: Add helper to bypass IGNORE_DUPLICATES flag 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" Content-Transfer-Encoding: 7bit Message-Id: <20260706-ttm_2_drm_exec-v2-1-4bf6bfc0d320@pixelcluster.dev> References: <20260706-ttm_2_drm_exec-v2-0-4bf6bfc0d320@pixelcluster.dev> In-Reply-To: <20260706-ttm_2_drm_exec-v2-0-4bf6bfc0d320@pixelcluster.dev> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Christian Koenig , Huang Rui , Matthew Auld , Matthew Brost , =?utf-8?q?Thomas_Hellstr=C3=B6m?= , Alex Deucher Cc: 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 X-Mailer: b4 0.15.2 x-ovh-tracer-id: 9127389070351032636 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: dmFkZTEIx5EftTv6qDYynIITLbKmw2V9F73qkvPfwN+6GC3Ph5+oNBPVWeKaotSSyzsLEoE6aoNeT/z/sb6JP+NEna0IvjfnNYhnKja1q6dxD3Jb7I4shHgEmfwt4RwYwfWMrJeeSWT1tVWzr+1Wc90ClmqxXufcv16gHHKk4vjPweAJ7XZzvQwOvhu6mvw7q+gxZaRp/SFrLzBp8jROoK4pIBgRzH7e8vIhWqDQYAnvzOg3wwI7Cm5iQjWjEqopVyP5ALcEWcgRSjmo1GQmwlWMV5+MubgYMTlgg7JHi/WHKBd7/pcOIWar7nF/9t66zi6TVtVu8SSomL6KSZeUYk011HiNWwXLDfpjBPWLSvSdmxUcsM9aYjoysNMPJOKFE8nluG2E8EZqXxvA+mdjAaTXT/M1hQOgWTPGS3FLsqSsgERyjY0Br1rtM8lxfaynmnKDOuH5dZ+vO/avb+2EpJT6UC1E9mjeCIYddylpjZFBgn3hbF9yDSZ7uNN/fAYfTjCTxYuQiDPv0pGzoO0eyl15hzjbEzRQ/VK1jR6qfZ93H0FmF0209waqBTz34/Mma8XU0xZUqgviYlMEDvnVxtOFDxHZBrBZ9lSK/2y3UQH9rHkB8l9WEvVjpYo4ySKPMOFdcmGok13u2lMDPyXdHv3zDyhh9yq+yAiEhS+dEijzDsRwow DKIM-Signature: a=rsa-sha256; bh=N1GjEJtFReJ0oNOCKsB1O/DXSe6xcHnaiP0zlVWxP2o=; c=relaxed/relaxed; d=pixelcluster.dev; h=From; s=ovhmo-selector-1; t=1783332523; v=1; b=g9bm8HDGNv+oEfb4xMXacBXhP3UH0s3rxe5xsiBflxdCipgZVZmp2R+S7eagIy9MD95MFBpB 1t4hpDTsp9SaS7WNVj2c2NaoZnM+HToChFhrlCeDLgiuMyPztfr8jdcRlO1xKzz1a3+PdTiBDCf c4Kg/aVBf73Vb0+4uRRZqbI21MqNELLsgPcIE5dVK09C4U8LdHHKg6whhUm1iYpCH7HmFgfrsc8 1l7vc12HNKgdOYtmkKwGQtEeJnR0HwPpYZIUm6lN6oeh/EMZBQ1GdY4YFtzyq5q51u2/5zaVreG VIy62vzjyvuk/AIdvaALpSrURIxFsg8h74Nqmqy9Qhfig== TTM is about to switch to drm_exec for locking objects in the LRU list. When we're done processing the object, we want to unlock it only if the caller doesn't already hold that lock. If DRM_EXEC_IGNORE_DUPLICATES is set on the exec object (which callers may require for unrelated reasons), we have no way of knowing whether the lock is already held. To remedy this, add a separate helper that forcefully bypasses the IGNORE_DUPLICATES flag for only a single locking operation. Signed-off-by: Natalie Vock --- drivers/gpu/drm/drm_exec.c | 54 ++++++++++++++++++++++++++++++++++------------ include/drm/drm_exec.h | 2 ++ 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/drm_exec.c b/drivers/gpu/drm/drm_exec.c index 7988f5e7d56a3..ec33ed4a523cc 100644 --- a/drivers/gpu/drm/drm_exec.c +++ b/drivers/gpu/drm/drm_exec.c @@ -190,18 +190,9 @@ static int drm_exec_lock_contended(struct drm_exec *exec) return ret; } -/** - * 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) +static int __drm_exec_lock_obj(struct drm_exec *exec, + struct drm_gem_object *obj, + bool ignore_duplicates) { int ret; @@ -226,8 +217,7 @@ int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj) return -EDEADLK; } - if (unlikely(ret == -EALREADY) && - exec->flags & DRM_EXEC_IGNORE_DUPLICATES) + if (unlikely(ret == -EALREADY) && ignore_duplicates) return 0; if (unlikely(ret)) @@ -243,8 +233,44 @@ int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj) dma_resv_unlock(obj->resv); return ret; } + +/** + * 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) +{ + return __drm_exec_lock_obj(exec, obj, + exec->flags & DRM_EXEC_IGNORE_DUPLICATES); +} EXPORT_SYMBOL(drm_exec_lock_obj); +/** + * drm_exec_lock_obj_report_dup - lock a GEM object for use, but always report duplicates + * @exec: the drm_exec object with the state + * @obj: the GEM object to lock + * + * Like drm_exec_lock_obj, lock a GEM object for use and grab a reference to it. + * Unlike drm_exec_lock_obj, DRM_EXEC_IGNORE_DUPLICATES is ignored and duplicates are + * always reported. + * + * Returns: -EDEADLK if a contention is detected, -EALREADY when object is + * already locked, -ENOMEM when memory allocation failed and zero for success. + */ +int drm_exec_lock_obj_report_dup(struct drm_exec *exec, + struct drm_gem_object *obj) +{ + return __drm_exec_lock_obj(exec, obj, false); +} +EXPORT_SYMBOL(drm_exec_lock_obj_report_dup); + /** * drm_exec_unlock_obj - unlock a GEM object in this exec context * @exec: the drm_exec object with the state diff --git a/include/drm/drm_exec.h b/include/drm/drm_exec.h index 8725ba92ff916..ff80dd2b72240 100644 --- a/include/drm/drm_exec.h +++ b/include/drm/drm_exec.h @@ -176,6 +176,8 @@ 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_obj(struct drm_exec *exec, struct drm_gem_object *obj); +int drm_exec_lock_obj_report_dup(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, unsigned int num_fences); -- 2.55.0