From c5647cae2704e58d1c4e5fedbf63f11bca6376c9 Mon Sep 17 00:00:00 2001 From: Harshit Mogalapalli Date: Mon, 13 Mar 2023 22:27:11 -0700 Subject: drm/lima/lima_drv: Add missing unwind goto in lima_pdev_probe() Smatch reports: drivers/gpu/drm/lima/lima_drv.c:396 lima_pdev_probe() warn: missing unwind goto? Store return value in err and goto 'err_out0' which has lima_sched_slab_fini() before returning. Fixes: a1d2a6339961 ("drm/lima: driver for ARM Mali4xx GPUs") Signed-off-by: Harshit Mogalapalli Signed-off-by: Qiang Yu Link: https://patchwork.freedesktop.org/patch/msgid/20230314052711.4061652-1-harshit.m.mogalapalli@oracle.com --- drivers/gpu/drm/lima/lima_drv.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/drm/lima/lima_drv.c') diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c index 7b8d7178d09a..39cab4a55f57 100644 --- a/drivers/gpu/drm/lima/lima_drv.c +++ b/drivers/gpu/drm/lima/lima_drv.c @@ -392,8 +392,10 @@ static int lima_pdev_probe(struct platform_device *pdev) /* Allocate and initialize the DRM device. */ ddev = drm_dev_alloc(&lima_drm_driver, &pdev->dev); - if (IS_ERR(ddev)) - return PTR_ERR(ddev); + if (IS_ERR(ddev)) { + err = PTR_ERR(ddev); + goto err_out0; + } ddev->dev_private = ldev; ldev->ddev = ddev; -- cgit v1.2.3 From 87767de835edf527b879a363d518c33da68adb81 Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Mon, 13 Mar 2023 00:30:51 +0100 Subject: drm/lima: allocate unique id per drm_file To track if fds are pointing to the same execution context and export the expected information to fdinfo, similar to what is done in other drivers. Signed-off-by: Erico Nunes Signed-off-by: Qiang Yu Link: https://patchwork.freedesktop.org/patch/msgid/20230312233052.21095-3-nunes.erico@gmail.com --- drivers/gpu/drm/lima/lima_device.h | 3 +++ drivers/gpu/drm/lima/lima_drv.c | 12 ++++++++++++ drivers/gpu/drm/lima/lima_drv.h | 1 + 3 files changed, 16 insertions(+) (limited to 'drivers/gpu/drm/lima/lima_drv.c') diff --git a/drivers/gpu/drm/lima/lima_device.h b/drivers/gpu/drm/lima/lima_device.h index 41b9d7b4bcc7..71b2db60d161 100644 --- a/drivers/gpu/drm/lima/lima_device.h +++ b/drivers/gpu/drm/lima/lima_device.h @@ -106,6 +106,9 @@ struct lima_device { struct lima_dump_head dump; struct list_head error_task_list; struct mutex error_task_list_lock; + + struct xarray active_contexts; + u32 next_context_id; }; static inline struct lima_device * diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c index 39cab4a55f57..f456a471216b 100644 --- a/drivers/gpu/drm/lima/lima_drv.c +++ b/drivers/gpu/drm/lima/lima_drv.c @@ -218,6 +218,11 @@ static int lima_drm_driver_open(struct drm_device *dev, struct drm_file *file) if (!priv) return -ENOMEM; + err = xa_alloc_cyclic(&ldev->active_contexts, &priv->id, priv, + xa_limit_32b, &ldev->next_context_id, GFP_KERNEL); + if (err < 0) + goto err_out0; + priv->vm = lima_vm_create(ldev); if (!priv->vm) { err = -ENOMEM; @@ -237,6 +242,9 @@ err_out0: static void lima_drm_driver_postclose(struct drm_device *dev, struct drm_file *file) { struct lima_drm_priv *priv = file->driver_priv; + struct lima_device *ldev = to_lima_dev(dev); + + xa_erase(&ldev->active_contexts, priv->id); lima_ctx_mgr_fini(&priv->ctx_mgr); lima_vm_put(priv->vm); @@ -388,6 +396,8 @@ static int lima_pdev_probe(struct platform_device *pdev) ldev->dev = &pdev->dev; ldev->id = (enum lima_gpu_id)of_device_get_match_data(&pdev->dev); + xa_init_flags(&ldev->active_contexts, XA_FLAGS_ALLOC); + platform_set_drvdata(pdev, ldev); /* Allocate and initialize the DRM device. */ @@ -446,6 +456,8 @@ static int lima_pdev_remove(struct platform_device *pdev) struct lima_device *ldev = platform_get_drvdata(pdev); struct drm_device *ddev = ldev->ddev; + xa_destroy(&ldev->active_contexts); + sysfs_remove_bin_file(&ldev->dev->kobj, &lima_error_state_attr); drm_dev_unregister(ddev); diff --git a/drivers/gpu/drm/lima/lima_drv.h b/drivers/gpu/drm/lima/lima_drv.h index c738d288547b..e49b7ab651d0 100644 --- a/drivers/gpu/drm/lima/lima_drv.h +++ b/drivers/gpu/drm/lima/lima_drv.h @@ -20,6 +20,7 @@ struct lima_sched_task; struct drm_lima_gem_submit_bo; struct lima_drm_priv { + int id; struct lima_vm *vm; struct lima_ctx_mgr ctx_mgr; }; -- cgit v1.2.3 From 4a66f3da99dcb4dcbd28544110636b50adfb0f0d Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Mon, 13 Mar 2023 00:30:52 +0100 Subject: drm/lima: add show_fdinfo for drm usage stats This exposes an accumulated active time per client via the fdinfo infrastructure per execution engine, following Documentation/gpu/drm-usage-stats.rst. In lima, the exposed execution engines are gp and pp. Signed-off-by: Erico Nunes Signed-off-by: Qiang Yu Link: https://patchwork.freedesktop.org/patch/msgid/20230312233052.21095-4-nunes.erico@gmail.com --- drivers/gpu/drm/lima/lima_drv.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/drm/lima/lima_drv.c') diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c index f456a471216b..3420875d6fc6 100644 --- a/drivers/gpu/drm/lima/lima_drv.c +++ b/drivers/gpu/drm/lima/lima_drv.c @@ -261,7 +261,36 @@ static const struct drm_ioctl_desc lima_drm_driver_ioctls[] = { DRM_IOCTL_DEF_DRV(LIMA_CTX_FREE, lima_ioctl_ctx_free, DRM_RENDER_ALLOW), }; -DEFINE_DRM_GEM_FOPS(lima_drm_driver_fops); +static void lima_drm_driver_show_fdinfo(struct seq_file *m, struct file *filp) +{ + struct drm_file *file = filp->private_data; + struct drm_device *dev = file->minor->dev; + struct lima_device *ldev = to_lima_dev(dev); + struct lima_drm_priv *priv = file->driver_priv; + struct lima_ctx_mgr *ctx_mgr = &priv->ctx_mgr; + u64 usage[lima_pipe_num]; + + lima_ctx_mgr_usage(ctx_mgr, usage); + + /* + * For a description of the text output format used here, see + * Documentation/gpu/drm-usage-stats.rst. + */ + seq_printf(m, "drm-driver:\t%s\n", dev->driver->name); + seq_printf(m, "drm-client-id:\t%u\n", priv->id); + for (int i = 0; i < lima_pipe_num; i++) { + struct lima_sched_pipe *pipe = &ldev->pipe[i]; + struct drm_gpu_scheduler *sched = &pipe->base; + + seq_printf(m, "drm-engine-%s:\t%llu ns\n", sched->name, usage[i]); + } +} + +static const struct file_operations lima_drm_driver_fops = { + .owner = THIS_MODULE, + DRM_GEM_FOPS, + .show_fdinfo = lima_drm_driver_show_fdinfo, +}; /* * Changelog: -- cgit v1.2.3 From 7e4d0b09a9f268dad595c3ea92d692a14389131a Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Tue, 4 Apr 2023 08:25:59 +0800 Subject: Revert "drm/lima: add show_fdinfo for drm usage stats" This reverts commit 4a66f3da99dcb4dcbd28544110636b50adfb0f0d. This is due to the depend commit has been reverted on upstream: commit baad10973fdb ("Revert "drm/scheduler: track GPU active time per entity"") Acked-by: Emil Velikov Signed-off-by: Qiang Yu Link: https://patchwork.freedesktop.org/patch/msgid/20230404002601.24136-2-yq882255@163.com --- drivers/gpu/drm/lima/lima_drv.c | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) (limited to 'drivers/gpu/drm/lima/lima_drv.c') diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c index 3420875d6fc6..f456a471216b 100644 --- a/drivers/gpu/drm/lima/lima_drv.c +++ b/drivers/gpu/drm/lima/lima_drv.c @@ -261,36 +261,7 @@ static const struct drm_ioctl_desc lima_drm_driver_ioctls[] = { DRM_IOCTL_DEF_DRV(LIMA_CTX_FREE, lima_ioctl_ctx_free, DRM_RENDER_ALLOW), }; -static void lima_drm_driver_show_fdinfo(struct seq_file *m, struct file *filp) -{ - struct drm_file *file = filp->private_data; - struct drm_device *dev = file->minor->dev; - struct lima_device *ldev = to_lima_dev(dev); - struct lima_drm_priv *priv = file->driver_priv; - struct lima_ctx_mgr *ctx_mgr = &priv->ctx_mgr; - u64 usage[lima_pipe_num]; - - lima_ctx_mgr_usage(ctx_mgr, usage); - - /* - * For a description of the text output format used here, see - * Documentation/gpu/drm-usage-stats.rst. - */ - seq_printf(m, "drm-driver:\t%s\n", dev->driver->name); - seq_printf(m, "drm-client-id:\t%u\n", priv->id); - for (int i = 0; i < lima_pipe_num; i++) { - struct lima_sched_pipe *pipe = &ldev->pipe[i]; - struct drm_gpu_scheduler *sched = &pipe->base; - - seq_printf(m, "drm-engine-%s:\t%llu ns\n", sched->name, usage[i]); - } -} - -static const struct file_operations lima_drm_driver_fops = { - .owner = THIS_MODULE, - DRM_GEM_FOPS, - .show_fdinfo = lima_drm_driver_show_fdinfo, -}; +DEFINE_DRM_GEM_FOPS(lima_drm_driver_fops); /* * Changelog: -- cgit v1.2.3 From 4ad17bf571730475bf62290399d52b26ece8228c Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Tue, 4 Apr 2023 08:26:00 +0800 Subject: Revert "drm/lima: allocate unique id per drm_file" This reverts commit 87767de835edf527b879a363d518c33da68adb81. This is due to the depend commit has been reverted on upstream: commit baad10973fdb ("Revert "drm/scheduler: track GPU active time per entity"") Acked-by: Emil Velikov Signed-off-by: Qiang Yu Link: https://patchwork.freedesktop.org/patch/msgid/20230404002601.24136-3-yq882255@163.com --- drivers/gpu/drm/lima/lima_device.h | 3 --- drivers/gpu/drm/lima/lima_drv.c | 12 ------------ drivers/gpu/drm/lima/lima_drv.h | 1 - 3 files changed, 16 deletions(-) (limited to 'drivers/gpu/drm/lima/lima_drv.c') diff --git a/drivers/gpu/drm/lima/lima_device.h b/drivers/gpu/drm/lima/lima_device.h index 71b2db60d161..41b9d7b4bcc7 100644 --- a/drivers/gpu/drm/lima/lima_device.h +++ b/drivers/gpu/drm/lima/lima_device.h @@ -106,9 +106,6 @@ struct lima_device { struct lima_dump_head dump; struct list_head error_task_list; struct mutex error_task_list_lock; - - struct xarray active_contexts; - u32 next_context_id; }; static inline struct lima_device * diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c index f456a471216b..39cab4a55f57 100644 --- a/drivers/gpu/drm/lima/lima_drv.c +++ b/drivers/gpu/drm/lima/lima_drv.c @@ -218,11 +218,6 @@ static int lima_drm_driver_open(struct drm_device *dev, struct drm_file *file) if (!priv) return -ENOMEM; - err = xa_alloc_cyclic(&ldev->active_contexts, &priv->id, priv, - xa_limit_32b, &ldev->next_context_id, GFP_KERNEL); - if (err < 0) - goto err_out0; - priv->vm = lima_vm_create(ldev); if (!priv->vm) { err = -ENOMEM; @@ -242,9 +237,6 @@ err_out0: static void lima_drm_driver_postclose(struct drm_device *dev, struct drm_file *file) { struct lima_drm_priv *priv = file->driver_priv; - struct lima_device *ldev = to_lima_dev(dev); - - xa_erase(&ldev->active_contexts, priv->id); lima_ctx_mgr_fini(&priv->ctx_mgr); lima_vm_put(priv->vm); @@ -396,8 +388,6 @@ static int lima_pdev_probe(struct platform_device *pdev) ldev->dev = &pdev->dev; ldev->id = (enum lima_gpu_id)of_device_get_match_data(&pdev->dev); - xa_init_flags(&ldev->active_contexts, XA_FLAGS_ALLOC); - platform_set_drvdata(pdev, ldev); /* Allocate and initialize the DRM device. */ @@ -456,8 +446,6 @@ static int lima_pdev_remove(struct platform_device *pdev) struct lima_device *ldev = platform_get_drvdata(pdev); struct drm_device *ddev = ldev->ddev; - xa_destroy(&ldev->active_contexts); - sysfs_remove_bin_file(&ldev->dev->kobj, &lima_error_state_attr); drm_dev_unregister(ddev); diff --git a/drivers/gpu/drm/lima/lima_drv.h b/drivers/gpu/drm/lima/lima_drv.h index e49b7ab651d0..c738d288547b 100644 --- a/drivers/gpu/drm/lima/lima_drv.h +++ b/drivers/gpu/drm/lima/lima_drv.h @@ -20,7 +20,6 @@ struct lima_sched_task; struct drm_lima_gem_submit_bo; struct lima_drm_priv { - int id; struct lima_vm *vm; struct lima_ctx_mgr ctx_mgr; }; -- cgit v1.2.3