From patchwork Thu Mar 27 14:08:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Adri=C3=A1n_Larumbe?= X-Patchwork-Id: 14031176 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 50076C3600B for ; Thu, 27 Mar 2025 14:10:40 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A26CE10E8E8; Thu, 27 Mar 2025 14:10:39 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="hjsiGm6X"; dkim-atps=neutral Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) by gabe.freedesktop.org (Postfix) with ESMTPS id D401010E119 for ; Thu, 27 Mar 2025 14:10:28 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1743084609; cv=none; d=zohomail.com; s=zohoarc; b=VedyCbIdt4I86rjHMEhtvpNXAiFwv2UiduZ/rKWu6+orLgJ2H1hs4pci5uEODZ5GoeyPT8s9rSKJpJ0Sf+IaaQ6fsjO85MsdSpVG4gi+FFyqiT8pYjhZcIq1WMxgv2kzyvu7lU/OMpcoLuXzF3M4gFHnE9FLFlRcJvPw780I4dg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743084609; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=4UyPlXIDXdLEvKXdapaXy/kcMLyCFQnzUHF9J9uf/ds=; b=RMq3HnE0/m/6dcP6XbF/Mw8WAIyNPve/eQ67udLGmu8HyKrLqZ5geVc3Lu3wXWthm+TWkzcoO/E4Hd/StSqU43uewGlFIsS199Ugoma8mSwPhQfn58dvivufMtn57j2nWNj6pa097EURdb5diBzbLJO5wqyYzBxSSrKe6bn01xc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1743084609; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=4UyPlXIDXdLEvKXdapaXy/kcMLyCFQnzUHF9J9uf/ds=; b=hjsiGm6XaxN8tvqZvruS+L+OYby5zW0dFLlk/zsIuigWiT1bcZMvu9teQSN66bR2 rTqqe5mgPVSaJ3CcnlC3ZkGqA6P9vgNAhi3g0pMP4vvoqMje9O+Uz/iLTUh5M7fswNF 3iL78U4iX7JSNXo0LPcvz8qqx3MhpTEEX73+A0Hw= Received: by mx.zohomail.com with SMTPS id 1743084608283448.1115696600874; Thu, 27 Mar 2025 07:10:08 -0700 (PDT) From: =?utf-8?q?Adri=C3=A1n_Larumbe?= To: ?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Boris Brezillon , Steven Price , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sumit Semwal , =?utf-8?q?Christian_K=C3=B6nig?= Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org Subject: [PATCH v3 1/4] drm/panthor: Introduce BO labeling Date: Thu, 27 Mar 2025 14:08:34 +0000 Message-ID: <20250327140845.105962-2-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250327140845.105962-1-adrian.larumbe@collabora.com> References: <20250327140845.105962-1-adrian.larumbe@collabora.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Add a new character string Panthor BO field, and a function that allows setting it from within the driver. Driver takes care of freeing the string when it's replaced or no longer needed at object destruction time, but allocating it is the responsibility of callers. Signed-off-by: Adrián Larumbe --- drivers/gpu/drm/panthor/panthor_gem.c | 38 +++++++++++++++++++++++++++ drivers/gpu/drm/panthor/panthor_gem.h | 17 ++++++++++++ 2 files changed, 55 insertions(+) diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c index 8244a4e6c2a2..7d017f9d1d52 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.c +++ b/drivers/gpu/drm/panthor/panthor_gem.c @@ -18,6 +18,14 @@ static void panthor_gem_free_object(struct drm_gem_object *obj) struct panthor_gem_object *bo = to_panthor_bo(obj); struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem; + /* + * Label might have been allocated with kstrdup_const(), + * we need to take that into account when freeing the memory + */ + kfree_const(bo->label.str); + + mutex_destroy(&bo->label.lock); + drm_gem_free_mmap_offset(&bo->base.base); mutex_destroy(&bo->gpuva_list_lock); drm_gem_shmem_free(&bo->base); @@ -196,6 +204,7 @@ struct drm_gem_object *panthor_gem_create_object(struct drm_device *ddev, size_t obj->base.map_wc = !ptdev->coherent; mutex_init(&obj->gpuva_list_lock); drm_gem_gpuva_set_lock(&obj->base.base, &obj->gpuva_list_lock); + mutex_init(&obj->label.lock); return &obj->base.base; } @@ -247,3 +256,32 @@ panthor_gem_create_with_handle(struct drm_file *file, return ret; } + +void +panthor_gem_bo_set_label(struct drm_gem_object *obj, const char *label) +{ + struct panthor_gem_object *bo = to_panthor_bo(obj); + const char *old_label; + + mutex_lock(&bo->label.lock); + old_label = bo->label.str; + bo->label.str = label; + mutex_unlock(&bo->label.lock); + + kfree(old_label); +} + +void +panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label) +{ + const char *str; + + str = kstrdup_const(label, GFP_KERNEL); + if (!str) { + /* Failing to allocate memory for a label isn't a fatal condition */ + drm_warn(bo->obj->dev, "Not enough memory to allocate BO label"); + return; + } + + panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL)); +} diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h index 5749ef2ebe03..0582826b341a 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.h +++ b/drivers/gpu/drm/panthor/panthor_gem.h @@ -46,6 +46,20 @@ struct panthor_gem_object { /** @flags: Combination of drm_panthor_bo_flags flags. */ u32 flags; + + /** + * @label: BO tagging fields. The label can be assigned within the + * driver itself or through a specific IOCTL. + */ + struct { + /** + * @label.str: Pointer to NULL-terminated string, + */ + const char *str; + + /** @lock.str: Protects access to the @label.str field. */ + struct mutex lock; + } label; }; /** @@ -91,6 +105,9 @@ panthor_gem_create_with_handle(struct drm_file *file, struct panthor_vm *exclusive_vm, u64 *size, u32 flags, uint32_t *handle); +void panthor_gem_bo_set_label(struct drm_gem_object *obj, const char *label); +void panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label); + static inline u64 panthor_kernel_bo_gpuva(struct panthor_kernel_bo *bo) { From patchwork Thu Mar 27 14:08:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Adri=C3=A1n_Larumbe?= X-Patchwork-Id: 14031177 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A55C2C36011 for ; Thu, 27 Mar 2025 14:10:40 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AAF6110E8DE; Thu, 27 Mar 2025 14:10:39 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="e8a1iX4A"; dkim-atps=neutral X-Greylist: delayed 129297 seconds by postgrey-1.36 at gabe; Thu, 27 Mar 2025 14:10:29 UTC Received: from sender3-pp-f112.zoho.com (sender3-pp-f112.zoho.com [136.143.184.112]) by gabe.freedesktop.org (Postfix) with ESMTPS id D3D1E10E10D for ; Thu, 27 Mar 2025 14:10:29 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1743084613; cv=none; d=zohomail.com; s=zohoarc; b=Hn6VVoga5d6gPyo4FH4PTG3jE11pWfHHWBKkKXveRQVJDLfHQCBq/5ibKhtHyp/APZ2OlhE38yC3UFA8k4BoIx179WRJuWULCprmD2JvtVVFtoLo+eo+toqPFYabSfZCrSR9Vs7wnfxtmv/tIPg7PNJVTOOjHVaEuFfVV5wcW5E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743084613; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=fTMTGn8aqBGa5RD+wIowZDsO5/4Lq3ZWH5/3uWwDQ8Y=; b=K5Hqjd7SjI+061+Yl2oL58EOwI5+5TIKd5fX1fpWpI8xLjUxDm+/4+Bc3rQljhbKih5W/j5h21xYCasqKiM5/w5PzaAm0iGh0ItzkLtouSbUY9qrgOR0xLQHh7fTVSPVJmxQhuT2FA809jGMbg/ZRKFgp1NNMX7kpRX2/OvTOpw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1743084613; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=fTMTGn8aqBGa5RD+wIowZDsO5/4Lq3ZWH5/3uWwDQ8Y=; b=e8a1iX4Am2MZu6qzts9yZ9zV96XKNKlqv1L/SucZU3QM7sZGn5q3zKFtIE9KMc7Q X/XMbutm37UocvLWDIRQzsWLcdz0Nt48TDfUNPGW+42EKlBTA/C/JDXg6L/qESmzNW6 HnrFmKkcnUWhwkvDeSbGyA+EzFmUPvNzk98eu7uM= Received: by mx.zohomail.com with SMTPS id 174308461171723.620238265796388; Thu, 27 Mar 2025 07:10:11 -0700 (PDT) From: =?utf-8?q?Adri=C3=A1n_Larumbe?= To: ?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Boris Brezillon , Steven Price , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sumit Semwal , =?utf-8?q?Christian_K=C3=B6nig?= Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org Subject: [PATCH v3 2/4] drm/panthor: Add driver IOCTL for setting BO labels Date: Thu, 27 Mar 2025 14:08:35 +0000 Message-ID: <20250327140845.105962-3-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250327140845.105962-1-adrian.larumbe@collabora.com> References: <20250327140845.105962-1-adrian.larumbe@collabora.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Allow UM to label a BO for which it possesses a DRM handle. Signed-off-by: Adrián Larumbe --- drivers/gpu/drm/panthor/panthor_drv.c | 40 +++++++++++++++++++++++++++ include/uapi/drm/panthor_drm.h | 19 +++++++++++++ 2 files changed, 59 insertions(+) diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c index 310bb44abe1a..488d17466494 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -1330,6 +1330,44 @@ static int panthor_ioctl_vm_get_state(struct drm_device *ddev, void *data, return 0; } +static int panthor_ioctl_bo_set_label(struct drm_device *ddev, void *data, + struct drm_file *file) +{ + struct drm_panthor_bo_set_label *args = data; + struct drm_gem_object *obj; + const char *label; + int ret = 0; + + obj = drm_gem_object_lookup(file, args->handle); + if (!obj) + return -ENOENT; + + if (args->size && args->label) { + if (args->size > PAGE_SIZE) { + ret = -E2BIG; + goto err_label; + } + + label = strndup_user(u64_to_user_ptr(args->label), args->size); + if (IS_ERR(label)) { + ret = PTR_ERR(label); + goto err_label; + } + } else if (args->size && !args->label) { + ret = -EINVAL; + goto err_label; + } else { + label = NULL; + } + + panthor_gem_bo_set_label(obj, label); + +err_label: + drm_gem_object_put(obj); + + return ret; +} + static int panthor_open(struct drm_device *ddev, struct drm_file *file) { @@ -1399,6 +1437,7 @@ static const struct drm_ioctl_desc panthor_drm_driver_ioctls[] = { PANTHOR_IOCTL(TILER_HEAP_CREATE, tiler_heap_create, DRM_RENDER_ALLOW), PANTHOR_IOCTL(TILER_HEAP_DESTROY, tiler_heap_destroy, DRM_RENDER_ALLOW), PANTHOR_IOCTL(GROUP_SUBMIT, group_submit, DRM_RENDER_ALLOW), + PANTHOR_IOCTL(BO_SET_LABEL, bo_set_label, DRM_RENDER_ALLOW), }; static int panthor_mmap(struct file *filp, struct vm_area_struct *vma) @@ -1508,6 +1547,7 @@ static void panthor_debugfs_init(struct drm_minor *minor) * - 1.2 - adds DEV_QUERY_GROUP_PRIORITIES_INFO query * - adds PANTHOR_GROUP_PRIORITY_REALTIME priority * - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag + * - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl */ static const struct drm_driver panthor_drm_driver = { .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ | diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h index 97e2c4510e69..26b52f147360 100644 --- a/include/uapi/drm/panthor_drm.h +++ b/include/uapi/drm/panthor_drm.h @@ -127,6 +127,9 @@ enum drm_panthor_ioctl_id { /** @DRM_PANTHOR_TILER_HEAP_DESTROY: Destroy a tiler heap. */ DRM_PANTHOR_TILER_HEAP_DESTROY, + + /** @DRM_PANTHOR_BO_SET_LABEL: Label a BO. */ + DRM_PANTHOR_BO_SET_LABEL, }; /** @@ -977,6 +980,20 @@ struct drm_panthor_tiler_heap_destroy { __u32 pad; }; +/** + * struct drm_panthor_bo_set_label - Arguments passed to DRM_IOCTL_PANTHOR_BO_SET_LABEL + */ +struct drm_panthor_bo_set_label { + /** @handle: Handle of the buffer object to label. */ + __u32 handle; + + /** @size: Length of the label, including the NULL terminator. */ + __u32 size; + + /** @label: User pointer to a NULL-terminated string */ + __u64 label; +}; + /** * DRM_IOCTL_PANTHOR() - Build a Panthor IOCTL number * @__access: Access type. Must be R, W or RW. @@ -1019,6 +1036,8 @@ enum { DRM_IOCTL_PANTHOR(WR, TILER_HEAP_CREATE, tiler_heap_create), DRM_IOCTL_PANTHOR_TILER_HEAP_DESTROY = DRM_IOCTL_PANTHOR(WR, TILER_HEAP_DESTROY, tiler_heap_destroy), + DRM_IOCTL_PANTHOR_BO_SET_LABEL = + DRM_IOCTL_PANTHOR(WR, BO_SET_LABEL, bo_set_label), }; #if defined(__cplusplus) From patchwork Thu Mar 27 14:08:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Adri=C3=A1n_Larumbe?= X-Patchwork-Id: 14031175 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E705CC36011 for ; Thu, 27 Mar 2025 14:10:33 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9B46D10E119; Thu, 27 Mar 2025 14:10:32 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="hY+boGgs"; dkim-atps=neutral Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9A18B10E119 for ; Thu, 27 Mar 2025 14:10:31 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1743084617; cv=none; d=zohomail.com; s=zohoarc; b=KpjdIiIWh8RKsMKFKxxiwL56CbPiNXgxkLhGIt4ouXI+KRaNzb/suSR6xAolC6nGEAO8t6Mjjv3YJy2cewyH2a9JeFCuSdZDeQVJQ/OvmW7Z7/PEhUecbD3LKoOz7AEi8HpJz2krWvpK/0wrIi6ySeeNZPSjcwKb8Ntvagh1oQg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743084617; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=uWgyZN7O1BIRlz2mauasqEcvyA7Zp0wCRqqBpbeNDmg=; b=GOewnABB4WA6a5QPfbOdVeilpskpO1l6k9x1s5VK14PGi6gvMIRDdny19xCLKSjbwwwYZKMP8cYYWguCw514zWve9CZndSNhOfsgIW+R3chDbhZEty/yCSURKHt5HYFN6VSo8axy90pwcCYoygeJKdoD8yxDHBFT3PA9bOIznmY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1743084617; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=uWgyZN7O1BIRlz2mauasqEcvyA7Zp0wCRqqBpbeNDmg=; b=hY+boGgsAAF1BT4s+cX5ae/V+fvV8urVObLv48C9zyUsOrpnqizbozzy84hk1JKJ tzHSTIKJWyri9eB7Wfmnl7fZSknHFTFOwl84f40180LcLxZ6Eu3oq/b2RFvGsRKiD2P AY9IkZdxJNcqmw7wKJqJjRQyJUFUkIYAtIcQQj4A= Received: by mx.zohomail.com with SMTPS id 1743084615389160.53814265439587; Thu, 27 Mar 2025 07:10:15 -0700 (PDT) From: =?utf-8?q?Adri=C3=A1n_Larumbe?= To: ?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Boris Brezillon , Steven Price , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sumit Semwal , =?utf-8?q?Christian_K=C3=B6nig?= Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org Subject: [PATCH v3 3/4] drm/panthor: show device-wide list of DRM GEM objects over DebugFS Date: Thu, 27 Mar 2025 14:08:36 +0000 Message-ID: <20250327140845.105962-4-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250327140845.105962-1-adrian.larumbe@collabora.com> References: <20250327140845.105962-1-adrian.larumbe@collabora.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Add a device DebugFS file that displays a complete list of all the DRM GEM objects that are exposed to UM through a DRM handle. Since leaking object identifiers that might belong to a different NS is inadmissible, this functionality is only made available in debug builds with DEBUGFS support enabled. File format is that of a table, with each entry displaying a variety of fields with information about each GEM object. Each GEM object entry in the file displays the following information fields: Client PID, BO's global name, reference count, BO virtual size, BO resize size, VM address in its DRM-managed range, BO label and a flag bitmask. Signed-off-by: Adrián Larumbe --- drivers/gpu/drm/panthor/panthor_device.c | 5 + drivers/gpu/drm/panthor/panthor_device.h | 11 ++ drivers/gpu/drm/panthor/panthor_drv.c | 26 +++++ drivers/gpu/drm/panthor/panthor_gem.c | 130 +++++++++++++++++++++++ drivers/gpu/drm/panthor/panthor_gem.h | 29 +++++ 5 files changed, 201 insertions(+) diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c index a9da1d1eeb70..bae1a74d7111 100644 --- a/drivers/gpu/drm/panthor/panthor_device.c +++ b/drivers/gpu/drm/panthor/panthor_device.c @@ -263,6 +263,11 @@ int panthor_device_init(struct panthor_device *ptdev) pm_runtime_set_autosuspend_delay(ptdev->base.dev, 50); pm_runtime_use_autosuspend(ptdev->base.dev); +#ifdef CONFIG_DEBUG_FS + drmm_mutex_init(&ptdev->base, &ptdev->gems.lock); + INIT_LIST_HEAD(&ptdev->gems.node); +#endif + ret = drm_dev_register(&ptdev->base, 0); if (ret) goto err_disable_autosuspend; diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h index da6574021664..86206a961b38 100644 --- a/drivers/gpu/drm/panthor/panthor_device.h +++ b/drivers/gpu/drm/panthor/panthor_device.h @@ -205,6 +205,17 @@ struct panthor_device { /** @fast_rate: Maximum device clock frequency. Set by DVFS */ unsigned long fast_rate; + +#ifdef CONFIG_DEBUG_FS + /** @gems: Device-wide list of GEM objects owned by at least one file. */ + struct { + /** @gems.lock: Protects the device-wide list of GEM objects. */ + struct mutex lock; + + /** @node: Used to keep track of all the device's DRM objects */ + struct list_head node; + } gems; +#endif }; struct panthor_gpu_usage { diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c index 488d17466494..0ba68a51b4ef 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -1534,9 +1534,35 @@ static const struct file_operations panthor_drm_driver_fops = { }; #ifdef CONFIG_DEBUG_FS +static int panthor_gems_show(struct seq_file *m, void *data) +{ + struct drm_info_node *node = m->private; + struct drm_device *dev = node->minor->dev; + struct panthor_device *ptdev = container_of(dev, struct panthor_device, base); + + panthor_gem_debugfs_print_bos(ptdev, m); + + return 0; +} + + +static struct drm_info_list panthor_debugfs_list[] = { + {"gems", panthor_gems_show, 0, NULL}, +}; + +static int panthor_gems_debugfs_init(struct drm_minor *minor) +{ + drm_debugfs_create_files(panthor_debugfs_list, + ARRAY_SIZE(panthor_debugfs_list), + minor->debugfs_root, minor); + + return 0; +} + static void panthor_debugfs_init(struct drm_minor *minor) { panthor_mmu_debugfs_init(minor); + panthor_gems_debugfs_init(minor); } #endif diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c index 7d017f9d1d52..fbf560920194 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.c +++ b/drivers/gpu/drm/panthor/panthor_gem.c @@ -2,6 +2,7 @@ /* Copyright 2019 Linaro, Ltd, Rob Herring */ /* Copyright 2023 Collabora ltd. */ +#include #include #include #include @@ -13,11 +14,49 @@ #include "panthor_gem.h" #include "panthor_mmu.h" +#ifdef CONFIG_DEBUG_FS +static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) +{ + INIT_LIST_HEAD(&bo->gems.node); + bo->gems.creator.tgid = current->group_leader->pid; + get_task_comm(bo->gems.creator.process_name, current->group_leader); +} + +static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) +{ + struct panthor_device *ptdev = container_of(bo->base.base.dev, + struct panthor_device, base); + + mutex_lock(&ptdev->gems.lock); + list_add_tail(&bo->gems.node, &ptdev->gems.node); + mutex_unlock(&ptdev->gems.lock); +} + +static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) +{ + struct panthor_device *ptdev = container_of(bo->base.base.dev, + struct panthor_device, base); + + if (list_empty(&bo->gems.node)) + return; + + mutex_lock(&ptdev->gems.lock); + list_del_init(&bo->gems.node); + mutex_unlock(&ptdev->gems.lock); +} +#else +static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) {} +static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {} +static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {} +#endif + static void panthor_gem_free_object(struct drm_gem_object *obj) { struct panthor_gem_object *bo = to_panthor_bo(obj); struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem; + panthor_gem_debugfs_bo_rm(bo); + /* * Label might have been allocated with kstrdup_const(), * we need to take that into account when freeing the memory @@ -206,6 +245,8 @@ struct drm_gem_object *panthor_gem_create_object(struct drm_device *ddev, size_t drm_gem_gpuva_set_lock(&obj->base.base, &obj->gpuva_list_lock); mutex_init(&obj->label.lock); + panthor_gem_debugfs_bo_init(obj); + return &obj->base.base; } @@ -254,6 +295,8 @@ panthor_gem_create_with_handle(struct drm_file *file, /* drop reference from allocate - handle holds it now. */ drm_gem_object_put(&shmem->base); + panthor_gem_debugfs_bo_add(bo); + return ret; } @@ -285,3 +328,90 @@ panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label) panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL)); } + +#ifdef CONFIG_DEBUG_FS +static bool panfrost_gem_print_flag(const char *name, + bool is_set, + bool other_flags_printed, + struct seq_file *m) +{ + if (is_set) + seq_printf(m, "%s%s", other_flags_printed ? "," : "", name); + + return is_set | other_flags_printed; +} + +struct gem_size_totals { + size_t size; + size_t resident; + size_t reclaimable; +}; + +static void panthor_gem_debugfs_bo_print(struct panthor_gem_object *bo, + struct seq_file *m, + struct gem_size_totals *totals) +{ + unsigned int refcount = kref_read(&bo->base.base.refcount); + char creator_info[32] = {}; + bool has_flags = false; + size_t resident_size; + + /* Skip BOs being destroyed. */ + if (!refcount) + return; + + resident_size = bo->base.pages != NULL ? bo->base.base.size : 0; + + snprintf(creator_info, sizeof(creator_info), + "%s/%d", bo->gems.creator.process_name, bo->gems.creator.tgid); + seq_printf(m, "%-32s%-16d%-16d%-16zd%-16zd%-16lx", + creator_info, + bo->base.base.name, + refcount, + bo->base.base.size, + resident_size, + drm_vma_node_start(&bo->base.base.vma_node)); + + seq_puts(m, "("); + has_flags = panfrost_gem_print_flag("imported", bo->base.base.import_attach != NULL, + has_flags, m); + has_flags = panfrost_gem_print_flag("exported", bo->base.base.dma_buf != NULL, + has_flags, m); + if (bo->base.madv < 0) + has_flags = panfrost_gem_print_flag("purged", true, has_flags, m); + else if (bo->base.madv > 0) + has_flags = panfrost_gem_print_flag("purgeable", true, has_flags, m); + if (!has_flags) + seq_puts(m, "none"); + seq_puts(m, ")"); + + mutex_lock(&bo->label.lock); + seq_printf(m, "%-16s%-60s", "", bo->label.str ? : NULL); + mutex_unlock(&bo->label.lock); + seq_puts(m, "\n"); + + totals->size += bo->base.base.size; + totals->resident += resident_size; + if (bo->base.madv > 0) + totals->reclaimable += resident_size; +} + +void panthor_gem_debugfs_print_bos(struct panthor_device *ptdev, + struct seq_file *m) +{ + struct gem_size_totals totals = {0}; + struct panthor_gem_object *bo; + + seq_puts(m, "created-by global-name refcount size resident-size file-offset flags label\n"); + seq_puts(m, "------------------------------------------------------------------------------------------------------------------------------------------------\n"); + + scoped_guard(mutex, &ptdev->gems.lock) { + list_for_each_entry(bo, &ptdev->gems.node, gems.node) + panthor_gem_debugfs_bo_print(bo, m, &totals); + } + + seq_puts(m, "================================================================================================================================================\n"); + seq_printf(m, "Total size: %zd, Total resident: %zd, Total reclaimable: %zd\n", + totals.size, totals.resident, totals.reclaimable); +} +#endif diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h index 0582826b341a..7c896ec35801 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.h +++ b/drivers/gpu/drm/panthor/panthor_gem.h @@ -13,6 +13,26 @@ struct panthor_vm; +/** + * struct panthor_gem_debugfs - GEM object's DebugFS list information + */ +struct panthor_gem_debugfs { + /** + * @node: Node used to insert the object in the device-wide list of + * GEM objects, to display information about it through a DebugFS file. + */ + struct list_head node; + + /** @creator: Information about the UM process which created the GEM. */ + struct { + /** @creator.process_name: Group leader name in owning thread's process */ + char process_name[TASK_COMM_LEN]; + + /** @creator.tgid: PID of the thread's group leader within its process */ + pid_t tgid; + } creator; +}; + /** * struct panthor_gem_object - Driver specific GEM object. */ @@ -60,6 +80,10 @@ struct panthor_gem_object { /** @lock.str: Protects access to the @label.str field. */ struct mutex lock; } label; + +#ifdef CONFIG_DEBUG_FS + struct panthor_gem_debugfs gems; +#endif }; /** @@ -155,4 +179,9 @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo); +#ifdef CONFIG_DEBUG_FS +void panthor_gem_debugfs_print_bos(struct panthor_device *pfdev, + struct seq_file *m); +#endif + #endif /* __PANTHOR_GEM_H__ */ From patchwork Thu Mar 27 14:08:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Adri=C3=A1n_Larumbe?= X-Patchwork-Id: 14031178 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 42164C36010 for ; Thu, 27 Mar 2025 14:10:42 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 230D810E8E9; Thu, 27 Mar 2025 14:10:40 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="TC/gfFrI"; dkim-atps=neutral Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0C56810E8DE for ; Thu, 27 Mar 2025 14:10:33 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; t=1743084619; cv=none; d=zohomail.com; s=zohoarc; b=EpODsqB+uhIS3m+FtajyUBkj1eLo20uuvX7Zp5nAlPIjxZtj2n1CSEGE1wl0DxT9CkUI0chFZEZdde+NvNKuyhRz/NQjOuiJEoI69G9VfnAQiQMKbBplxJW9orET8lzsMFsSfdIsK5/D0wS3H6Wjx6b0EO0rbEXLuiJJdA0Gx9I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743084619; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=nrcg46tqZM6Jsi4nqwQjxLvX1XPelYZmMEvRF3bNsc4=; b=A+MdFevODd+7IDeLm+QnyM6vdcdCRUVBxa2saMkpNqkjjjAqlaogMwCevKCFGYcNQI8T5M+8vEeErUdbZzL6M2j8do69o0dSHcRgMMxXCARpKPf/LKvF6bQjNfcD0kSKNLsd4dorI4RrFoawNaynot4t6r0X9tmIF9IPjwhiU/M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1743084619; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=nrcg46tqZM6Jsi4nqwQjxLvX1XPelYZmMEvRF3bNsc4=; b=TC/gfFrIeIv56krCY3Ax9576vs4IefUjkHuASfkv7ITRoPgMLTwCV9y/dDu3fiEA TZjaGkvHmH5ulb3DD7adS4V9VRdtjSOlzJGBNxwYwXFKulhriWkMAcv1/dCWXeMv9mV DqcDrV7ERRdjqzs6pPzu0Z9uakANYd2a7C+Bpv90= Received: by mx.zohomail.com with SMTPS id 1743084618753168.38338198540464; Thu, 27 Mar 2025 07:10:18 -0700 (PDT) From: =?utf-8?q?Adri=C3=A1n_Larumbe?= To: ?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Boris Brezillon , Steven Price , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sumit Semwal , =?utf-8?q?Christian_K=C3=B6nig?= Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org Subject: [PATCH v3 4/4] drm/panthor: Display heap chunk entries in DebugFS GEMS file Date: Thu, 27 Mar 2025 14:08:37 +0000 Message-ID: <20250327140845.105962-5-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250327140845.105962-1-adrian.larumbe@collabora.com> References: <20250327140845.105962-1-adrian.larumbe@collabora.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Expand the driver's DebugFS GEMS file to display entries for the heap chunks' GEM objects, both those allocated at heap creation time through an ioctl(), or in response to a tiler OOM event. Signed-off-by: Adrián Larumbe --- drivers/gpu/drm/panthor/panthor_gem.c | 12 +----------- drivers/gpu/drm/panthor/panthor_gem.h | 14 ++++++++++++++ drivers/gpu/drm/panthor/panthor_heap.c | 3 +++ 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c index fbf560920194..efc14c179680 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.c +++ b/drivers/gpu/drm/panthor/panthor_gem.c @@ -22,16 +22,6 @@ static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) get_task_comm(bo->gems.creator.process_name, current->group_leader); } -static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) -{ - struct panthor_device *ptdev = container_of(bo->base.base.dev, - struct panthor_device, base); - - mutex_lock(&ptdev->gems.lock); - list_add_tail(&bo->gems.node, &ptdev->gems.node); - mutex_unlock(&ptdev->gems.lock); -} - static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) { struct panthor_device *ptdev = container_of(bo->base.base.dev, @@ -44,9 +34,9 @@ static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) list_del_init(&bo->gems.node); mutex_unlock(&ptdev->gems.lock); } + #else static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) {} -static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {} static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {} #endif diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h index 7c896ec35801..95093b98b990 100644 --- a/drivers/gpu/drm/panthor/panthor_gem.h +++ b/drivers/gpu/drm/panthor/panthor_gem.h @@ -11,6 +11,8 @@ #include #include +#include "panthor_device.h" + struct panthor_vm; /** @@ -182,6 +184,18 @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo); #ifdef CONFIG_DEBUG_FS void panthor_gem_debugfs_print_bos(struct panthor_device *pfdev, struct seq_file *m); + +static inline void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) +{ + struct panthor_device *ptdev = container_of(bo->base.base.dev, + struct panthor_device, base); + + mutex_lock(&ptdev->gems.lock); + list_add_tail(&bo->gems.node, &ptdev->gems.node); + mutex_unlock(&ptdev->gems.lock); +} +#elif +static inline void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {} #endif #endif /* __PANTHOR_GEM_H__ */ diff --git a/drivers/gpu/drm/panthor/panthor_heap.c b/drivers/gpu/drm/panthor/panthor_heap.c index db0285ce5812..30136b386869 100644 --- a/drivers/gpu/drm/panthor/panthor_heap.c +++ b/drivers/gpu/drm/panthor/panthor_heap.c @@ -180,6 +180,9 @@ static int panthor_alloc_heap_chunk(struct panthor_device *ptdev, heap->chunk_count++; mutex_unlock(&heap->lock); + panthor_gem_kernel_bo_set_label(chunk->bo, "Tiler heap chunk"); + panthor_gem_debugfs_bo_add(to_panthor_bo(chunk->bo->obj)); + return 0; err_destroy_bo: