From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A6FCCC00140 for ; Tue, 26 Jul 2022 17:50:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239661AbiGZRuX (ORCPT ); Tue, 26 Jul 2022 13:50:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239650AbiGZRuT (ORCPT ); Tue, 26 Jul 2022 13:50:19 -0400 Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 348F01837C; Tue, 26 Jul 2022 10:50:18 -0700 (PDT) Received: by mail-pl1-x62a.google.com with SMTP id v18so852687plo.8; Tue, 26 Jul 2022 10:50:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=0sMFYlUXA/wvNrdz6yghIiBT/tIS2Mu/kejgpgcpcUk=; b=qKzbaVbj2FqDQNpoZXlQDXFmYvzhQt9kBkAgNM5HpdZcgiFRDhU0/4Qj7uc9AbTFzm LpCGdtiKh31TqhbhfY8oNi1QybojWeRNFmGtMP6QIMwLXqzlpFsCe1BrG5qPfoncZKJm FnWc7dWSDJpS4S1ulnwyyhO5mhakPmTr7k5oPC+ERKTlerG6uZ2yZzSsjxH4+YgytEAW zbF1LxjqA4Bu9u+OxhYGOpedTE4qXRHrzjgNt082tSsWNcCq1RE6R5qrLespsop+ifF+ CN40MpZ4Cvh3bPohGU4kswtdTihEhHPKJENdXb1bhcyqMOadR3ND5J19VZCAFdJwTeq5 pCRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0sMFYlUXA/wvNrdz6yghIiBT/tIS2Mu/kejgpgcpcUk=; b=M1/HH/ft2gBghLHPd2mp64vgRPbiu2E3kY9V8kaV13Ww6TvWISYwJLnw2sPalZR9Sm sS6ZkwyS/gnee7X9G0+S94WY1IEpK3yBt5EHjeHOUdoWCYGGnDqLiDTMijl+FZAXXMjB GETEjdLgIk+lqdyuUhip1lvJKeVUS7Rj9/i1evGS3B9p4/ePCWGzbPVtEAHneGmC2wAH 7svmCud073VTBBDkWG9NIzIeR/RujdQUzX6H2huwgpeVVTmFkZ8TevK3p9TpyfeulRhs rdZaAVoF86N7ORmDbyKK67jrBCDjKIKGcWBAb7IcOvR9PHVsvOvdmOqktbOnHoG88FGH 1aPg== X-Gm-Message-State: AJIora8LV5gqFyVwBkRT7ZGrAvFW49U5t5pOyUWWzIoaTMRP9+FucGV9 5pKBnRyVqlQv5avpNwFBTzg= X-Google-Smtp-Source: AGRyM1sZDbuBr9wwnSiGFXCobcSa90BEIVqoUlk917vKZ8OD+txMCJFw3yYMZvIZ7BBOke9bm4mE4A== X-Received: by 2002:a17:90b:3a8d:b0:1f2:bda7:da0d with SMTP id om13-20020a17090b3a8d00b001f2bda7da0dmr347806pjb.102.1658857817633; Tue, 26 Jul 2022 10:50:17 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id lp6-20020a17090b4a8600b001f2173d897asm371289pjb.43.2022.07.26.10.50.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:16 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 01/15] drm/msm: Reorder lock vs submit alloc Date: Tue, 26 Jul 2022 10:50:25 -0700 Message-Id: <20220726175043.1027731-2-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark This lets us drop the NORETRY. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem_submit.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm= _gem_submit.c index c9e4aeb14f4a..b7c61a99d274 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -36,7 +36,7 @@ static struct msm_gem_submit *submit_create(struct drm_de= vice *dev, if (sz > SIZE_MAX) return ERR_PTR(-ENOMEM); =20 - submit =3D kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY); + submit =3D kzalloc(sz, GFP_KERNEL); if (!submit) return ERR_PTR(-ENOMEM); =20 @@ -771,25 +771,21 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void= *data, trace_msm_gpu_submit(pid_nr(pid), ring->id, submitid, args->nr_bos, args->nr_cmds); =20 - ret =3D mutex_lock_interruptible(&queue->lock); - if (ret) - goto out_post_unlock; - if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) { out_fence_fd =3D get_unused_fd_flags(O_CLOEXEC); if (out_fence_fd < 0) { ret =3D out_fence_fd; - goto out_unlock; + return ret; } } =20 - submit =3D submit_create(dev, gpu, queue, args->nr_bos, - args->nr_cmds); - if (IS_ERR(submit)) { - ret =3D PTR_ERR(submit); - submit =3D NULL; - goto out_unlock; - } + submit =3D submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds); + if (IS_ERR(submit)) + return PTR_ERR(submit); + + ret =3D mutex_lock_interruptible(&queue->lock); + if (ret) + goto out_post_unlock; =20 submit->pid =3D pid; submit->ident =3D submitid; @@ -965,9 +961,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *= data, if (ret && (out_fence_fd >=3D 0)) put_unused_fd(out_fence_fd); mutex_unlock(&queue->lock); +out_post_unlock: if (submit) msm_gem_submit_put(submit); -out_post_unlock: if (!IS_ERR_OR_NULL(post_deps)) { for (i =3D 0; i < args->nr_out_syncobjs; ++i) { kfree(post_deps[i].chain); --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D6D9CC00144 for ; Tue, 26 Jul 2022 17:50:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239685AbiGZRu1 (ORCPT ); Tue, 26 Jul 2022 13:50:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44460 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239666AbiGZRuW (ORCPT ); Tue, 26 Jul 2022 13:50:22 -0400 Received: from mail-pj1-x1036.google.com (mail-pj1-x1036.google.com [IPv6:2607:f8b0:4864:20::1036]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3F6422E9F3; Tue, 26 Jul 2022 10:50:21 -0700 (PDT) Received: by mail-pj1-x1036.google.com with SMTP id y1so5975667pja.4; Tue, 26 Jul 2022 10:50:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FlC/bVN5qW7CT1CMAFt2x0HFIxhESZPM94joMv7rafM=; b=lXzjdsN32PhXqkrDLodQJiYabdGeabKkfzQw1VensvYY1zJOOS+QEI5YyIRMhNGXoT pHs/GX36xmorY938XjuhMWxgHapdStKjxc289lF7EIOEbFx7NWzbu7izN6YpbK27tM77 korn4gG6q/X7QuvP9NSnmbo3d6F1cJeaOndpp/hlgXAbzFP8AUAwj/gunScewd9eRjn5 hvk/4/JXE/oDBqn1vmDVE3as2y5TUNL2nQdJdcRyCATMZsEqTpFsSYG3wBX0xCvPejPe EpZhinW2oUmKok498uzkg/5RHQFa+U8vP/bn/tO3w84V+rQgGz4k2evkZl4+5iC6WJvV 0pgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FlC/bVN5qW7CT1CMAFt2x0HFIxhESZPM94joMv7rafM=; b=wuyns9t75x3F7Si770jQAzmwpDlV8JjbOG2XDDSaSBZO84LpJBykq/y1ixoLgFOOy8 DkvxsAhmODbX6jjkE3KP3LOlXMMH/ppLpai0WV5nanhI8bPYTFnjXOg0j2kGg/XAlOPM uppAE0WlJ8CELT3gTB7s6UbErrFaH8nvj93hKBBaeYimjidzkrL/ogcgJNGu/9bMsr3H JbgEqL+TwMiL7o+JcSAN79vzdHIMbvMOU22PboTn2XuoIEkYQwUnkBw1yUWakEX7Ywet Gz3f+x4XdlR8OQnj/tsE86+/fOexGPxWjTZM4bYb2dehfqMRy+FJ2TTEpeUxpF8mzTa1 3ZrQ== X-Gm-Message-State: AJIora+H04RIMHNzWI284IhgbS2OThigZSZPcqv8Ka9fVWysH4e9gF3u 4j8HnoLhJRQxjDBGWA0OFZxaYg+ZOdM= X-Google-Smtp-Source: AGRyM1vtvmbQYKQSy+Mtk23u2rAW4+pzs19Ai61kLpJPH1d+hFu89+tHRwM1n6n8Db3xSRKvHSMzmQ== X-Received: by 2002:a17:902:ce8c:b0:16c:4be6:2536 with SMTP id f12-20020a170902ce8c00b0016c4be62536mr18100600plg.41.1658857820715; Tue, 26 Jul 2022 10:50:20 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id z7-20020a170903018700b0016d6a471352sm5934135plg.6.2022.07.26.10.50.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:19 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 02/15] drm/msm: Small submit cleanup Date: Tue, 26 Jul 2022 10:50:26 -0700 Message-Id: <20220726175043.1027731-3-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Move more initialization into submit_create(). Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem_submit.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm= _gem_submit.c index b7c61a99d274..c7819781879c 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -26,6 +26,7 @@ static struct msm_gem_submit *submit_create(struct drm_de= vice *dev, struct msm_gpu_submitqueue *queue, uint32_t nr_bos, uint32_t nr_cmds) { + static atomic_t ident =3D ATOMIC_INIT(0); struct msm_gem_submit *submit; uint64_t sz; int ret; @@ -52,9 +53,13 @@ static struct msm_gem_submit *submit_create(struct drm_d= evice *dev, submit->gpu =3D gpu; submit->cmd =3D (void *)&submit->bos[nr_bos]; submit->queue =3D queue; + submit->pid =3D get_pid(task_pid(current)); submit->ring =3D gpu->rb[queue->ring_nr]; submit->fault_dumped =3D false; =20 + /* Get a unique identifier for the submission for logging purposes */ + submit->ident =3D atomic_inc_return(&ident) - 1; + INIT_LIST_HEAD(&submit->node); =20 return submit; @@ -718,7 +723,6 @@ static void msm_process_post_deps(struct msm_submit_pos= t_dep *post_deps, int msm_ioctl_gem_submit(struct drm_device *dev, void *data, struct drm_file *file) { - static atomic_t ident =3D ATOMIC_INIT(0); struct msm_drm_private *priv =3D dev->dev_private; struct drm_msm_gem_submit *args =3D data; struct msm_file_private *ctx =3D file->driver_priv; @@ -729,10 +733,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void = *data, struct msm_submit_post_dep *post_deps =3D NULL; struct drm_syncobj **syncobjs_to_reset =3D NULL; int out_fence_fd =3D -1; - struct pid *pid =3D get_pid(task_pid(current)); bool has_ww_ticket =3D false; unsigned i; - int ret, submitid; + int ret; =20 if (!gpu) return -ENXIO; @@ -764,12 +767,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void = *data, if (!queue) return -ENOENT; =20 - /* Get a unique identifier for the submission for logging purposes */ - submitid =3D atomic_inc_return(&ident) - 1; - ring =3D gpu->rb[queue->ring_nr]; - trace_msm_gpu_submit(pid_nr(pid), ring->id, submitid, - args->nr_bos, args->nr_cmds); =20 if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) { out_fence_fd =3D get_unused_fd_flags(O_CLOEXEC); @@ -783,13 +781,13 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void= *data, if (IS_ERR(submit)) return PTR_ERR(submit); =20 + trace_msm_gpu_submit(pid_nr(submit->pid), ring->id, submit->ident, + args->nr_bos, args->nr_cmds); + ret =3D mutex_lock_interruptible(&queue->lock); if (ret) goto out_post_unlock; =20 - submit->pid =3D pid; - submit->ident =3D submitid; - if (args->flags & MSM_SUBMIT_SUDO) submit->in_rb =3D true; =20 --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39104C04A68 for ; Tue, 26 Jul 2022 17:50:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239691AbiGZRui (ORCPT ); Tue, 26 Jul 2022 13:50:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44572 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239680AbiGZRuZ (ORCPT ); Tue, 26 Jul 2022 13:50:25 -0400 Received: from mail-pg1-x532.google.com (mail-pg1-x532.google.com [IPv6:2607:f8b0:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 15C042B61F; Tue, 26 Jul 2022 10:50:24 -0700 (PDT) Received: by mail-pg1-x532.google.com with SMTP id 6so13726811pgb.13; Tue, 26 Jul 2022 10:50:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=AwYCVdrGkHnM2D+4h4BxfmYuAccPj8wFXhKV37+GyLo=; b=d07ps/PxhGLVTQay3ZOMj+wOILdTIPfoaYbqxIjtMx0KUtWZQl1malmooufQqO0e49 ERbm62n+OGlKUrXWuE5FbiXGq198R9jlAdrxLPEdh7uX6M+SKPjr1hkIl6ptbM8kVio+ U7NfKTU6WjUonHvM5by8NfWmb7jx+y+Cbe/LDju3PmtbSXv31k7VWji+KQB3JEAlBCIc 44+pUVLvjT7NDW5ctkprIaBP28MpTimydDrs1SMV99kZsKtjqfRYLDztREVN9ZKBY9+r m6dYEnGJnEiwDDrreE2BBHvfamp+lDuL6JYnbqm2ovuE+ddhxTzFzdHgI4ukEMkL/7HP zdkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AwYCVdrGkHnM2D+4h4BxfmYuAccPj8wFXhKV37+GyLo=; b=mVGQeyACXSW+CcVuU2zEvCLoua2+FUlhWuymhhrAZg0sQQXoW+8w24p02jaB6ae2Sm rGLJl3YORSuiLNAux2N+LvxJ6cRd2UaQoN6jNBKS4QrsgTDRd6FZPBqsHcsL9YdojvVV RK2gEX2b58Qna/wditNlgLjUVjQ23ajGET4Qpoz+iQHAGtBkLdBOnhT+/DuZuUHiHTz9 kLjdZ6EWYbf4V919jdD1CwxfscNtot0QJy93Kick8YuA7UESjQodcMOskozv8D1bGsmS BwPaDSr3yIhsBmGL7NIzMGxcjFZydx2Nn+hUY0QCvRvokxYOJu95WTzyTJttKRYZMVSc eDyQ== X-Gm-Message-State: AJIora/PYxb7yaIENtUwhfcdLgt++iKWGX7kxO9w0asLAt5ePOQRGMj9 Zj/v6rz2eCkbhmB0yHQEtnOA3XBNb6Q= X-Google-Smtp-Source: AGRyM1vKma7jG+VAhlmr2RGqxxeVlHvtkFjPUXWcN4AIdM90MN87noNjNu1A+3O5qideJRIuVAuTsQ== X-Received: by 2002:a63:6b0a:0:b0:40d:ffa6:85c5 with SMTP id g10-20020a636b0a000000b0040dffa685c5mr15585780pgc.327.1658857823442; Tue, 26 Jul 2022 10:50:23 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id n3-20020a170902f60300b0016bdea07b9esm11775714plg.190.2022.07.26.10.50.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:22 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 03/15] drm/msm: Split out idr_lock Date: Tue, 26 Jul 2022 10:50:27 -0700 Message-Id: <20220726175043.1027731-4-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Otherwise if we hit reclaim pinning objects in the submit path, we'll be blocking retire_worker trying to free a submit. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_drv.c | 4 ++-- drivers/gpu/drm/msm/msm_gem_submit.c | 10 ++++++++-- drivers/gpu/drm/msm/msm_gpu.h | 4 +++- drivers/gpu/drm/msm/msm_submitqueue.c | 1 + 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 1ed4cd09dbf8..d7ca025457b6 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -883,13 +883,13 @@ static int wait_fence(struct msm_gpu_submitqueue *que= ue, uint32_t fence_id, * retired, so if the fence is not found it means there is nothing * to wait for */ - ret =3D mutex_lock_interruptible(&queue->lock); + ret =3D mutex_lock_interruptible(&queue->idr_lock); if (ret) return ret; fence =3D idr_find(&queue->fence_idr, fence_id); if (fence) fence =3D dma_fence_get_rcu(fence); - mutex_unlock(&queue->lock); + mutex_unlock(&queue->idr_lock); =20 if (!fence) return 0; diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm= _gem_submit.c index c7819781879c..16c662808522 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -72,9 +72,9 @@ void __msm_gem_submit_destroy(struct kref *kref) unsigned i; =20 if (submit->fence_id) { - mutex_lock(&submit->queue->lock); + mutex_lock(&submit->queue->idr_lock); idr_remove(&submit->queue->fence_idr, submit->fence_id); - mutex_unlock(&submit->queue->lock); + mutex_unlock(&submit->queue->idr_lock); } =20 dma_fence_put(submit->user_fence); @@ -881,6 +881,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *= data, =20 submit->nr_cmds =3D i; =20 + mutex_lock(&queue->idr_lock); + /* * If using userspace provided seqno fence, validate that the id * is available before arming sched job. Since access to fence_idr @@ -889,6 +891,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *= data, */ if ((args->flags & MSM_SUBMIT_FENCE_SN_IN) && idr_find(&queue->fence_idr, args->fence)) { + mutex_unlock(&queue->idr_lock); ret =3D -EINVAL; goto out; } @@ -921,6 +924,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *= data, submit->user_fence, 1, INT_MAX, GFP_KERNEL); } + + mutex_unlock(&queue->idr_lock); + if (submit->fence_id < 0) { ret =3D submit->fence_id; submit->fence_id =3D 0; diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 4d935fedd2ac..962d2070bcdf 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -466,7 +466,8 @@ static inline int msm_gpu_convert_priority(struct msm_g= pu *gpu, int prio, * @node: node in the context's list of submitqueues * @fence_idr: maps fence-id to dma_fence for userspace visible fence * seqno, protected by submitqueue lock - * @lock: submitqueue lock + * @idr_lock: for serializing access to fence_idr + * @lock: submitqueue lock for serializing submits on a queue * @ref: reference count * @entity: the submit job-queue */ @@ -479,6 +480,7 @@ struct msm_gpu_submitqueue { struct msm_file_private *ctx; struct list_head node; struct idr fence_idr; + struct mutex idr_lock; struct mutex lock; struct kref ref; struct drm_sched_entity *entity; diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c b/drivers/gpu/drm/msm/ms= m_submitqueue.c index f486a3cd4e55..c6929e205b51 100644 --- a/drivers/gpu/drm/msm/msm_submitqueue.c +++ b/drivers/gpu/drm/msm/msm_submitqueue.c @@ -200,6 +200,7 @@ int msm_submitqueue_create(struct drm_device *drm, stru= ct msm_file_private *ctx, *id =3D queue->id; =20 idr_init(&queue->fence_idr); + mutex_init(&queue->idr_lock); mutex_init(&queue->lock); =20 list_add_tail(&queue->node, &ctx->submitqueues); --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 191C3C00140 for ; Tue, 26 Jul 2022 17:50:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239587AbiGZRul (ORCPT ); Tue, 26 Jul 2022 13:50:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44896 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239694AbiGZRug (ORCPT ); Tue, 26 Jul 2022 13:50:36 -0400 Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D0E5531209; Tue, 26 Jul 2022 10:50:26 -0700 (PDT) Received: by mail-pg1-x529.google.com with SMTP id s206so13767859pgs.3; Tue, 26 Jul 2022 10:50:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6E5wGlWgwtmRN55cq/vUaSJZuL1NyuRgvoYtJGWwhUY=; b=I6TrnqzGLU8Wf3TA6F1MQYzTQa84tF+RBUNCPmEwcKxAm1IhUepiQRpBJBj47oj30O vUieVbVD4FZUI1Ik6fD9+t9sHMqG+mg60pW4KXGXxlhFMU07+iURe9UjS35iuenNealj Sh0KfVZ2WhxqofgVCHjPSUDLte7xjDhmkL4xgCIYVVZvYqMptrlBr5udaYVqRjwJ6/AT RRC8lgmRAawFuk+gITQ8eOUS3x3J/l3/aaXzW4AW0p0kBf8Brxq1JwCN0zK6cyBIvEXw fiX6EhU9ecHIZdNXvkuWqTFwtsSivBc8S9JQTXYT8iXcafprX7WN6L3YuACD7IPK2/jh 7pZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6E5wGlWgwtmRN55cq/vUaSJZuL1NyuRgvoYtJGWwhUY=; b=gIONGUd1FQHboo9X70PQsGRaExAHS32aUMa9mDufd3qyh+eA0HbvbPv9cuAcuqMUH5 zfIzR+4ZPr1XCDJbREGe0X4yLoW+1NFJdhvoilHsPYrzppFGdv8PvgAeSwe1/M3pj1zj 8ynvv+VBhqT5dYtHPotAX5ZL9VzZGiVUSxoArCeQsdCQSTJU4Yd+Yoh28o2gBVXju765 Jqoogn0s9qX3t0qZ2P3QfNiAIp7+RZ9diCmDj4RFiAzWSs7qZECcPkan8FOh9YZak29c 38EYeGIVqVkSW7ieis+2FCeMhb4QHMiXdmsJzDYB+9kPrkP91Ff3C35sSTIo+Rbt8XMJ KAUg== X-Gm-Message-State: AJIora/++D5y3EmjHoggsq7+hJZQaR8JOVLSazCBqnxO5XYBLDj1J/l7 dfoYAz9s+4HGKPDQA3i4F6w= X-Google-Smtp-Source: AGRyM1v60uBR/7d9lI9MPwuXCKfxtHlJMImYLsPoMUgmUzrznjI7tzuzUaPiTsEizY7S5glKV3qWrA== X-Received: by 2002:a65:6398:0:b0:415:7d00:c1de with SMTP id h24-20020a656398000000b004157d00c1demr16203732pgv.610.1658857826229; Tue, 26 Jul 2022 10:50:26 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id o8-20020a170902d4c800b0016be9fa6807sm11807467plg.284.2022.07.26.10.50.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:25 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 04/15] drm/msm/gem: Check for active in shrinker path Date: Tue, 26 Jul 2022 10:50:28 -0700 Message-Id: <20220726175043.1027731-5-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Currently in our shrinker path we shouldn't be encountering anything that is active, but this will change in subsequent patches. So check if there are unsignaled fences. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem.c | 10 ++++++++++ drivers/gpu/drm/msm/msm_gem.h | 1 + drivers/gpu/drm/msm/msm_gem_shrinker.c | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 8ddbd2e001d4..b55d252aef17 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -870,6 +870,16 @@ static void update_inactive(struct msm_gem_object *msm= _obj) mutex_unlock(&priv->mm_lock); } =20 +bool msm_gem_active(struct drm_gem_object *obj) +{ + GEM_WARN_ON(!msm_gem_is_locked(obj)); + + if (to_msm_bo(obj)->pin_count) + return true; + + return !dma_resv_test_signaled(obj->resv, dma_resv_usage_rw(true)); +} + int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *tim= eout) { bool write =3D !!(op & MSM_PREP_WRITE); diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h index 432032ad4aed..0ab0dc4f8c25 100644 --- a/drivers/gpu/drm/msm/msm_gem.h +++ b/drivers/gpu/drm/msm/msm_gem.h @@ -173,6 +173,7 @@ void msm_gem_put_vaddr(struct drm_gem_object *obj); int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv); void msm_gem_active_get(struct drm_gem_object *obj, struct msm_gpu *gpu); void msm_gem_active_put(struct drm_gem_object *obj); +bool msm_gem_active(struct drm_gem_object *obj); int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *tim= eout); int msm_gem_cpu_fini(struct drm_gem_object *obj); int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file, diff --git a/drivers/gpu/drm/msm/msm_gem_shrinker.c b/drivers/gpu/drm/msm/m= sm_gem_shrinker.c index 6e39d959b9f0..ea8ed74982c1 100644 --- a/drivers/gpu/drm/msm/msm_gem_shrinker.c +++ b/drivers/gpu/drm/msm/msm_gem_shrinker.c @@ -43,6 +43,9 @@ purge(struct msm_gem_object *msm_obj) if (!is_purgeable(msm_obj)) return false; =20 + if (msm_gem_active(&msm_obj->base)) + return false; + /* * This will move the obj out of still_in_list to * the purged list @@ -58,6 +61,9 @@ evict(struct msm_gem_object *msm_obj) if (is_unevictable(msm_obj)) return false; =20 + if (msm_gem_active(&msm_obj->base)) + return false; + msm_gem_evict(&msm_obj->base); =20 return true; --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8431AC19F29 for ; Tue, 26 Jul 2022 17:50:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239728AbiGZRuu (ORCPT ); Tue, 26 Jul 2022 13:50:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44984 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239722AbiGZRui (ORCPT ); Tue, 26 Jul 2022 13:50:38 -0400 Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4562830545; Tue, 26 Jul 2022 10:50:30 -0700 (PDT) Received: by mail-pj1-x1030.google.com with SMTP id c19-20020a17090ae11300b001f2f94ed5c6so1331577pjz.1; Tue, 26 Jul 2022 10:50:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mxFT+vmlgH8OMaHZf0MGM1sQcdQOD7qQazzf52IZIdo=; b=bgpjAJ5bBS4yugrwA8j1ZIBaDUjFu0nuPpsoqqylDTGzh/AiLFF3nvq0m75CMjU3kG anosJSMiZWd6K3C3JoUEVH7w3VQRuZ9+G/FzSdU2kuj5ooffiflfSeSWzILo3Wibcfut Nj/x4x7CVsFbkD0UviZTxWrAhp4+2JYVE/RKUBa1cXXXNbSoNWcWvLLr1vhtT0eaT96V X011xdhwcop32fBWDQH4NOzdjuBtJTLDihz4W6Aft1OOKBBYQtJx92JWyG2nmSpR542V GUGTpdLJfUreMLgG/sDXRsSz6HJx+21R5SqR7KkQckSbFVbZWQODVuYJ+BvQAu3fuoAx WHTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mxFT+vmlgH8OMaHZf0MGM1sQcdQOD7qQazzf52IZIdo=; b=4GDKHgwBVJ8kiKqQa9TEBCYo0tI0MxQfxXN9pGCFT8XQUij5EWaHNS5jphehIVZ4sC 1kK7SmcCDHEX+a42eTSWHChdlCI5wl8mAS21p6WsziRO0Bs8xyPc1t1qOPQkvaohsku9 9mojGDnpsv9f8hFnvIDaZ9Yz/SYhHeekkgPowNjoBD6feGIcn2i9zAVlnTo1M8dRea8X UxaSVexLnMT0MBTNhIVdbI0g3wFEyocQqwOwxUbCxb5NR91mglz2MjXqgz7wn4bCCawj sIgquexDiyV3uqtaYjNhzpXS0Cs1BA+bvxgrgPgWU4bUrw2MWyFg+6Hu2i/Fuz0AeN+h BGAQ== X-Gm-Message-State: AJIora/tneYlCnAro+3gFmns4AnhyLOGxWibD4Nx00Bi59FqA9RKWYVP CT1W+laNqiQRIBTGtrLjEFw= X-Google-Smtp-Source: AGRyM1tV+bWtmoiT21D47kprb3MRO/XsTGS8Bp7nBZWAPLvP49tQtJQP2nRjjtaDwhyIpPZsba+LcQ== X-Received: by 2002:a17:902:a616:b0:16c:d74e:4654 with SMTP id u22-20020a170902a61600b0016cd74e4654mr17881448plq.4.1658857829138; Tue, 26 Jul 2022 10:50:29 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id 125-20020a621883000000b005289a50e4c2sm11933021pfy.23.2022.07.26.10.50.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:27 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 05/15] drm/msm/gem: Rename update_inactive Date: Tue, 26 Jul 2022 10:50:29 -0700 Message-Id: <20220726175043.1027731-6-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Really what this is doing is updating various LRU lists. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index b55d252aef17..97467364dc0a 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -19,7 +19,7 @@ #include "msm_gpu.h" #include "msm_mmu.h" =20 -static void update_inactive(struct msm_gem_object *msm_obj); +static void update_lru(struct drm_gem_object *obj); =20 static dma_addr_t physaddr(struct drm_gem_object *obj) { @@ -132,7 +132,7 @@ static struct page **get_pages(struct drm_gem_object *o= bj) if (msm_obj->flags & MSM_BO_WC) sync_for_device(msm_obj); =20 - update_inactive(msm_obj); + update_lru(obj); } =20 return msm_obj->pages; @@ -193,7 +193,7 @@ struct page **msm_gem_get_pages(struct drm_gem_object *= obj) =20 if (!IS_ERR(p)) { msm_obj->pin_count++; - update_inactive(msm_obj); + update_lru(obj); } =20 msm_gem_unlock(obj); @@ -207,7 +207,7 @@ void msm_gem_put_pages(struct drm_gem_object *obj) msm_gem_lock(obj); msm_obj->pin_count--; GEM_WARN_ON(msm_obj->pin_count < 0); - update_inactive(msm_obj); + update_lru(obj); msm_gem_unlock(obj); } =20 @@ -449,7 +449,7 @@ void msm_gem_unpin_locked(struct drm_gem_object *obj) msm_obj->pin_count--; GEM_WARN_ON(msm_obj->pin_count < 0); =20 - update_inactive(msm_obj); + update_lru(obj); } =20 struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj, @@ -658,7 +658,7 @@ static void *get_vaddr(struct drm_gem_object *obj, unsi= gned madv) goto fail; } =20 - update_inactive(msm_obj); + update_lru(obj); } =20 return msm_obj->vaddr; @@ -730,7 +730,7 @@ int msm_gem_madvise(struct drm_gem_object *obj, unsigne= d madv) * between inactive lists */ if (msm_obj->active_count =3D=3D 0) - update_inactive(msm_obj); + update_lru(obj); =20 msm_gem_unlock(obj); =20 @@ -757,7 +757,7 @@ void msm_gem_purge(struct drm_gem_object *obj) put_iova_vmas(obj); =20 msm_obj->madv =3D __MSM_MADV_PURGED; - update_inactive(msm_obj); + update_lru(obj); =20 drm_gem_free_mmap_offset(obj); =20 @@ -792,7 +792,7 @@ void msm_gem_evict(struct drm_gem_object *obj) =20 put_pages(obj); =20 - update_inactive(msm_obj); + update_lru(obj); } =20 void msm_gem_vunmap(struct drm_gem_object *obj) @@ -835,13 +835,14 @@ void msm_gem_active_put(struct drm_gem_object *obj) GEM_WARN_ON(!msm_gem_is_locked(obj)); =20 if (--msm_obj->active_count =3D=3D 0) { - update_inactive(msm_obj); + update_lru(obj); } } =20 -static void update_inactive(struct msm_gem_object *msm_obj) +static void update_lru(struct drm_gem_object *obj) { - struct msm_drm_private *priv =3D msm_obj->base.dev->dev_private; + struct msm_drm_private *priv =3D obj->dev->dev_private; + struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base)); =20 --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D0BD7C00144 for ; Tue, 26 Jul 2022 17:50:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239742AbiGZRux (ORCPT ); Tue, 26 Jul 2022 13:50:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239709AbiGZRuk (ORCPT ); Tue, 26 Jul 2022 13:50:40 -0400 Received: from mail-pg1-x532.google.com (mail-pg1-x532.google.com [IPv6:2607:f8b0:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B811C326F2; Tue, 26 Jul 2022 10:50:32 -0700 (PDT) Received: by mail-pg1-x532.google.com with SMTP id 6so13727102pgb.13; Tue, 26 Jul 2022 10:50:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4TbOfcqFkaHon89dsPDId7NNakdXJT5mDYYEM5ZbQu4=; b=L6BQD4cXM5g5dYWRDLi8nY5qoHZfLmMHeICkpsIp8/zpGHD7MHsTBwJ0WdnIqyzjRj OTnF41mIR4JwzXo7ivQfNKCQlAybcsKzx3mUFAvqolbc4R9nHXtrNcMEWycDpX/j6/nb Jr8JHjSh5N1SukZwESLj7sS0l8rwC4FzXIBl9pF/rOuMR9kBuC6TVRXjWfc1oTirfjcy 1i4iavoi04XDICP8qbX2K6l1eV/ojMB41WZmonDubdpTUm5pUWy5RCB84LLoRjJunYcJ AhGXNsMLlYogW/4BqRyjTug/Sm3UTlny21SFIvzA1qAsmseb7n2j3ls7ZL4hpumfazHo AZsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4TbOfcqFkaHon89dsPDId7NNakdXJT5mDYYEM5ZbQu4=; b=Nr+gTz7imeOJ4OVc6B5w52+l/0p/NnFiCyk8419IU11K8gsz96BSHavO49i83jb9Ws UXFaRWWlutBtzRSswoQ1DqXkW836XBUmqEXsfwJHpZZesLHPRtXXU4xdAyOltulMIHii Nbypj2eqpWoCwD3wuxP1Wz7GSqvpebVFZS8S6Y2U24+un+gLizl0tWlHfqH8E2qoReQR RpqYLSFL/ipk0LEChbw389cPkCuDFF6QTZdePUXqN2R43AIUKlKmzxzL4VIs0xbHrEk+ zi3Q4LZprNrZ2cdePzP5egtfnKuG6RfyIgEIDlkQjvsuSYXvUycfoE4+T8iB7M384a58 PjlQ== X-Gm-Message-State: AJIora/+qVqoXHB7iiJW3YNbonX2uSfeL0HFKQu11hUK3mpuefAaWJaF bB+QUwn/kM88ne72TrYrmTE= X-Google-Smtp-Source: AGRyM1vCBSG+2MrD8YxRCZnLd4kzxFePAWMM6fI3FYTppOWPEniQ5DooTQ8G8XP9tEpMhR/8KhVvrg== X-Received: by 2002:a63:8742:0:b0:41b:85d:1f9b with SMTP id i63-20020a638742000000b0041b085d1f9bmr6780871pge.352.1658857832417; Tue, 26 Jul 2022 10:50:32 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id ij5-20020a170902ab4500b0016c574aa0fdsm11745788plb.76.2022.07.26.10.50.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:31 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 06/15] drm/msm/gem: Rename to pin/unpin_pages Date: Tue, 26 Jul 2022 10:50:30 -0700 Message-Id: <20220726175043.1027731-7-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Since that is what these fxns actually do.. they are getting *pinned* pages (as opposed to cases where we need pages, but don't need them pinned, like CPU mappings). Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem.c | 18 +++++++++++++----- drivers/gpu/drm/msm/msm_gem.h | 4 ++-- drivers/gpu/drm/msm/msm_gem_prime.c | 4 ++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 97467364dc0a..3da64c7f65a2 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -177,30 +177,38 @@ static void put_pages(struct drm_gem_object *obj) } } =20 -struct page **msm_gem_get_pages(struct drm_gem_object *obj) +static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj) { struct msm_gem_object *msm_obj =3D to_msm_bo(obj); struct page **p; =20 - msm_gem_lock(obj); + GEM_WARN_ON(!msm_gem_is_locked(obj)); =20 if (GEM_WARN_ON(msm_obj->madv !=3D MSM_MADV_WILLNEED)) { - msm_gem_unlock(obj); return ERR_PTR(-EBUSY); } =20 p =3D get_pages(obj); - if (!IS_ERR(p)) { msm_obj->pin_count++; update_lru(obj); } =20 + return p; +} + +struct page **msm_gem_pin_pages(struct drm_gem_object *obj) +{ + struct page **p; + + msm_gem_lock(obj); + p =3D msm_gem_pin_pages_locked(obj); msm_gem_unlock(obj); + return p; } =20 -void msm_gem_put_pages(struct drm_gem_object *obj) +void msm_gem_unpin_pages(struct drm_gem_object *obj) { struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h index 0ab0dc4f8c25..6fe521ccda45 100644 --- a/drivers/gpu/drm/msm/msm_gem.h +++ b/drivers/gpu/drm/msm/msm_gem.h @@ -159,8 +159,8 @@ int msm_gem_get_and_pin_iova(struct drm_gem_object *obj, struct msm_gem_address_space *aspace, uint64_t *iova); void msm_gem_unpin_iova(struct drm_gem_object *obj, struct msm_gem_address_space *aspace); -struct page **msm_gem_get_pages(struct drm_gem_object *obj); -void msm_gem_put_pages(struct drm_gem_object *obj); +struct page **msm_gem_pin_pages(struct drm_gem_object *obj); +void msm_gem_unpin_pages(struct drm_gem_object *obj); int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, struct drm_mode_create_dumb *args); int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_= gem_prime.c index dcc8a573bc76..c1d91863df05 100644 --- a/drivers/gpu/drm/msm/msm_gem_prime.c +++ b/drivers/gpu/drm/msm/msm_gem_prime.c @@ -63,12 +63,12 @@ struct drm_gem_object *msm_gem_prime_import_sg_table(st= ruct drm_device *dev, int msm_gem_prime_pin(struct drm_gem_object *obj) { if (!obj->import_attach) - msm_gem_get_pages(obj); + msm_gem_pin_pages(obj); return 0; } =20 void msm_gem_prime_unpin(struct drm_gem_object *obj) { if (!obj->import_attach) - msm_gem_put_pages(obj); + msm_gem_unpin_pages(obj); } --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C225CC00140 for ; Tue, 26 Jul 2022 17:51:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239812AbiGZRu7 (ORCPT ); Tue, 26 Jul 2022 13:50:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45268 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239719AbiGZRuq (ORCPT ); Tue, 26 Jul 2022 13:50:46 -0400 Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3050B3134E; Tue, 26 Jul 2022 10:50:35 -0700 (PDT) Received: by mail-pf1-x42d.google.com with SMTP id o12so13846794pfp.5; Tue, 26 Jul 2022 10:50:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UVam+OtTXmVRJOOFcNCglGVq9lRc/LFnzlVeuJ/h90Y=; b=oFM3qcef0UrtwoUQpFLwuAqGgPddV/OrqybzZuPT93TR2DT36gdpEczUOyjwvntM1w 9GHBp0hS4jsevM/OOdFK1ksSanwvcayuLU3p1y37o1c5CqkEoIM87qXwiKQl8mc98yE5 I/9f9rUx6tUu4B2JrwbAO9tg+7ZwXmLRssZEvhWkOGS5EEmas/iGJLnx8ZaW/DpZoGRs 2sn0Yb+J/I0tm9IUF79FwOC+0+kT1UEkLrp668+L+Py9mxDqfRNx+EcNLydL1c1Z8KP7 m4jSOf3FsiRsVh+cKAsxEukBSeSoyY8lFuF9Ho6YqbzRIT6XQy6zs8NOgoPIFzuFA7ET fkoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UVam+OtTXmVRJOOFcNCglGVq9lRc/LFnzlVeuJ/h90Y=; b=d4f1AbAZCFcSG7eXVGwnoZaiiL/w74J0OuYhU2yincqg9xRgh/GyifbpZdVhsIijOV Tgv4Qe34TX6s+Tg8ysb3hvRuxP9ISEowdi+yCqJcjU8G951PCxt+51ZyFVmKcCmkeDSG ixQT+U0exd3xL2fs/AxKysyjpSimQZChOb35T/vqXsdmYB4b9FiivPwG0AgDbuPFh8WT 1rVLOtq7fAe3m5GTLdfFbZ0XcwA10HtYtJw/ZJtKlVV8zJYqz7TB+wQFIM3kCqW8BvcH 4DE46X1lDAvhnzyilAkb6rDO5zGFFFELfUnP/XEikX8jh744+UUXW/SdOoxb4s1NyPqO Q+9A== X-Gm-Message-State: AJIora9o1OxtUSzo/7liLraQTjC39LZU5TIImaS+Q5wYCnizGaZzPqqH i6Nh4vFP7NHcHDKBV/vFsS8= X-Google-Smtp-Source: AGRyM1thoGmetx5EzT1Yghxen/ubJ8Ysu0MSl3NADJmMTKowzZ5lzxTdb1KgOzIFyqMqC/S5LQqzAA== X-Received: by 2002:a63:6a89:0:b0:419:d863:321a with SMTP id f131-20020a636a89000000b00419d863321amr15870269pgc.9.1658857835302; Tue, 26 Jul 2022 10:50:35 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id n7-20020a056a00212700b0052ab0a73752sm11989037pfj.198.2022.07.26.10.50.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:34 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 07/15] drm/msm/gem: Consolidate pin/unpin paths Date: Tue, 26 Jul 2022 10:50:31 -0700 Message-Id: <20220726175043.1027731-8-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Avoid having multiple spots where we increment/decrement pin_count (and associated LRU updating) Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 3da64c7f65a2..407b18a24dc4 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -190,7 +190,7 @@ static struct page **msm_gem_pin_pages_locked(struct dr= m_gem_object *obj) =20 p =3D get_pages(obj); if (!IS_ERR(p)) { - msm_obj->pin_count++; + to_msm_bo(obj)->pin_count++; update_lru(obj); } =20 @@ -213,9 +213,7 @@ void msm_gem_unpin_pages(struct drm_gem_object *obj) struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 msm_gem_lock(obj); - msm_obj->pin_count--; - GEM_WARN_ON(msm_obj->pin_count < 0); - update_lru(obj); + msm_gem_unpin_locked(obj); msm_gem_unlock(obj); } =20 @@ -436,14 +434,13 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj= , struct msm_gem_vma *vma) if (GEM_WARN_ON(msm_obj->madv !=3D MSM_MADV_WILLNEED)) return -EBUSY; =20 - pages =3D get_pages(obj); + pages =3D msm_gem_pin_pages_locked(obj); if (IS_ERR(pages)) return PTR_ERR(pages); =20 ret =3D msm_gem_map_vma(vma->aspace, vma, prot, msm_obj->sgt, obj->size); - - if (!ret) - msm_obj->pin_count++; + if (ret) + msm_gem_unpin_locked(obj); =20 return ret; } --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A88E9C00144 for ; Tue, 26 Jul 2022 17:51:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239826AbiGZRvH (ORCPT ); Tue, 26 Jul 2022 13:51:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44830 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239754AbiGZRur (ORCPT ); Tue, 26 Jul 2022 13:50:47 -0400 Received: from mail-pf1-x430.google.com (mail-pf1-x430.google.com [IPv6:2607:f8b0:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6ABA430F6C; Tue, 26 Jul 2022 10:50:38 -0700 (PDT) Received: by mail-pf1-x430.google.com with SMTP id w205so10538933pfc.8; Tue, 26 Jul 2022 10:50:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=0Nc8381KvCAKtcJgWAO7GB/O/Xk1BB4fgkOydTh0/AI=; b=YwNbZp5iud2bS72ealuZiJl9wSFHGsZXH5PVlJpmq1myH0uYxYqgC3fPdzv8NSLtyI OVIQ6BeaXH/sMlixAHd2cNC5RILFNeLJGGGwr1FLDPbWwh/hxWwxNigheiLWtsS/koIW GjOSQeJt738Ey/5CbDlxIAb4Xc4E9EJg4WaB8XZs25VG4MFZToKtU4eCr5OKT0Emkgu2 bRhU7wtqr6fczpiA9NYzenUDKwAqFZsIh2EqGFJya6OlYxNelaWAb4VJirQnRDIjgvJz tW6kZ0PIPjdwxPiKf8nM4+U4h8UcRFxVsxj6ZijA1XRlVmo7dwn56DJRtHvFj3Df9R+o GoHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0Nc8381KvCAKtcJgWAO7GB/O/Xk1BB4fgkOydTh0/AI=; b=UuUVOCzmUOcFWIasHi4SIicwGD8f/6mehURWo2As+qIuDJDZl5coDwsiVYQbLJoaPt A7K63iidBFDhNleScgBqrgXzdKKEUb43a+0zC4b3MDBRlSBXxqb7oxhWbMDCRMPJmCmz T750Wb9uvrcRl6bEauzIEJrESm0Y6fPzKyyv19jMIlIhM59k6qQ2K6UqtOS7rJel5ij3 H/OTCwe9jxefxE289Fem56HZXPYEx5WD5rs/ezOv3k56rDiRea3i+e4W2tUDBwtxYok3 qsjmG26LzXttTVYDXsCDNLILMd3/jqihQFGXo1/Dcu7f7Fc3/+lTy+Q7fZTggrgYxyuo aGXQ== X-Gm-Message-State: AJIora8tcVNR00zU1xgyyN7n3aSx2c4My+UMVaF0tIikFRCFLQ0oehPF ib0oKRsm96LeuX4/Oi+m8/I= X-Google-Smtp-Source: AGRyM1tFf+CulgVeCTNfyuNvXrdRKrkTWDpy6Txt0S7v/Z3TVNPdJbCbHmpTI0QHSeYHEdPY7PcMag== X-Received: by 2002:a05:6a00:3006:b0:52a:ca34:7e43 with SMTP id ay6-20020a056a00300600b0052aca347e43mr18747989pfb.10.1658857837752; Tue, 26 Jul 2022 10:50:37 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id ne16-20020a17090b375000b001f3009a5ccfsm708098pjb.54.2022.07.26.10.50.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:36 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 08/15] drm/msm/gem: Remove active refcnt Date: Tue, 26 Jul 2022 10:50:32 -0700 Message-Id: <20220726175043.1027731-9-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark At this point the pinned refcnt is sufficient, and the shrinker is already prepared to encounter objects which are still active according to fences attached to the resv. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem.c | 45 ++-------------------------- drivers/gpu/drm/msm/msm_gem.h | 14 ++------- drivers/gpu/drm/msm/msm_gem_submit.c | 22 ++------------ 3 files changed, 8 insertions(+), 73 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 407b18a24dc4..209438744bab 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -734,8 +734,7 @@ int msm_gem_madvise(struct drm_gem_object *obj, unsigne= d madv) /* If the obj is inactive, we might need to move it * between inactive lists */ - if (msm_obj->active_count =3D=3D 0) - update_lru(obj); + update_lru(obj); =20 msm_gem_unlock(obj); =20 @@ -788,7 +787,6 @@ void msm_gem_evict(struct drm_gem_object *obj) GEM_WARN_ON(!msm_gem_is_locked(obj)); GEM_WARN_ON(is_unevictable(msm_obj)); GEM_WARN_ON(!msm_obj->evictable); - GEM_WARN_ON(msm_obj->active_count); =20 /* Get rid of any iommu mapping(s): */ put_iova_spaces(obj, false); @@ -813,37 +811,6 @@ void msm_gem_vunmap(struct drm_gem_object *obj) msm_obj->vaddr =3D NULL; } =20 -void msm_gem_active_get(struct drm_gem_object *obj, struct msm_gpu *gpu) -{ - struct msm_gem_object *msm_obj =3D to_msm_bo(obj); - struct msm_drm_private *priv =3D obj->dev->dev_private; - - might_sleep(); - GEM_WARN_ON(!msm_gem_is_locked(obj)); - GEM_WARN_ON(msm_obj->madv !=3D MSM_MADV_WILLNEED); - GEM_WARN_ON(msm_obj->dontneed); - - if (msm_obj->active_count++ =3D=3D 0) { - mutex_lock(&priv->mm_lock); - if (msm_obj->evictable) - mark_unevictable(msm_obj); - list_move_tail(&msm_obj->mm_list, &gpu->active_list); - mutex_unlock(&priv->mm_lock); - } -} - -void msm_gem_active_put(struct drm_gem_object *obj) -{ - struct msm_gem_object *msm_obj =3D to_msm_bo(obj); - - might_sleep(); - GEM_WARN_ON(!msm_gem_is_locked(obj)); - - if (--msm_obj->active_count =3D=3D 0) { - update_lru(obj); - } -} - static void update_lru(struct drm_gem_object *obj) { struct msm_drm_private *priv =3D obj->dev->dev_private; @@ -851,9 +818,6 @@ static void update_lru(struct drm_gem_object *obj) =20 GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base)); =20 - if (msm_obj->active_count !=3D 0) - return; - mutex_lock(&priv->mm_lock); =20 if (msm_obj->dontneed) @@ -926,7 +890,7 @@ void msm_gem_describe(struct drm_gem_object *obj, struc= t seq_file *m, stats->all.count++; stats->all.size +=3D obj->size; =20 - if (is_active(msm_obj)) { + if (msm_gem_active(obj)) { stats->active.count++; stats->active.size +=3D obj->size; } @@ -954,7 +918,7 @@ void msm_gem_describe(struct drm_gem_object *obj, struc= t seq_file *m, } =20 seq_printf(m, "%08x: %c %2d (%2d) %08llx %p", - msm_obj->flags, is_active(msm_obj) ? 'A' : 'I', + msm_obj->flags, msm_gem_active(obj) ? 'A' : 'I', obj->name, kref_read(&obj->refcount), off, msm_obj->vaddr); =20 @@ -1037,9 +1001,6 @@ static void msm_gem_free_object(struct drm_gem_object= *obj) list_del(&msm_obj->mm_list); mutex_unlock(&priv->mm_lock); =20 - /* object should not be on active list: */ - GEM_WARN_ON(is_active(msm_obj)); - put_iova_spaces(obj, true); =20 if (obj->import_attach) { diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h index 6fe521ccda45..420ba49bf21a 100644 --- a/drivers/gpu/drm/msm/msm_gem.h +++ b/drivers/gpu/drm/msm/msm_gem.h @@ -138,7 +138,6 @@ struct msm_gem_object { =20 char name[32]; /* Identifier to print for the debugfs files */ =20 - int active_count; int pin_count; }; #define to_msm_bo(x) container_of(x, struct msm_gem_object, base) @@ -171,8 +170,6 @@ void *msm_gem_get_vaddr_active(struct drm_gem_object *o= bj); void msm_gem_put_vaddr_locked(struct drm_gem_object *obj); void msm_gem_put_vaddr(struct drm_gem_object *obj); int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv); -void msm_gem_active_get(struct drm_gem_object *obj, struct msm_gpu *gpu); -void msm_gem_active_put(struct drm_gem_object *obj); bool msm_gem_active(struct drm_gem_object *obj); int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *tim= eout); int msm_gem_cpu_fini(struct drm_gem_object *obj); @@ -245,12 +242,6 @@ msm_gem_is_locked(struct drm_gem_object *obj) return dma_resv_is_locked(obj->resv) || (kref_read(&obj->refcount) =3D=3D= 0); } =20 -static inline bool is_active(struct msm_gem_object *msm_obj) -{ - GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base)); - return msm_obj->active_count; -} - /* imported/exported objects are not purgeable: */ static inline bool is_unpurgeable(struct msm_gem_object *msm_obj) { @@ -391,9 +382,8 @@ struct msm_gem_submit { /* make sure these don't conflict w/ MSM_SUBMIT_BO_x */ #define BO_VALID 0x8000 /* is current addr in cmdstream correct/valid? */ #define BO_LOCKED 0x4000 /* obj lock is held */ -#define BO_ACTIVE 0x2000 /* active refcnt is held */ -#define BO_OBJ_PINNED 0x1000 /* obj (pages) is pinned and on active list */ -#define BO_VMA_PINNED 0x0800 /* vma (virtual address) is pinned */ +#define BO_OBJ_PINNED 0x2000 /* obj (pages) is pinned and on active list */ +#define BO_VMA_PINNED 0x1000 /* vma (virtual address) is pinned */ uint32_t flags; union { struct msm_gem_object *obj; diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm= _gem_submit.c index 16c662808522..adf358fb8e9d 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -243,17 +243,13 @@ static void submit_cleanup_bo(struct msm_gem_submit *= submit, int i, if (flags & BO_OBJ_PINNED) msm_gem_unpin_locked(obj); =20 - if (flags & BO_ACTIVE) - msm_gem_active_put(obj); - if (flags & BO_LOCKED) dma_resv_unlock(obj->resv); } =20 static void submit_unlock_unpin_bo(struct msm_gem_submit *submit, int i) { - unsigned cleanup_flags =3D BO_VMA_PINNED | BO_OBJ_PINNED | - BO_ACTIVE | BO_LOCKED; + unsigned cleanup_flags =3D BO_VMA_PINNED | BO_OBJ_PINNED | BO_LOCKED; submit_cleanup_bo(submit, i, cleanup_flags); =20 if (!(submit->bos[i].flags & BO_VALID)) @@ -358,18 +354,6 @@ static int submit_pin_objects(struct msm_gem_submit *s= ubmit) =20 submit->valid =3D true; =20 - /* - * Increment active_count first, so if under memory pressure, we - * don't inadvertently evict a bo needed by the submit in order - * to pin an earlier bo in the same submit. - */ - for (i =3D 0; i < submit->nr_bos; i++) { - struct drm_gem_object *obj =3D &submit->bos[i].obj->base; - - msm_gem_active_get(obj, submit->gpu); - submit->bos[i].flags |=3D BO_ACTIVE; - } - for (i =3D 0; i < submit->nr_bos; i++) { struct drm_gem_object *obj =3D &submit->bos[i].obj->base; struct msm_gem_vma *vma; @@ -521,7 +505,7 @@ static void submit_cleanup(struct msm_gem_submit *submi= t, bool error) unsigned i; =20 if (error) - cleanup_flags |=3D BO_VMA_PINNED | BO_OBJ_PINNED | BO_ACTIVE; + cleanup_flags |=3D BO_VMA_PINNED | BO_OBJ_PINNED; =20 for (i =3D 0; i < submit->nr_bos; i++) { struct msm_gem_object *msm_obj =3D submit->bos[i].obj; @@ -540,7 +524,7 @@ void msm_submit_retire(struct msm_gem_submit *submit) =20 msm_gem_lock(obj); /* Note, VMA already fence-unpinned before submit: */ - submit_cleanup_bo(submit, i, BO_OBJ_PINNED | BO_ACTIVE); + submit_cleanup_bo(submit, i, BO_OBJ_PINNED); msm_gem_unlock(obj); drm_gem_object_put(obj); } --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 95274C19F29 for ; Tue, 26 Jul 2022 17:51:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239593AbiGZRvW (ORCPT ); Tue, 26 Jul 2022 13:51:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239770AbiGZRut (ORCPT ); Tue, 26 Jul 2022 13:50:49 -0400 Received: from mail-pf1-x429.google.com (mail-pf1-x429.google.com [IPv6:2607:f8b0:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 514CD30547; Tue, 26 Jul 2022 10:50:41 -0700 (PDT) Received: by mail-pf1-x429.google.com with SMTP id w205so10539078pfc.8; Tue, 26 Jul 2022 10:50:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=U846p3xo+1d02tXgmQbx7VHsQitXar7JD/0ho5uYEv8=; b=CJcojqB4YzxNFXWwWIMbEHrBT2UEFC8IbOP8IlYypKP7MOfBqRCYBFe0RH0C8aa1vs m1zqovck2uuUCSQF5PdrFzZI+qj/l611PsaaY/aptNavTMXI4OZj7Xp27DNzx1Rtbbcd qZwGimKlZf8DBgWObgjzoR/F/8jlupYHraM+RD5IBVh8x+7UEHiB7wv4uP2P7YUv0VAY Bg49fasGI8sXtoJMApp2jfhDockmKm2lxhAbVSpYB8gj8gdE6PEEaU2KDSHyv0POm+f2 653o7eKaJEv7oK2LkOE7/mbsAluvWw9lGdjy4MUTwRd3T/Zn4rg4FnEKxghBk+3xKn3C PzQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=U846p3xo+1d02tXgmQbx7VHsQitXar7JD/0ho5uYEv8=; b=y6fU/8aGfbqqauwudywR+7frNzdbdJYanyqBcxK01ZavzdltXdxi2keZCUOE0itRu7 qvZPSr2NbYi0F5J0bZwt71sgJZl7pkcmhtUP2pF5BMcA4R/rM8fc2CsFPKPyKg6h1bQC wEeO0kuejt55MFZcgi/cxyOm29ZF2Y8ALAK++3UiJnI36mn8BQQUWxu0mRW6fIfNGiej zTXw5Ew9hypBH60tBDFlmPUGnoflsfNmvUnNg7a0QUxG2KOIA0Ruia2sdB1QYLbOg3RO Wfz9i+QZjIkGWDJz/cV3BjXMegOTbSRrbEw/GoUcrrS7VfismStrNI9fVaDSW8WaviuM B9gQ== X-Gm-Message-State: AJIora+vawAa6pStMKOFNr9s9euf5SV0R55GjgffSjpP2Iz7pNyx9LVC urt8FBql3ZBtI3F6qILcYP0= X-Google-Smtp-Source: AGRyM1sVPimc6a3NKpX1iuF0RKDyWE6zPQ5GBdK5fgId0QCqGwNiYOt30+GzPdxsaMCyuLtNrKcLBw== X-Received: by 2002:aa7:82ca:0:b0:51b:cf43:d00a with SMTP id f10-20020aa782ca000000b0051bcf43d00amr18339481pfn.58.1658857840672; Tue, 26 Jul 2022 10:50:40 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id b14-20020a631b4e000000b004088f213f68sm719018pgm.56.2022.07.26.10.50.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:39 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Daniel Vetter , Thomas Zimmermann , Dmitry Osipenko , Maarten Lankhorst , Maxime Ripard , David Airlie , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 09/15] drm/gem: Add LRU/shrinker helper Date: Tue, 26 Jul 2022 10:50:33 -0700 Message-Id: <20220726175043.1027731-10-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Add a simple LRU helper to assist with driver's shrinker implementation. It handles tracking the number of backing pages associated with a given LRU, and provides a helper to implement shrinker_scan. A driver can use multiple LRU instances to track objects in various states, for example a dontneed LRU for purgeable objects, a willneed LRU for evictable objects, and an unpinned LRU for objects without backing pages. All LRUs that the object can be moved between must share a single lock. v2: lockdep_assert_held() instead of WARN_ON(!mutex_is_locked()) Cc: Daniel Vetter Cc: Thomas Zimmermann Cc: Dmitry Osipenko Signed-off-by: Rob Clark Reviewed-by: Dmitry Osipenko --- drivers/gpu/drm/drm_gem.c | 183 ++++++++++++++++++++++++++++++++++++++ include/drm/drm_gem.h | 56 ++++++++++++ 2 files changed, 239 insertions(+) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index eb0c2d041f13..f0526aaf013a 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -165,6 +165,7 @@ void drm_gem_private_object_init(struct drm_device *dev, obj->resv =3D &obj->_resv; =20 drm_vma_node_reset(&obj->vma_node); + INIT_LIST_HEAD(&obj->lru_node); } EXPORT_SYMBOL(drm_gem_private_object_init); =20 @@ -951,6 +952,7 @@ drm_gem_object_release(struct drm_gem_object *obj) =20 dma_resv_fini(&obj->_resv); drm_gem_free_mmap_offset(obj); + drm_gem_lru_remove(obj); } EXPORT_SYMBOL(drm_gem_object_release); =20 @@ -1274,3 +1276,184 @@ drm_gem_unlock_reservations(struct drm_gem_object *= *objs, int count, ww_acquire_fini(acquire_ctx); } EXPORT_SYMBOL(drm_gem_unlock_reservations); + +/** + * drm_gem_lru_init - initialize a LRU + * + * @lru: The LRU to initialize + * @lock: The lock protecting the LRU + */ +void +drm_gem_lru_init(struct drm_gem_lru *lru, struct mutex *lock) +{ + lru->lock =3D lock; + lru->count =3D 0; + INIT_LIST_HEAD(&lru->list); +} +EXPORT_SYMBOL(drm_gem_lru_init); + +static void +lru_remove(struct drm_gem_object *obj) +{ + obj->lru->count -=3D obj->size >> PAGE_SHIFT; + WARN_ON(obj->lru->count < 0); + list_del(&obj->lru_node); + obj->lru =3D NULL; +} + +/** + * drm_gem_lru_remove - remove object from whatever LRU it is in + * + * If the object is currently in any LRU, remove it. + * + * @obj: The GEM object to remove from current LRU + */ +void +drm_gem_lru_remove(struct drm_gem_object *obj) +{ + struct drm_gem_lru *lru =3D obj->lru; + + if (!lru) + return; + + mutex_lock(lru->lock); + lru_remove(obj); + mutex_unlock(lru->lock); +} +EXPORT_SYMBOL(drm_gem_lru_remove); + +/** + * drm_gem_lru_move_tail - move the object to the tail of the LRU + * + * If the object is already in this LRU it will be moved to the + * tail. Otherwise it will be removed from whichever other LRU + * it is in (if any) and moved into this LRU. + * + * @lru: The LRU to move the object into. + * @obj: The GEM object to move into this LRU + */ +void +drm_gem_lru_move_tail(struct drm_gem_lru *lru, struct drm_gem_object *obj) +{ + mutex_lock(lru->lock); + drm_gem_lru_move_tail_locked(lru, obj); + mutex_unlock(lru->lock); +} +EXPORT_SYMBOL(drm_gem_lru_move_tail); + +/** + * drm_gem_lru_move_tail_locked - move the object to the tail of the LRU + * + * If the object is already in this LRU it will be moved to the + * tail. Otherwise it will be removed from whichever other LRU + * it is in (if any) and moved into this LRU. + * + * Call with LRU lock held. + * + * @lru: The LRU to move the object into. + * @obj: The GEM object to move into this LRU + */ +void +drm_gem_lru_move_tail_locked(struct drm_gem_lru *lru, struct drm_gem_objec= t *obj) +{ + lockdep_assert_held_once(lru->lock); + + if (obj->lru) + lru_remove(obj); + + lru->count +=3D obj->size >> PAGE_SHIFT; + list_add_tail(&obj->lru_node, &lru->list); + obj->lru =3D lru; +} +EXPORT_SYMBOL(drm_gem_lru_move_tail_locked); + +/** + * drm_gem_lru_scan - helper to implement shrinker.scan_objects + * + * If the shrink callback succeeds, it is expected that the driver + * move the object out of this LRU. + * + * If the LRU possibly contain active buffers, it is the responsibility + * of the shrink callback to check for this (ie. dma_resv_test_signaled()) + * or if necessary block until the buffer becomes idle. + * + * @lru: The LRU to scan + * @nr_to_scan: The number of pages to try to reclaim + * @shrink: Callback to try to shrink/reclaim the object. + */ +unsigned long +drm_gem_lru_scan(struct drm_gem_lru *lru, unsigned nr_to_scan, + bool (*shrink)(struct drm_gem_object *obj)) +{ + struct drm_gem_lru still_in_lru; + struct drm_gem_object *obj; + unsigned freed =3D 0; + + drm_gem_lru_init(&still_in_lru, lru->lock); + + mutex_lock(lru->lock); + + while (freed < nr_to_scan) { + obj =3D list_first_entry_or_null(&lru->list, typeof(*obj), lru_node); + + if (!obj) + break; + + drm_gem_lru_move_tail_locked(&still_in_lru, obj); + + /* + * If it's in the process of being freed, gem_object->free() + * may be blocked on lock waiting to remove it. So just + * skip it. + */ + if (!kref_get_unless_zero(&obj->refcount)) + continue; + + /* + * Now that we own a reference, we can drop the lock for the + * rest of the loop body, to reduce contention with other + * code paths that need the LRU lock + */ + mutex_unlock(lru->lock); + + /* + * Note that this still needs to be trylock, since we can + * hit shrinker in response to trying to get backing pages + * for this obj (ie. while it's lock is already held) + */ + if (!dma_resv_trylock(obj->resv)) + goto tail; + + if (shrink(obj)) { + freed +=3D obj->size >> PAGE_SHIFT; + + /* + * If we succeeded in releasing the object's backing + * pages, we expect the driver to have moved the object + * out of this LRU + */ + WARN_ON(obj->lru =3D=3D &still_in_lru); + WARN_ON(obj->lru =3D=3D lru); + } + + dma_resv_unlock(obj->resv); + +tail: + drm_gem_object_put(obj); + mutex_lock(lru->lock); + } + + /* + * Move objects we've skipped over out of the temporary still_in_lru + * back into this LRU + */ + list_for_each_entry (obj, &still_in_lru.list, lru_node) + obj->lru =3D lru; + list_splice_tail(&still_in_lru.list, &lru->list); + lru->count +=3D still_in_lru.count; + + mutex_unlock(lru->lock); + + return freed; +} +EXPORT_SYMBOL(drm_gem_lru_scan); diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 87cffc9efa85..f13a9080af37 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -174,6 +174,41 @@ struct drm_gem_object_funcs { const struct vm_operations_struct *vm_ops; }; =20 +/** + * struct drm_gem_lru - A simple LRU helper + * + * A helper for tracking GEM objects in a given state, to aid in + * driver's shrinker implementation. Tracks the count of pages + * for lockless &shrinker.count_objects, and provides + * &drm_gem_lru_scan for driver's &shrinker.scan_objects + * implementation. + */ +struct drm_gem_lru { + /** + * @lock: + * + * Lock protecting movement of GEM objects between LRUs. All + * LRUs that the object can move between should be protected + * by the same lock. + */ + struct mutex *lock; + + /** + * @count: + * + * The total number of backing pages of the GEM objects in + * this LRU. + */ + long count; + + /** + * @list: + * + * The LRU list. + */ + struct list_head list; +}; + /** * struct drm_gem_object - GEM buffer object * @@ -312,6 +347,20 @@ struct drm_gem_object { * */ const struct drm_gem_object_funcs *funcs; + + /** + * @lru_node: + * + * List node in a &drm_gem_lru. + */ + struct list_head lru_node; + + /** + * @lru: + * + * The current LRU list that the GEM object is on. + */ + struct drm_gem_lru *lru; }; =20 /** @@ -420,4 +469,11 @@ void drm_gem_unlock_reservations(struct drm_gem_object= **objs, int count, int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, u32 handle, u64 *offset); =20 +void drm_gem_lru_init(struct drm_gem_lru *lru, struct mutex *lock); +void drm_gem_lru_remove(struct drm_gem_object *obj); +void drm_gem_lru_move_tail(struct drm_gem_lru *lru, struct drm_gem_object = *obj); +void drm_gem_lru_move_tail_locked(struct drm_gem_lru *lru, struct drm_gem_= object *obj); +unsigned long drm_gem_lru_scan(struct drm_gem_lru *lru, unsigned nr_to_sca= n, + bool (*shrink)(struct drm_gem_object *obj)); + #endif /* __DRM_GEM_H__ */ --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C181C00144 for ; Tue, 26 Jul 2022 17:51:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239706AbiGZRvZ (ORCPT ); Tue, 26 Jul 2022 13:51:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44948 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239780AbiGZRuu (ORCPT ); Tue, 26 Jul 2022 13:50:50 -0400 Received: from mail-pj1-x1036.google.com (mail-pj1-x1036.google.com [IPv6:2607:f8b0:4864:20::1036]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 268773122A; Tue, 26 Jul 2022 10:50:44 -0700 (PDT) Received: by mail-pj1-x1036.google.com with SMTP id t2-20020a17090a4e4200b001f21572f3a4so13992478pjl.0; Tue, 26 Jul 2022 10:50:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zh/8/t0ZilHENXdeKCjYIuWBV3SQcdEuA5JHSYImukA=; b=GTpKK3lqBw/NyWp1oej+ZaKevc2p+WLuV12ibvug7cil20GX79xnP0Sm3mcGHj6UK4 NpsrO/uapZbqeEBSSjpgzqkDVgswZa9ZKPfKA/ykGpUscs9w1Q2W4Ed5wanrOXsa/bwN cidEc17FxreFh/oX15q6N0B9f65a2P9iBkYtAuAlopbygbFwuzpD7wS+8ZIUikGwjRO7 Y6XW2GAYGciK/QRWF7ut4F2TLAm2zGCCu8QKnzZUIVOkIIn3hLOoqmq9+6VqlalDogmT SzgbzR9Gy/8vTPObGJWVkeIouclGFtF1K64bqo+3eyB9CorDVfU/rmSQZLS1ld8LzScu gmiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zh/8/t0ZilHENXdeKCjYIuWBV3SQcdEuA5JHSYImukA=; b=m+/JCJwTq1iMeWuMguxAQ2oBPUYHcvER1PNEN3wPVQ9Vepy1h3qwjKjTtjBBvLWW6w v+NAbXGXNMBohaJ90D9yaWbg/RtxJmtBu5O0AacjOTbaoE5et+JbXsuoTn+tP4GHFF0D en+WrsGgssV2NB5CoZvzUyVolnyvvUjdAOk3SfBtLrCmCTfmYalMIf08n0wLQSzUqkey gSK7gmZeq9vLZ/4Icea3T7kCbDlqCfNK3qJseGCVa4iAbu53LfBX57yEteV83d9sThS8 kEO6Cblw7ljkdK52a0vpY0FgavwtFP4V58Tu8l+33SdbMffVk0ABhoxXlKtdG03qjFxe /9vA== X-Gm-Message-State: AJIora+sSY6bfwnqNVl5wL+/a4zCPZcIfpUXTPdHUJ6Qlo31J4qFK0z5 DsoWN6NMwTQrW0kBevEykzY= X-Google-Smtp-Source: AGRyM1vUGZPuyGo3rWK8Yx9V4De98KUa7GuDrr7D0ohtXU67vembzqE9MIKZwTEqNkLZEHfDS4TgKQ== X-Received: by 2002:a17:90b:805:b0:1f2:2fb1:e48b with SMTP id bk5-20020a17090b080500b001f22fb1e48bmr367457pjb.4.1658857843548; Tue, 26 Jul 2022 10:50:43 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id f16-20020a170902ab9000b0016d2d2c7df1sm11832171plr.188.2022.07.26.10.50.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:42 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 10/15] drm/msm/gem: Convert to using drm_gem_lru Date: Tue, 26 Jul 2022 10:50:34 -0700 Message-Id: <20220726175043.1027731-11-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark This converts over to use the shared GEM LRU/shrinker helpers. Note that it means we are no longer tracking purgeable or willneed buffers that are active separately. But the most recently pinned buffers should be at the tail of the various LRUs, and the shrinker is already prepared to encounter objects which are still active. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_drv.c | 14 +-- drivers/gpu/drm/msm/msm_drv.h | 70 +++++++++++---- drivers/gpu/drm/msm/msm_gem.c | 58 ++++-------- drivers/gpu/drm/msm/msm_gem.h | 93 -------------------- drivers/gpu/drm/msm/msm_gem_shrinker.c | 117 ++++++------------------- drivers/gpu/drm/msm/msm_gpu.c | 3 - drivers/gpu/drm/msm/msm_gpu.h | 6 -- 7 files changed, 104 insertions(+), 257 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index d7ca025457b6..1ca4a92ba96e 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -418,14 +418,18 @@ static int msm_drm_init(struct device *dev, const str= uct drm_driver *drv) INIT_LIST_HEAD(&priv->objects); mutex_init(&priv->obj_lock); =20 - INIT_LIST_HEAD(&priv->inactive_willneed); - INIT_LIST_HEAD(&priv->inactive_dontneed); - INIT_LIST_HEAD(&priv->inactive_unpinned); - mutex_init(&priv->mm_lock); + /* + * Initialize the LRUs: + */ + mutex_init(&priv->lru.lock); + drm_gem_lru_init(&priv->lru.unbacked, &priv->lru.lock); + drm_gem_lru_init(&priv->lru.pinned, &priv->lru.lock); + drm_gem_lru_init(&priv->lru.willneed, &priv->lru.lock); + drm_gem_lru_init(&priv->lru.dontneed, &priv->lru.lock); =20 /* Teach lockdep about lock ordering wrt. shrinker: */ fs_reclaim_acquire(GFP_KERNEL); - might_lock(&priv->mm_lock); + might_lock(&priv->lru.lock); fs_reclaim_release(GFP_KERNEL); =20 drm_mode_config_init(ddev); diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index b3689a2d27d7..208ae5bc5e6b 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h @@ -142,28 +142,60 @@ struct msm_drm_private { struct mutex obj_lock; =20 /** - * LRUs of inactive GEM objects. Every bo is either in one of the - * inactive lists (depending on whether or not it is shrinkable) or - * gpu->active_list (for the gpu it is active on[1]), or transiently - * on a temporary list as the shrinker is running. + * lru: * - * Note that inactive_willneed also contains pinned and vmap'd bos, - * but the number of pinned-but-not-active objects is small (scanout - * buffers, ringbuffer, etc). + * The various LRU's that a GEM object is in at various stages of + * it's lifetime. Objects start out in the unbacked LRU. When + * pinned (for scannout or permanently mapped GPU buffers, like + * ringbuffer, memptr, fw, etc) it moves to the pinned LRU. When + * unpinned, it moves into willneed or dontneed LRU depending on + * madvise state. When backing pages are evicted (willneed) or + * purged (dontneed) it moves back into the unbacked LRU. * - * These lists are protected by mm_lock (which should be acquired - * before per GEM object lock). One should *not* hold mm_lock in - * get_pages()/vmap()/etc paths, as they can trigger the shrinker. - * - * [1] if someone ever added support for the old 2d cores, there could be - * more than one gpu object + * The dontneed LRU is considered by the shrinker for objects + * that are candidate for purging, and the willneed LRU is + * considered for objects that could be evicted. */ - struct list_head inactive_willneed; /* inactive + potentially unpin/evic= table */ - struct list_head inactive_dontneed; /* inactive + shrinkable */ - struct list_head inactive_unpinned; /* inactive + purged or unpinned */ - long shrinkable_count; /* write access under mm_lock */ - long evictable_count; /* write access under mm_lock */ - struct mutex mm_lock; + struct { + /** + * unbacked: + * + * The LRU for GEM objects without backing pages allocated. + * This mostly exists so that objects are always is one + * LRU. + */ + struct drm_gem_lru unbacked; + + /** + * pinned: + * + * The LRU for pinned GEM objects + */ + struct drm_gem_lru pinned; + + /** + * willneed: + * + * The LRU for unpinned GEM objects which are in madvise + * WILLNEED state (ie. can be evicted) + */ + struct drm_gem_lru willneed; + + /** + * dontneed: + * + * The LRU for unpinned GEM objects which are in madvise + * DONTNEED state (ie. can be purged) + */ + struct drm_gem_lru dontneed; + + /** + * lock: + * + * Protects manipulation of all of the LRUs. + */ + struct mutex lock; + } lru; =20 struct workqueue_struct *wq; =20 diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 209438744bab..d4e8af46f4ef 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -174,6 +174,7 @@ static void put_pages(struct drm_gem_object *obj) put_pages_vram(obj); =20 msm_obj->pages =3D NULL; + update_lru(obj); } } =20 @@ -210,8 +211,6 @@ struct page **msm_gem_pin_pages(struct drm_gem_object *= obj) =20 void msm_gem_unpin_pages(struct drm_gem_object *obj) { - struct msm_gem_object *msm_obj =3D to_msm_bo(obj); - msm_gem_lock(obj); msm_gem_unpin_locked(obj); msm_gem_unlock(obj); @@ -761,7 +760,6 @@ void msm_gem_purge(struct drm_gem_object *obj) put_iova_vmas(obj); =20 msm_obj->madv =3D __MSM_MADV_PURGED; - update_lru(obj); =20 drm_gem_free_mmap_offset(obj); =20 @@ -786,7 +784,6 @@ void msm_gem_evict(struct drm_gem_object *obj) =20 GEM_WARN_ON(!msm_gem_is_locked(obj)); GEM_WARN_ON(is_unevictable(msm_obj)); - GEM_WARN_ON(!msm_obj->evictable); =20 /* Get rid of any iommu mapping(s): */ put_iova_spaces(obj, false); @@ -794,8 +791,6 @@ void msm_gem_evict(struct drm_gem_object *obj) drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping); =20 put_pages(obj); - - update_lru(obj); } =20 void msm_gem_vunmap(struct drm_gem_object *obj) @@ -818,26 +813,20 @@ static void update_lru(struct drm_gem_object *obj) =20 GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base)); =20 - mutex_lock(&priv->mm_lock); - - if (msm_obj->dontneed) - mark_unpurgeable(msm_obj); - if (msm_obj->evictable) - mark_unevictable(msm_obj); - - list_del(&msm_obj->mm_list); - if ((msm_obj->madv =3D=3D MSM_MADV_WILLNEED) && msm_obj->sgt) { - list_add_tail(&msm_obj->mm_list, &priv->inactive_willneed); - mark_evictable(msm_obj); - } else if (msm_obj->madv =3D=3D MSM_MADV_DONTNEED) { - list_add_tail(&msm_obj->mm_list, &priv->inactive_dontneed); - mark_purgeable(msm_obj); + if (!msm_obj->pages) { + GEM_WARN_ON(msm_obj->pin_count); + GEM_WARN_ON(msm_obj->vmap_count); + + drm_gem_lru_move_tail(&priv->lru.unbacked, obj); + } else if (msm_obj->pin_count || msm_obj->vmap_count) { + drm_gem_lru_move_tail(&priv->lru.pinned, obj); + } else if (msm_obj->madv =3D=3D MSM_MADV_WILLNEED) { + drm_gem_lru_move_tail(&priv->lru.willneed, obj); } else { - GEM_WARN_ON((msm_obj->madv !=3D __MSM_MADV_PURGED) && msm_obj->sgt); - list_add_tail(&msm_obj->mm_list, &priv->inactive_unpinned); - } + GEM_WARN_ON(msm_obj->madv !=3D MSM_MADV_DONTNEED); =20 - mutex_unlock(&priv->mm_lock); + drm_gem_lru_move_tail(&priv->lru.dontneed, obj); + } } =20 bool msm_gem_active(struct drm_gem_object *obj) @@ -995,12 +984,6 @@ static void msm_gem_free_object(struct drm_gem_object = *obj) list_del(&msm_obj->node); mutex_unlock(&priv->obj_lock); =20 - mutex_lock(&priv->mm_lock); - if (msm_obj->dontneed) - mark_unpurgeable(msm_obj); - list_del(&msm_obj->mm_list); - mutex_unlock(&priv->mm_lock); - put_iova_spaces(obj, true); =20 if (obj->import_attach) { @@ -1160,13 +1143,6 @@ struct drm_gem_object *msm_gem_new(struct drm_device= *dev, uint32_t size, uint32 =20 to_msm_bo(obj)->vram_node =3D &vma->node; =20 - /* Call chain get_pages() -> update_inactive() tries to - * access msm_obj->mm_list, but it is not initialized yet. - * To avoid NULL pointer dereference error, initialize - * mm_list to be empty. - */ - INIT_LIST_HEAD(&msm_obj->mm_list); - msm_gem_lock(obj); pages =3D get_pages(obj); msm_gem_unlock(obj); @@ -1189,9 +1165,7 @@ struct drm_gem_object *msm_gem_new(struct drm_device = *dev, uint32_t size, uint32 mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER); } =20 - mutex_lock(&priv->mm_lock); - list_add_tail(&msm_obj->mm_list, &priv->inactive_unpinned); - mutex_unlock(&priv->mm_lock); + drm_gem_lru_move_tail(&priv->lru.unbacked, obj); =20 mutex_lock(&priv->obj_lock); list_add_tail(&msm_obj->node, &priv->objects); @@ -1247,9 +1221,7 @@ struct drm_gem_object *msm_gem_import(struct drm_devi= ce *dev, =20 msm_gem_unlock(obj); =20 - mutex_lock(&priv->mm_lock); - list_add_tail(&msm_obj->mm_list, &priv->inactive_unpinned); - mutex_unlock(&priv->mm_lock); + drm_gem_lru_move_tail(&priv->lru.pinned, obj); =20 mutex_lock(&priv->obj_lock); list_add_tail(&msm_obj->node, &priv->objects); diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h index 420ba49bf21a..0403b27ff779 100644 --- a/drivers/gpu/drm/msm/msm_gem.h +++ b/drivers/gpu/drm/msm/msm_gem.h @@ -93,16 +93,6 @@ struct msm_gem_object { */ uint8_t madv; =20 - /** - * Is object on inactive_dontneed list (ie. counted in priv->shrinkable_c= ount)? - */ - bool dontneed : 1; - - /** - * Is object evictable (ie. counted in priv->evictable_count)? - */ - bool evictable : 1; - /** * count of active vmap'ing */ @@ -114,17 +104,6 @@ struct msm_gem_object { */ struct list_head node; =20 - /** - * An object is either: - * inactive - on priv->inactive_dontneed or priv->inactive_willneed - * (depending on purgeability status) - * active - on one one of the gpu's active_list.. well, at - * least for now we don't have (I don't think) hw sync between - * 2d and 3d one devices which have both, meaning we need to - * block on submit if a bo is already on other ring - */ - struct list_head mm_list; - struct page **pages; struct sg_table *sgt; void *vaddr; @@ -206,12 +185,6 @@ msm_gem_lock(struct drm_gem_object *obj) dma_resv_lock(obj->resv, NULL); } =20 -static inline bool __must_check -msm_gem_trylock(struct drm_gem_object *obj) -{ - return dma_resv_trylock(obj->resv); -} - static inline int msm_gem_lock_interruptible(struct drm_gem_object *obj) { @@ -260,77 +233,11 @@ static inline bool is_vunmapable(struct msm_gem_objec= t *msm_obj) return (msm_obj->vmap_count =3D=3D 0) && msm_obj->vaddr; } =20 -static inline void mark_purgeable(struct msm_gem_object *msm_obj) -{ - struct msm_drm_private *priv =3D msm_obj->base.dev->dev_private; - - GEM_WARN_ON(!mutex_is_locked(&priv->mm_lock)); - - if (is_unpurgeable(msm_obj)) - return; - - if (GEM_WARN_ON(msm_obj->dontneed)) - return; - - priv->shrinkable_count +=3D msm_obj->base.size >> PAGE_SHIFT; - msm_obj->dontneed =3D true; -} - -static inline void mark_unpurgeable(struct msm_gem_object *msm_obj) -{ - struct msm_drm_private *priv =3D msm_obj->base.dev->dev_private; - - GEM_WARN_ON(!mutex_is_locked(&priv->mm_lock)); - - if (is_unpurgeable(msm_obj)) - return; - - if (GEM_WARN_ON(!msm_obj->dontneed)) - return; - - priv->shrinkable_count -=3D msm_obj->base.size >> PAGE_SHIFT; - GEM_WARN_ON(priv->shrinkable_count < 0); - msm_obj->dontneed =3D false; -} - static inline bool is_unevictable(struct msm_gem_object *msm_obj) { return is_unpurgeable(msm_obj) || msm_obj->vaddr; } =20 -static inline void mark_evictable(struct msm_gem_object *msm_obj) -{ - struct msm_drm_private *priv =3D msm_obj->base.dev->dev_private; - - WARN_ON(!mutex_is_locked(&priv->mm_lock)); - - if (is_unevictable(msm_obj)) - return; - - if (WARN_ON(msm_obj->evictable)) - return; - - priv->evictable_count +=3D msm_obj->base.size >> PAGE_SHIFT; - msm_obj->evictable =3D true; -} - -static inline void mark_unevictable(struct msm_gem_object *msm_obj) -{ - struct msm_drm_private *priv =3D msm_obj->base.dev->dev_private; - - WARN_ON(!mutex_is_locked(&priv->mm_lock)); - - if (is_unevictable(msm_obj)) - return; - - if (WARN_ON(!msm_obj->evictable)) - return; - - priv->evictable_count -=3D msm_obj->base.size >> PAGE_SHIFT; - WARN_ON(priv->evictable_count < 0); - msm_obj->evictable =3D false; -} - void msm_gem_purge(struct drm_gem_object *obj); void msm_gem_evict(struct drm_gem_object *obj); void msm_gem_vunmap(struct drm_gem_object *obj); diff --git a/drivers/gpu/drm/msm/msm_gem_shrinker.c b/drivers/gpu/drm/msm/m= sm_gem_shrinker.c index ea8ed74982c1..530b1102b46d 100644 --- a/drivers/gpu/drm/msm/msm_gem_shrinker.c +++ b/drivers/gpu/drm/msm/msm_gem_shrinker.c @@ -29,121 +29,61 @@ msm_gem_shrinker_count(struct shrinker *shrinker, stru= ct shrink_control *sc) { struct msm_drm_private *priv =3D container_of(shrinker, struct msm_drm_private, shrinker); - unsigned count =3D priv->shrinkable_count; + unsigned count =3D priv->lru.dontneed.count; =20 if (can_swap()) - count +=3D priv->evictable_count; + count +=3D priv->lru.willneed.count; =20 return count; } =20 static bool -purge(struct msm_gem_object *msm_obj) +purge(struct drm_gem_object *obj) { - if (!is_purgeable(msm_obj)) + if (!is_purgeable(to_msm_bo(obj))) return false; =20 - if (msm_gem_active(&msm_obj->base)) + if (msm_gem_active(obj)) return false; =20 - /* - * This will move the obj out of still_in_list to - * the purged list - */ - msm_gem_purge(&msm_obj->base); + msm_gem_purge(obj); =20 return true; } =20 static bool -evict(struct msm_gem_object *msm_obj) +evict(struct drm_gem_object *obj) { - if (is_unevictable(msm_obj)) + if (is_unevictable(to_msm_bo(obj))) return false; =20 - if (msm_gem_active(&msm_obj->base)) + if (msm_gem_active(obj)) return false; =20 - msm_gem_evict(&msm_obj->base); + msm_gem_evict(obj); =20 return true; } =20 -static unsigned long -scan(struct msm_drm_private *priv, unsigned nr_to_scan, struct list_head *= list, - bool (*shrink)(struct msm_gem_object *msm_obj)) -{ - unsigned freed =3D 0; - struct list_head still_in_list; - - INIT_LIST_HEAD(&still_in_list); - - mutex_lock(&priv->mm_lock); - - while (freed < nr_to_scan) { - struct msm_gem_object *msm_obj =3D list_first_entry_or_null( - list, typeof(*msm_obj), mm_list); - - if (!msm_obj) - break; - - list_move_tail(&msm_obj->mm_list, &still_in_list); - - /* - * If it is in the process of being freed, msm_gem_free_object - * can be blocked on mm_lock waiting to remove it. So just - * skip it. - */ - if (!kref_get_unless_zero(&msm_obj->base.refcount)) - continue; - - /* - * Now that we own a reference, we can drop mm_lock for the - * rest of the loop body, to reduce contention with the - * retire_submit path (which could make more objects purgeable) - */ - - mutex_unlock(&priv->mm_lock); - - /* - * Note that this still needs to be trylock, since we can - * hit shrinker in response to trying to get backing pages - * for this obj (ie. while it's lock is already held) - */ - if (!msm_gem_trylock(&msm_obj->base)) - goto tail; - - if (shrink(msm_obj)) - freed +=3D msm_obj->base.size >> PAGE_SHIFT; - - msm_gem_unlock(&msm_obj->base); - -tail: - drm_gem_object_put(&msm_obj->base); - mutex_lock(&priv->mm_lock); - } - - list_splice_tail(&still_in_list, list); - mutex_unlock(&priv->mm_lock); - - return freed; -} - static unsigned long msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc) { struct msm_drm_private *priv =3D container_of(shrinker, struct msm_drm_private, shrinker); + long nr =3D sc->nr_to_scan; unsigned long freed; =20 - freed =3D scan(priv, sc->nr_to_scan, &priv->inactive_dontneed, purge); + freed =3D drm_gem_lru_scan(&priv->lru.dontneed, nr, purge); + nr -=3D freed; =20 if (freed > 0) trace_msm_gem_purge(freed << PAGE_SHIFT); =20 - if (can_swap() && freed < sc->nr_to_scan) { - int evicted =3D scan(priv, sc->nr_to_scan - freed, - &priv->inactive_willneed, evict); + if (can_swap() && nr > 0) { + unsigned long evicted; + + evicted =3D drm_gem_lru_scan(&priv->lru.willneed, nr, evict); + nr -=3D evicted; =20 if (evicted > 0) trace_msm_gem_evict(evicted << PAGE_SHIFT); @@ -179,12 +119,12 @@ msm_gem_shrinker_shrink(struct drm_device *dev, unsig= ned long nr_to_scan) static const int vmap_shrink_limit =3D 15; =20 static bool -vmap_shrink(struct msm_gem_object *msm_obj) +vmap_shrink(struct drm_gem_object *obj) { - if (!is_vunmapable(msm_obj)) + if (!is_vunmapable(to_msm_bo(obj))) return false; =20 - msm_gem_vunmap(&msm_obj->base); + msm_gem_vunmap(obj); =20 return true; } @@ -194,17 +134,18 @@ msm_gem_shrinker_vmap(struct notifier_block *nb, unsi= gned long event, void *ptr) { struct msm_drm_private *priv =3D container_of(nb, struct msm_drm_private, vmap_notifier); - struct list_head *mm_lists[] =3D { - &priv->inactive_dontneed, - &priv->inactive_willneed, - priv->gpu ? &priv->gpu->active_list : NULL, + struct drm_gem_lru *lrus[] =3D { + &priv->lru.dontneed, + &priv->lru.willneed, + &priv->lru.pinned, NULL, }; unsigned idx, unmapped =3D 0; =20 - for (idx =3D 0; mm_lists[idx] && unmapped < vmap_shrink_limit; idx++) { - unmapped +=3D scan(priv, vmap_shrink_limit - unmapped, - mm_lists[idx], vmap_shrink); + for (idx =3D 0; lrus[idx] && unmapped < vmap_shrink_limit; idx++) { + unmapped +=3D drm_gem_lru_scan(lrus[idx], + vmap_shrink_limit - unmapped, + vmap_shrink); } =20 *(unsigned long *)ptr +=3D unmapped; diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c index c2bfcf3f1f40..fba85f894314 100644 --- a/drivers/gpu/drm/msm/msm_gpu.c +++ b/drivers/gpu/drm/msm/msm_gpu.c @@ -846,7 +846,6 @@ int msm_gpu_init(struct drm_device *drm, struct platfor= m_device *pdev, =20 sched_set_fifo_low(gpu->worker->task); =20 - INIT_LIST_HEAD(&gpu->active_list); mutex_init(&gpu->active_lock); mutex_init(&gpu->lock); init_waitqueue_head(&gpu->retire_event); @@ -974,8 +973,6 @@ void msm_gpu_cleanup(struct msm_gpu *gpu) =20 DBG("%s", gpu->name); =20 - WARN_ON(!list_empty(&gpu->active_list)); - for (i =3D 0; i < ARRAY_SIZE(gpu->rb); i++) { msm_ringbuffer_destroy(gpu->rb[i]); gpu->rb[i] =3D NULL; diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 962d2070bcdf..a0885ff99e5b 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -187,12 +187,6 @@ struct msm_gpu { */ int cur_ctx_seqno; =20 - /* - * List of GEM active objects on this gpu. Protected by - * msm_drm_private::mm_lock - */ - struct list_head active_list; - /** * lock: * --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 36FBFC00140 for ; Tue, 26 Jul 2022 17:51:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239862AbiGZRvl (ORCPT ); Tue, 26 Jul 2022 13:51:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45160 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239713AbiGZRuw (ORCPT ); Tue, 26 Jul 2022 13:50:52 -0400 Received: from mail-pj1-x1036.google.com (mail-pj1-x1036.google.com [IPv6:2607:f8b0:4864:20::1036]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E63A831359; Tue, 26 Jul 2022 10:50:46 -0700 (PDT) Received: by mail-pj1-x1036.google.com with SMTP id x24-20020a17090ab01800b001f21556cf48so17956245pjq.4; Tue, 26 Jul 2022 10:50:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FzvQD1BdX2RVx+fHXlbnajcgEgfcaBeelT02bqIAfkE=; b=C3rcsNLGUDjPRxfROWRdoZEqoPkKn1/Htx7zNkExFevmAr6cVYFPDwZk4cJHQuOjHg 7zp1XEPvH9pdrPAIHxwIRBSeD9v/q5BEq8SzErK351H9HEU9UjEYJB3U7dLDRJUOeo/C fzsPnfbr7GciGNhhETTtlx5iIyPnhqwJepjcHeqov4vLVlLC//PFuwmy5n4ZBfFdQwEU 9rqlJsrjcQNNRVjXyyh962ue2QdUjvI7uk/DpyP28VihilgKjyn49nDzVN43FIEUdCrW AeI+KADu9MKjjJHjevG34Z4qEh1wv1KPXw7Iox6VhZtIFn90D0TTjfQreasf/G7ISIij GpOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FzvQD1BdX2RVx+fHXlbnajcgEgfcaBeelT02bqIAfkE=; b=SyrNCgcVwVDdUh1IvtluALE97SUTrfqnUcZ2aG+eT1AvKzTgp8/lb9pXcIHYbgi7K1 SVEwDj3Hnt0VcU/1EuJ2ub02qFwT7wEEEEwCQ23wJjtrqOU7MusRIwcCFaFr1uLq9Exr OIfpfTeAUKQ7I3UaQMxDtCWEcZ6+MZisJJA7lEtM2Jurwz1vdhMs0/D09Vw4Po6oVf22 RCsc0RJviePW4+8L98Zdt4dUwTJXLo4UK0oQO1aVr3TNWomRyJtsHiShLMPN0qZ2v3ds 92D1ufIXpSIF/7CGTaNL7Tvvy1Dqv+yP+Is8ajkDP3/G3kuJldpvVB7WZR1CBZhKt23k u3/w== X-Gm-Message-State: AJIora8+KL/DmKyxU7Cdbjlk7iBunmXE01JIHyuY0SoBG+xhxBM/yUG2 ja3QlhyXGI7zH4WwhYNV12l5Uff41Uc= X-Google-Smtp-Source: AGRyM1sv575TC+lxA2u2e7voRIevFC2jb9zeRMsA6HFThlboaFzIal5t6kaH6LzWzhGEUpQTPqbR/w== X-Received: by 2002:a17:90b:343:b0:1ef:b65d:f4d8 with SMTP id fh3-20020a17090b034300b001efb65df4d8mr306192pjb.187.1658857846082; Tue, 26 Jul 2022 10:50:46 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id 13-20020a170902c10d00b0016bfe9ab1f3sm11868299pli.36.2022.07.26.10.50.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:45 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 11/15] drm/msm/gem: Unpin buffers earlier Date: Tue, 26 Jul 2022 10:50:35 -0700 Message-Id: <20220726175043.1027731-12-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark We've already attached the fences, so obj->resv (which shrinker checks) tells us whether they are still active. So we can unpin sooner, before we drop the queue lock. This also avoids the need to grab the obj lock in the retire path, avoiding potential for lock contention between submit and retire. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem_submit.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm= _gem_submit.c index adf358fb8e9d..5599d93ec0d2 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -501,11 +501,11 @@ static int submit_reloc(struct msm_gem_submit *submit= , struct msm_gem_object *ob */ static void submit_cleanup(struct msm_gem_submit *submit, bool error) { - unsigned cleanup_flags =3D BO_LOCKED; + unsigned cleanup_flags =3D BO_LOCKED | BO_OBJ_PINNED; unsigned i; =20 if (error) - cleanup_flags |=3D BO_VMA_PINNED | BO_OBJ_PINNED; + cleanup_flags |=3D BO_VMA_PINNED; =20 for (i =3D 0; i < submit->nr_bos; i++) { struct msm_gem_object *msm_obj =3D submit->bos[i].obj; @@ -522,10 +522,6 @@ void msm_submit_retire(struct msm_gem_submit *submit) for (i =3D 0; i < submit->nr_bos; i++) { struct drm_gem_object *obj =3D &submit->bos[i].obj->base; =20 - msm_gem_lock(obj); - /* Note, VMA already fence-unpinned before submit: */ - submit_cleanup_bo(submit, i, BO_OBJ_PINNED); - msm_gem_unlock(obj); drm_gem_object_put(obj); } } --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7DABBC00140 for ; Tue, 26 Jul 2022 17:51:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239818AbiGZRvw (ORCPT ); Tue, 26 Jul 2022 13:51:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45568 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239797AbiGZRuy (ORCPT ); Tue, 26 Jul 2022 13:50:54 -0400 Received: from mail-pf1-x430.google.com (mail-pf1-x430.google.com [IPv6:2607:f8b0:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0949631364; Tue, 26 Jul 2022 10:50:49 -0700 (PDT) Received: by mail-pf1-x430.google.com with SMTP id e16so13848550pfm.11; Tue, 26 Jul 2022 10:50:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CHnA8EA1zYWAltmKrCqgpnviThEUlN7Pg3SwIn6d3WM=; b=F60WIj/uTtME9EX4c1JB2hRYNKbac6fm2EIYX3+LEqk9HDAoxblwEjxWP8gDTeyR7K FcIVdOs44c7rUVmROw1XvQ5kkiASj6gY8JzClMhW/GhajiHp4kMQXdkj0xmMixUIfwg0 J5ffyOVozmJavK8q4rFo0Nf/5r397Gtn+8Elryh34p16FsubXvntjOHtXzF2YBi3auJ6 uRY7Zz4Ri9uc94DM+GWiUUhiEHj8rOr/vTw/jf2JtnpK6UrFupXG9J2nqR2Wue9g3N/q ZMbyr24GOVhhpw+x9ycN60ndr5PbZGUZZibIj0+LD0FaudrSLb3vDpmpar+IVoYXjKQy eltw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CHnA8EA1zYWAltmKrCqgpnviThEUlN7Pg3SwIn6d3WM=; b=kw93tIrLF7QuNXgNhV0TOPhzSHI82UTDK8NLDsWKB4qT6KEV6Z2AUoYj4czxUGQdQ8 ZRoM+182kqb3NYJMTO3D4vNAz3AadCsX3GiDkY3b1kzVVe0UDINEF3WXrbg0fhuJ7P2r aKHlH/LyTGydyPc++74hFoUTa0/U1yvJfamEVEb9tCPMC6LTNVixFZrP0Y2+rukPp06s lyWTr8NQH1OM2c3NxEVVa+INIaERKDaVyl5CYk57pd+idUpbn2e1RdYd9SvQtxCi2evX hcd0bu2NrjeN1oIzhgQ4NbeJdtWVLpXnRrX4UALYn0G/obChmgQLRIU7ztM6z7K8mDdh IlCA== X-Gm-Message-State: AJIora/8EisIIK5kSf8I8KSQ9ANqK3AGZCXxSGdZqz8D99evURBG1/1X liiT5aDwaKCf3RnuMuuCMA8= X-Google-Smtp-Source: AGRyM1vGrRy1t9T5ipbkSuK1HJLICCwsiZge34eMCXypdQMGhFjj9tVKMIKDlefv/7ztUb0cTrdlPg== X-Received: by 2002:a05:6a00:1590:b0:52a:eb00:71dc with SMTP id u16-20020a056a00159000b0052aeb0071dcmr18651904pfk.64.1658857848447; Tue, 26 Jul 2022 10:50:48 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id y16-20020a17090322d000b0016c4fb6e0b2sm12067334plg.55.2022.07.26.10.50.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:47 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 12/15] drm/msm/gem: Consolidate shrinker trace Date: Tue, 26 Jul 2022 10:50:36 -0700 Message-Id: <20220726175043.1027731-13-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Combine separate trace events for purge vs evict into one. When we add support for purging/evicting active buffers we'll just add more info into this one trace event, rather than adding a bunch more events. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem_shrinker.c | 19 ++++++--------- drivers/gpu/drm/msm/msm_gpu_trace.h | 32 +++++++++++--------------- 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_shrinker.c b/drivers/gpu/drm/msm/m= sm_gem_shrinker.c index 530b1102b46d..5cc05d669a08 100644 --- a/drivers/gpu/drm/msm/msm_gem_shrinker.c +++ b/drivers/gpu/drm/msm/msm_gem_shrinker.c @@ -71,25 +71,20 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct= shrink_control *sc) struct msm_drm_private *priv =3D container_of(shrinker, struct msm_drm_private, shrinker); long nr =3D sc->nr_to_scan; - unsigned long freed; + unsigned long freed, purged, evicted =3D 0; =20 - freed =3D drm_gem_lru_scan(&priv->lru.dontneed, nr, purge); - nr -=3D freed; - - if (freed > 0) - trace_msm_gem_purge(freed << PAGE_SHIFT); + purged =3D drm_gem_lru_scan(&priv->lru.dontneed, nr, purge); + nr -=3D purged; =20 if (can_swap() && nr > 0) { - unsigned long evicted; - evicted =3D drm_gem_lru_scan(&priv->lru.willneed, nr, evict); nr -=3D evicted; + } =20 - if (evicted > 0) - trace_msm_gem_evict(evicted << PAGE_SHIFT); + freed =3D purged + evicted; =20 - freed +=3D evicted; - } + if (freed) + trace_msm_gem_shrink(sc->nr_to_scan, purged, evicted); =20 return (freed > 0) ? freed : SHRINK_STOP; } diff --git a/drivers/gpu/drm/msm/msm_gpu_trace.h b/drivers/gpu/drm/msm/msm_= gpu_trace.h index ca0b08d7875b..8867fa0a0306 100644 --- a/drivers/gpu/drm/msm/msm_gpu_trace.h +++ b/drivers/gpu/drm/msm/msm_gpu_trace.h @@ -115,29 +115,23 @@ TRACE_EVENT(msm_gmu_freq_change, ); =20 =20 -TRACE_EVENT(msm_gem_purge, - TP_PROTO(u32 bytes), - TP_ARGS(bytes), +TRACE_EVENT(msm_gem_shrink, + TP_PROTO(u32 nr_to_scan, u32 purged, u32 evicted), + TP_ARGS(nr_to_scan, purged, evicted), TP_STRUCT__entry( - __field(u32, bytes) + __field(u32, nr_to_scan) + __field(u32, purged) + __field(u32, evicted) ), TP_fast_assign( - __entry->bytes =3D bytes; + __entry->nr_to_scan =3D nr_to_scan; + __entry->purged =3D purged; + __entry->evicted =3D evicted; ), - TP_printk("Purging %u bytes", __entry->bytes) -); - - -TRACE_EVENT(msm_gem_evict, - TP_PROTO(u32 bytes), - TP_ARGS(bytes), - TP_STRUCT__entry( - __field(u32, bytes) - ), - TP_fast_assign( - __entry->bytes =3D bytes; - ), - TP_printk("Evicting %u bytes", __entry->bytes) + TP_printk("nr_to_scan=3D%u pages, purged=3D%u pages, evicted=3D%u pages", + __entry->nr_to_scan, + __entry->purged, + __entry->evicted) ); =20 =20 --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 20E8AC00140 for ; Tue, 26 Jul 2022 17:51:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239875AbiGZRv5 (ORCPT ); Tue, 26 Jul 2022 13:51:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45292 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239632AbiGZRvB (ORCPT ); Tue, 26 Jul 2022 13:51:01 -0400 Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8BC20326DA; Tue, 26 Jul 2022 10:50:51 -0700 (PDT) Received: by mail-pj1-x102f.google.com with SMTP id x24-20020a17090ab01800b001f21556cf48so17956404pjq.4; Tue, 26 Jul 2022 10:50:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kFWCPQ026Vm0ssc92OEIjelADHl+en2PNRs5WLmvYxM=; b=lCObkp9FE/21z/4v9sqKAMNyMrxnHTOC23HtKuVK1mUngMduut8t8o/S3WKSeIOy9q eOlJRPs8F7E+i6nsg9nRMcJTCai8vcnwrzcZBxYF/Z3qn/VtJanzwNbpjEzObQtluAnG cvaxFJ9Z/ZAvgcFSEbc76zlxwESJ1sarQZque5u7Ok3yxgXLm0uQ+ovtlDiDG7vEeda7 twvXxFztsy9B5W5ogZPesgArzSflQVKrbpjZmbeiFhHnGKVEgAEcq9bk9giNnA0JT0Oh 7CfydKTvC7Tj/VlKrmjgWi7V5T846lIR9Odh71D7mv9h1eIkVBz9kA5JUKw0uUVWuiZk xOUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kFWCPQ026Vm0ssc92OEIjelADHl+en2PNRs5WLmvYxM=; b=clf2MP6Fp1pTUXs4FMdXN2slmQAjVdNeXcXj2oHD8Zja5LxfHXVa+Q80DlgejXB+Qy TJpKnl5KHZyKiVdJExooe3h8R5O+w1iQmzt+J+ekKT5FDniFzqgWg9c8/hD3nIsZhwHY ZrB1oamQiKjJD29dK0Hc/t+maqxMzBofmKOuS1drj0frw5miJIudyHgQzXaKFfRqEQFt GJwHYRDblRXjvS3pctE0rT9xp+NBKnzJOT1BCuaapAGhqIVsAk0kXQO/tx52zpq20mhh HiptGq0SUacDFPd2/+TBE4LNk9qxIHuM66F+c4bEKhE9pB/yA31fw4r7iTenG7D1RrUC dihw== X-Gm-Message-State: AJIora9Bs6B7HDXTXuR6qVybN/D7nmcfqVBFxMH4QynL5vKEPSjOasJX LdNernWoVt28UfH8SI+TSVA= X-Google-Smtp-Source: AGRyM1tdh2qvuDkY5DLeIQHdWIquHQp5nCdXcLA0KqZYZtlIaOgeg6179jN5Fe39m4gSJU6SvicfjQ== X-Received: by 2002:a17:902:ea0d:b0:16d:80f9:da54 with SMTP id s13-20020a170902ea0d00b0016d80f9da54mr8481066plg.150.1658857850964; Tue, 26 Jul 2022 10:50:50 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id h13-20020a170902680d00b00168c52319c3sm12015432plk.149.2022.07.26.10.50.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:50 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 13/15] drm/msm/gem: Evict active GEM objects when necessary Date: Tue, 26 Jul 2022 10:50:37 -0700 Message-Id: <20220726175043.1027731-14-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark If we are under enough memory pressure, we should stall waiting for active buffers to become idle in order to evict. v2: Check for __GFP_ATOMIC before blocking Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem_shrinker.c | 70 +++++++++++++++++++++----- drivers/gpu/drm/msm/msm_gpu_trace.h | 16 +++--- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_shrinker.c b/drivers/gpu/drm/msm/m= sm_gem_shrinker.c index 5cc05d669a08..f31054d25314 100644 --- a/drivers/gpu/drm/msm/msm_gem_shrinker.c +++ b/drivers/gpu/drm/msm/msm_gem_shrinker.c @@ -24,6 +24,13 @@ static bool can_swap(void) return enable_eviction && get_nr_swap_pages() > 0; } =20 +static bool can_block(struct shrink_control *sc) +{ + if (sc->gfp_mask & __GFP_ATOMIC) + return false; + return current_is_kswapd() || (sc->gfp_mask & __GFP_RECLAIM); +} + static unsigned long msm_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *s= c) { @@ -65,26 +72,65 @@ evict(struct drm_gem_object *obj) return true; } =20 +static bool +wait_for_idle(struct drm_gem_object *obj) +{ + enum dma_resv_usage usage =3D dma_resv_usage_rw(true); + return dma_resv_wait_timeout(obj->resv, usage, false, 1000) > 0; +} + +static bool +active_purge(struct drm_gem_object *obj) +{ + if (!wait_for_idle(obj)) + return false; + + return purge(obj); +} + +static bool +active_evict(struct drm_gem_object *obj) +{ + if (!wait_for_idle(obj)) + return false; + + return evict(obj); +} + static unsigned long msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc) { struct msm_drm_private *priv =3D container_of(shrinker, struct msm_drm_private, shrinker); + struct { + struct drm_gem_lru *lru; + bool (*shrink)(struct drm_gem_object *obj); + bool cond; + unsigned long freed; + } stages[] =3D { + /* Stages of progressively more aggressive/expensive reclaim: */ + { &priv->lru.dontneed, purge, true }, + { &priv->lru.willneed, evict, can_swap() }, + { &priv->lru.dontneed, active_purge, can_block(sc) }, + { &priv->lru.willneed, active_evict, can_swap() && can_block(sc) }, + }; long nr =3D sc->nr_to_scan; - unsigned long freed, purged, evicted =3D 0; - - purged =3D drm_gem_lru_scan(&priv->lru.dontneed, nr, purge); - nr -=3D purged; - - if (can_swap() && nr > 0) { - evicted =3D drm_gem_lru_scan(&priv->lru.willneed, nr, evict); - nr -=3D evicted; + unsigned long freed =3D 0; + + for (unsigned i =3D 0; (nr > 0) && (i < ARRAY_SIZE(stages)); i++) { + if (!stages[i].cond) + continue; + stages[i].freed =3D + drm_gem_lru_scan(stages[i].lru, nr, stages[i].shrink); + nr -=3D stages[i].freed; + freed +=3D stages[i].freed; } =20 - freed =3D purged + evicted; - - if (freed) - trace_msm_gem_shrink(sc->nr_to_scan, purged, evicted); + if (freed) { + trace_msm_gem_shrink(sc->nr_to_scan, stages[0].freed, + stages[1].freed, stages[2].freed, + stages[3].freed); + } =20 return (freed > 0) ? freed : SHRINK_STOP; } diff --git a/drivers/gpu/drm/msm/msm_gpu_trace.h b/drivers/gpu/drm/msm/msm_= gpu_trace.h index 8867fa0a0306..ac40d857bc45 100644 --- a/drivers/gpu/drm/msm/msm_gpu_trace.h +++ b/drivers/gpu/drm/msm/msm_gpu_trace.h @@ -116,22 +116,26 @@ TRACE_EVENT(msm_gmu_freq_change, =20 =20 TRACE_EVENT(msm_gem_shrink, - TP_PROTO(u32 nr_to_scan, u32 purged, u32 evicted), - TP_ARGS(nr_to_scan, purged, evicted), + TP_PROTO(u32 nr_to_scan, u32 purged, u32 evicted, + u32 active_purged, u32 active_evicted), + TP_ARGS(nr_to_scan, purged, evicted, active_purged, active_evicted), TP_STRUCT__entry( __field(u32, nr_to_scan) __field(u32, purged) __field(u32, evicted) + __field(u32, active_purged) + __field(u32, active_evicted) ), TP_fast_assign( __entry->nr_to_scan =3D nr_to_scan; __entry->purged =3D purged; __entry->evicted =3D evicted; + __entry->active_purged =3D active_purged; + __entry->active_evicted =3D active_evicted; ), - TP_printk("nr_to_scan=3D%u pages, purged=3D%u pages, evicted=3D%u pages", - __entry->nr_to_scan, - __entry->purged, - __entry->evicted) + TP_printk("nr_to_scan=3D%u pg, purged=3D%u pg, evicted=3D%u pg, active_p= urged=3D%u pg, active_evicted=3D%u pg", + __entry->nr_to_scan, __entry->purged, __entry->evicted, + __entry->active_purged, __entry->active_evicted) ); =20 =20 --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD413C3F6B0 for ; Tue, 26 Jul 2022 17:52:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239830AbiGZRwF (ORCPT ); Tue, 26 Jul 2022 13:52:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45374 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239680AbiGZRvT (ORCPT ); Tue, 26 Jul 2022 13:51:19 -0400 Received: from mail-pf1-x432.google.com (mail-pf1-x432.google.com [IPv6:2607:f8b0:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 612F132D91; Tue, 26 Jul 2022 10:50:54 -0700 (PDT) Received: by mail-pf1-x432.google.com with SMTP id b133so13884172pfb.6; Tue, 26 Jul 2022 10:50:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2lydIYqrd+W135f9r06NI6UhXQCS/e+8vxoGcpQKqzg=; b=PDhqNYSA6xODDrDd0vHt957kMkLlkt5YZtjJxu+uvf+VzRec12Wl4zGHGQHNUR+kud r2uR4/8h303E1AlsaXNAe3ZhUAaJfqkiYP0VjNx0BL05Jb/zMAbRYkXPnovdWnP+9p7r 5dvkMe5GeXznPQS1F+3pDa/nbm8Qwt3ybBYB/ZLstnjmLb3xOx3GEMP8Ze41fwemHtyQ ozXKvekJUrPjKiub/Y3PVDeY3AiKdoDoVnUBe/6XnPIkYEyPRNyoqqaCdj4k7BOBjbvm C+jMrQIrT81XHU+XCobgj7olhE+JGMUjWjw87bizuidWC86Pg/xKTPq1+2viHdzRY82B Vc0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2lydIYqrd+W135f9r06NI6UhXQCS/e+8vxoGcpQKqzg=; b=eStA9FE2RNay30JnUX9iK4DJBsCuATaBkGAHMnq+vn6JSahj+gCkWv6bkNwJBPKXL0 MXHk3ujPFHdot1U+wUCf/cDvDR0xuV9BaAiqZLJPVEcN4wAUqJvznfMlbu8HyaIzdgfM v9Ug1QoMu1fDwLgmBJ4KWyCEt14GYSNO/bxq9qxpDcAvI7z9kc9lInXtuBMRsLV7OANW h/csYFedunnSJgOu2XzMV+QZpML+WXz3LuaSU6D+tBdse2Drh1qCAN1cge8c6cAPmOH5 3iRIV92mH21+De8U7Ys5qngylgHur4YAcOW25A7oRoSbXbifrZFVxuBv71MItsxZFiYR VguQ== X-Gm-Message-State: AJIora8d0nu9yF0a821+48/UUOqsFHkfqxrPnEG7iwZf0p4YvL2OC9vz 26V8mApS+7Tco5V8UTmCm0g= X-Google-Smtp-Source: AGRyM1sGBKIW+nSuF4xjycb0Y98jAeOZnMBjSoj/fVz6HwmitE1tylB8Q/1BW6YONmhkBh9qfmetyg== X-Received: by 2002:a05:6a00:179e:b0:518:9e1d:1cbd with SMTP id s30-20020a056a00179e00b005189e1d1cbdmr18408477pfg.12.1658857853881; Tue, 26 Jul 2022 10:50:53 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id p127-20020a622985000000b00528d3d7194dsm12026601pfp.4.2022.07.26.10.50.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:52 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 14/15] drm/msm/gem: Add msm_gem_assert_locked() Date: Tue, 26 Jul 2022 10:50:38 -0700 Message-Id: <20220726175043.1027731-15-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark All use of msm_gem_is_locked() is just for WARN_ON()s, so extract out into an msm_gem_assert_locked() patch. Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem.c | 36 +++++++++++++++++------------------ drivers/gpu/drm/msm/msm_gem.h | 8 +++++++- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index d4e8af46f4ef..1dee0d18abbb 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -97,7 +97,7 @@ static struct page **get_pages(struct drm_gem_object *obj) { struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 if (!msm_obj->pages) { struct drm_device *dev =3D obj->dev; @@ -183,7 +183,7 @@ static struct page **msm_gem_pin_pages_locked(struct dr= m_gem_object *obj) struct msm_gem_object *msm_obj =3D to_msm_bo(obj); struct page **p; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 if (GEM_WARN_ON(msm_obj->madv !=3D MSM_MADV_WILLNEED)) { return ERR_PTR(-EBUSY); @@ -278,7 +278,7 @@ static uint64_t mmap_offset(struct drm_gem_object *obj) struct drm_device *dev =3D obj->dev; int ret; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 /* Make it mmapable */ ret =3D drm_gem_create_mmap_offset(obj); @@ -307,7 +307,7 @@ static struct msm_gem_vma *add_vma(struct drm_gem_objec= t *obj, struct msm_gem_object *msm_obj =3D to_msm_bo(obj); struct msm_gem_vma *vma; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 vma =3D kzalloc(sizeof(*vma), GFP_KERNEL); if (!vma) @@ -326,7 +326,7 @@ static struct msm_gem_vma *lookup_vma(struct drm_gem_ob= ject *obj, struct msm_gem_object *msm_obj =3D to_msm_bo(obj); struct msm_gem_vma *vma; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 list_for_each_entry(vma, &msm_obj->vmas, list) { if (vma->aspace =3D=3D aspace) @@ -357,7 +357,7 @@ put_iova_spaces(struct drm_gem_object *obj, bool close) struct msm_gem_object *msm_obj =3D to_msm_bo(obj); struct msm_gem_vma *vma; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 list_for_each_entry(vma, &msm_obj->vmas, list) { if (vma->aspace) { @@ -375,7 +375,7 @@ put_iova_vmas(struct drm_gem_object *obj) struct msm_gem_object *msm_obj =3D to_msm_bo(obj); struct msm_gem_vma *vma, *tmp; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 list_for_each_entry_safe(vma, tmp, &msm_obj->vmas, list) { del_vma(vma); @@ -388,7 +388,7 @@ static struct msm_gem_vma *get_vma_locked(struct drm_ge= m_object *obj, { struct msm_gem_vma *vma; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 vma =3D lookup_vma(obj, aspace); =20 @@ -428,7 +428,7 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj, = struct msm_gem_vma *vma) if (msm_obj->flags & MSM_BO_CACHED_COHERENT) prot |=3D IOMMU_CACHE; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 if (GEM_WARN_ON(msm_obj->madv !=3D MSM_MADV_WILLNEED)) return -EBUSY; @@ -448,7 +448,7 @@ void msm_gem_unpin_locked(struct drm_gem_object *obj) { struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 msm_obj->pin_count--; GEM_WARN_ON(msm_obj->pin_count < 0); @@ -469,7 +469,7 @@ static int get_and_pin_iova_range_locked(struct drm_gem= _object *obj, struct msm_gem_vma *vma; int ret; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 vma =3D get_vma_locked(obj, aspace, range_start, range_end); if (IS_ERR(vma)) @@ -630,7 +630,7 @@ static void *get_vaddr(struct drm_gem_object *obj, unsi= gned madv) struct msm_gem_object *msm_obj =3D to_msm_bo(obj); int ret =3D 0; =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 if (obj->import_attach) return ERR_PTR(-ENODEV); @@ -703,7 +703,7 @@ void msm_gem_put_vaddr_locked(struct drm_gem_object *ob= j) { struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); GEM_WARN_ON(msm_obj->vmap_count < 1); =20 msm_obj->vmap_count--; @@ -745,7 +745,7 @@ void msm_gem_purge(struct drm_gem_object *obj) struct drm_device *dev =3D obj->dev; struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); GEM_WARN_ON(!is_purgeable(msm_obj)); =20 /* Get rid of any iommu mapping(s): */ @@ -782,7 +782,7 @@ void msm_gem_evict(struct drm_gem_object *obj) struct drm_device *dev =3D obj->dev; struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); GEM_WARN_ON(is_unevictable(msm_obj)); =20 /* Get rid of any iommu mapping(s): */ @@ -797,7 +797,7 @@ void msm_gem_vunmap(struct drm_gem_object *obj) { struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 if (!msm_obj->vaddr || GEM_WARN_ON(!is_vunmapable(msm_obj))) return; @@ -811,7 +811,7 @@ static void update_lru(struct drm_gem_object *obj) struct msm_drm_private *priv =3D obj->dev->dev_private; struct msm_gem_object *msm_obj =3D to_msm_bo(obj); =20 - GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base)); + msm_gem_assert_locked(&msm_obj->base); =20 if (!msm_obj->pages) { GEM_WARN_ON(msm_obj->pin_count); @@ -831,7 +831,7 @@ static void update_lru(struct drm_gem_object *obj) =20 bool msm_gem_active(struct drm_gem_object *obj) { - GEM_WARN_ON(!msm_gem_is_locked(obj)); + msm_gem_assert_locked(obj); =20 if (to_msm_bo(obj)->pin_count) return true; diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h index 0403b27ff779..3c6add51d13b 100644 --- a/drivers/gpu/drm/msm/msm_gem.h +++ b/drivers/gpu/drm/msm/msm_gem.h @@ -215,6 +215,12 @@ msm_gem_is_locked(struct drm_gem_object *obj) return dma_resv_is_locked(obj->resv) || (kref_read(&obj->refcount) =3D=3D= 0); } =20 +static inline void +msm_gem_assert_locked(struct drm_gem_object *obj) +{ + GEM_WARN_ON(!msm_gem_is_locked(obj)); +} + /* imported/exported objects are not purgeable: */ static inline bool is_unpurgeable(struct msm_gem_object *msm_obj) { @@ -229,7 +235,7 @@ static inline bool is_purgeable(struct msm_gem_object *= msm_obj) =20 static inline bool is_vunmapable(struct msm_gem_object *msm_obj) { - GEM_WARN_ON(!msm_gem_is_locked(&msm_obj->base)); + msm_gem_assert_locked(&msm_obj->base); return (msm_obj->vmap_count =3D=3D 0) && msm_obj->vaddr; } =20 --=20 2.36.1 From nobody Wed Apr 15 04:15:18 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A4441C00140 for ; Tue, 26 Jul 2022 17:52:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239628AbiGZRwI (ORCPT ); Tue, 26 Jul 2022 13:52:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239767AbiGZRvU (ORCPT ); Tue, 26 Jul 2022 13:51:20 -0400 Received: from mail-pg1-x533.google.com (mail-pg1-x533.google.com [IPv6:2607:f8b0:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0786C32D96; Tue, 26 Jul 2022 10:50:57 -0700 (PDT) Received: by mail-pg1-x533.google.com with SMTP id bf13so13735661pgb.11; Tue, 26 Jul 2022 10:50:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tv9XZJtMf2UZGPK9r5daZO8lAjNs4ugv43Of9czCQIM=; b=n6N05FO3A/857gPBbDiuof2GwBfUn9kG0puB7kE8lFbQKIRgt5AHPZzAAaOh3dGaw+ I0qC2WcECj1kdPZjXnWb2ynEpT0VEDMaY6F4290Haflq9ssHlBMTUon11dWEoP73dzhf QATtcmH9W6axNlapK/asy95XPOrDO5j6fV3PCqKz1+u+uvnOrCaQ36QvvRXKMZYLcL43 fxhdUO4uzY6xfRvqsDmJ3lxyZnCuMuY4gEPFRh+lNZfpo6IBoOhjVOlWDypeT/R1l8cv jpP2SBPbKIuFLlqXbE7uv92AFhfT34u/Sku5aJTW7yANKYxCyAwXSjbjTzttH8HfRATU 7XRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tv9XZJtMf2UZGPK9r5daZO8lAjNs4ugv43Of9czCQIM=; b=ssA/VGIpvllEGPV7qMEIR8IofMX4tp/nv48XeEgrl/BTWfH/gVcfiFbXk8obo98bRp vdEjirfoL6owVY401eo9PvLemHVgZFbcmVmDpSxkzGNd4OOMPc/iI886F0MyR36gHJUV KF31XOQu3dQslqni1uUEeiTOU2PZrz9nfg8tuIOgRmeDB4C/2d8yIViQcxJj5UGy7z+T mnrA6qhvB6ajjR/ctvBl4JSNvAPQh+HpW6G2NQgaAuUrZKL3zWnuOKm2i8SuRCi6mwIS 4teSm5f79nSPjyfDqFIxa9W5EDRvUKtjbo10YnRSAjsqoR13X5Zx1Y8Nr6TpYM9Qxzly n0nw== X-Gm-Message-State: AJIora80onsBO0VghDSFLS0j7V3ylsrsfqYCsfadsa3nNQ1KnAacRrup FxC/iv9uG/P2QNNdOKPnZRE= X-Google-Smtp-Source: AGRyM1t4eqbPaP3I7M4Q4a8CREAJGaFkgWHmK7O/ZXpR+tC19xQ9DUEs+FBui8DB+uQCfvsd4JVx/A== X-Received: by 2002:a05:6a00:1590:b0:52a:eb00:71dc with SMTP id u16-20020a056a00159000b0052aeb0071dcmr18652289pfk.64.1658857856554; Tue, 26 Jul 2022 10:50:56 -0700 (PDT) Received: from localhost ([2a00:79e1:abd:4a00:2703:3c72:eb1a:cffd]) by smtp.gmail.com with ESMTPSA id 202-20020a6302d3000000b003db7de758besm10637529pgc.5.2022.07.26.10.50.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 10:50:55 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Rob Clark , Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 15/15] drm/msm/gem: Convert to lockdep assert Date: Tue, 26 Jul 2022 10:50:39 -0700 Message-Id: <20220726175043.1027731-16-robdclark@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220726175043.1027731-1-robdclark@gmail.com> References: <20220726175043.1027731-1-robdclark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Rob Clark Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gem.h | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h index 3c6add51d13b..c4844cf3a585 100644 --- a/drivers/gpu/drm/msm/msm_gem.h +++ b/drivers/gpu/drm/msm/msm_gem.h @@ -197,8 +197,8 @@ msm_gem_unlock(struct drm_gem_object *obj) dma_resv_unlock(obj->resv); } =20 -static inline bool -msm_gem_is_locked(struct drm_gem_object *obj) +static inline void +msm_gem_assert_locked(struct drm_gem_object *obj) { /* * Destroying the object is a special case.. msm_gem_free_object() @@ -212,13 +212,10 @@ msm_gem_is_locked(struct drm_gem_object *obj) * Unfortunately lockdep is not aware of this detail. So when the * refcount drops to zero, we pretend it is already locked. */ - return dma_resv_is_locked(obj->resv) || (kref_read(&obj->refcount) =3D=3D= 0); -} - -static inline void -msm_gem_assert_locked(struct drm_gem_object *obj) -{ - GEM_WARN_ON(!msm_gem_is_locked(obj)); + lockdep_assert_once( + (kref_read(&obj->refcount) =3D=3D 0) || + (lockdep_is_held(&obj->resv->lock.base) !=3D LOCK_STATE_NOT_HELD) + ); } =20 /* imported/exported objects are not purgeable: */ --=20 2.36.1