diff options
author | Tejas Upadhyay <tejas.upadhyay@intel.com> | 2023-09-14 17:25:14 +0530 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2023-12-21 11:41:14 -0500 |
commit | 8f965392c4d915195307979640295189eec94df4 (patch) | |
tree | a0ac3d18ee4a1a64878079e00536a0371ccf5d79 /drivers/gpu | |
parent | cb90d469183cc8335d646484d66bd3c3643683cc (diff) | |
download | lwn-8f965392c4d915195307979640295189eec94df4.tar.gz lwn-8f965392c4d915195307979640295189eec94df4.zip |
drm/xe: Add drm-client infrastructure
Add drm-client infrastructure to record stats of consumption
done by individual drm client.
V2:
- Typo - CI
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/xe/Makefile | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/xe/xe_device.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/xe/xe_device_types.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/xe/xe_drm_client.c | 52 | ||||
-rw-r--r-- | drivers/gpu/drm/xe/xe_drm_client.h | 43 |
5 files changed, 116 insertions, 1 deletions
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile index d3b97bc11af7..9be0848ea370 100644 --- a/drivers/gpu/drm/xe/Makefile +++ b/drivers/gpu/drm/xe/Makefile @@ -54,6 +54,7 @@ xe-y += xe_bb.o \ xe_device.o \ xe_device_sysfs.o \ xe_dma_buf.o \ + xe_drm_client.o \ xe_exec.o \ xe_execlist.o \ xe_exec_queue.o \ diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c index 89bf926bc0f3..612dfc92e948 100644 --- a/drivers/gpu/drm/xe/xe_device.c +++ b/drivers/gpu/drm/xe/xe_device.c @@ -17,6 +17,7 @@ #include "xe_bo.h" #include "xe_debugfs.h" #include "xe_dma_buf.h" +#include "xe_drm_client.h" #include "xe_drv.h" #include "xe_exec_queue.h" #include "xe_exec.h" @@ -42,13 +43,24 @@ struct lockdep_map xe_device_mem_access_lockdep_map = { static int xe_file_open(struct drm_device *dev, struct drm_file *file) { + struct xe_device *xe = to_xe_device(dev); + struct xe_drm_client *client; struct xe_file *xef; + int ret = -ENOMEM; xef = kzalloc(sizeof(*xef), GFP_KERNEL); if (!xef) - return -ENOMEM; + return ret; + + client = xe_drm_client_alloc(); + if (!client) { + kfree(xef); + return ret; + } xef->drm = file; + xef->client = client; + xef->xe = xe; mutex_init(&xef->vm.lock); xa_init_flags(&xef->vm.xa, XA_FLAGS_ALLOC1); @@ -88,6 +100,7 @@ static void xe_file_close(struct drm_device *dev, struct drm_file *file) xa_destroy(&xef->vm.xa); mutex_destroy(&xef->vm.lock); + xe_drm_client_put(xef->client); kfree(xef); } diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h index 496d7f3fb897..d748d71bb536 100644 --- a/drivers/gpu/drm/xe/xe_device_types.h +++ b/drivers/gpu/drm/xe/xe_device_types.h @@ -356,6 +356,9 @@ struct xe_device { * struct xe_file - file handle for XE driver */ struct xe_file { + /** @xe: xe DEVICE **/ + struct xe_device *xe; + /** @drm: base DRM file */ struct drm_file *drm; @@ -374,6 +377,9 @@ struct xe_file { /** @lock: protects file engine state */ struct mutex lock; } exec_queue; + + /** @client: drm client */ + struct xe_drm_client *client; }; #endif diff --git a/drivers/gpu/drm/xe/xe_drm_client.c b/drivers/gpu/drm/xe/xe_drm_client.c new file mode 100644 index 000000000000..1558ca4e0eb7 --- /dev/null +++ b/drivers/gpu/drm/xe/xe_drm_client.c @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2023 Intel Corporation + */ + +#include <drm/drm_print.h> +#include <linux/kernel.h> +#include <linux/slab.h> +#include <linux/types.h> + +#include "xe_device_types.h" +#include "xe_drm_client.h" + +/** + * xe_drm_client_alloc() - Allocate drm client + * @void: No arg + * + * Allocate drm client struct to track client memory against + * same till client life. Call this API whenever new client + * has opened xe device. + * + * Return: pointer to client struct or NULL if can't allocate + */ +struct xe_drm_client *xe_drm_client_alloc(void) +{ + struct xe_drm_client *client; + + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client) + return NULL; + + kref_init(&client->kref); + + return client; +} + +/** + * __xe_drm_client_free() - Free client struct + * @kref: The reference + * + * This frees client struct. Call this API when xe device is closed + * by drm client. + * + * Return: void + */ +void __xe_drm_client_free(struct kref *kref) +{ + struct xe_drm_client *client = + container_of(kref, typeof(*client), kref); + + kfree(client); +} diff --git a/drivers/gpu/drm/xe/xe_drm_client.h b/drivers/gpu/drm/xe/xe_drm_client.h new file mode 100644 index 000000000000..be097cdf5d12 --- /dev/null +++ b/drivers/gpu/drm/xe/xe_drm_client.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright © 2023 Intel Corporation + */ + +#ifndef _XE_DRM_CLIENT_H_ +#define _XE_DRM_CLIENT_H_ + +#include <linux/kref.h> +#include <linux/list.h> +#include <linux/pid.h> +#include <linux/rcupdate.h> +#include <linux/sched.h> +#include <linux/spinlock.h> + +struct drm_file; +struct drm_printer; + +struct xe_drm_client { + struct kref kref; + unsigned int id; +}; + + static inline struct xe_drm_client * +xe_drm_client_get(struct xe_drm_client *client) +{ + kref_get(&client->kref); + return client; +} + +void __xe_drm_client_free(struct kref *kref); + +static inline void xe_drm_client_put(struct xe_drm_client *client) +{ + kref_put(&client->kref, __xe_drm_client_free); +} + +struct xe_drm_client *xe_drm_client_alloc(void); +static inline struct xe_drm_client * +xe_drm_client_get(struct xe_drm_client *client); +static inline void xe_drm_client_put(struct xe_drm_client *client); + +#endif |