mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 03:24:19 +02:00
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>
This commit is contained in:
parent
cb90d46918
commit
8f965392c4
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
52
drivers/gpu/drm/xe/xe_drm_client.c
Normal file
52
drivers/gpu/drm/xe/xe_drm_client.c
Normal file
|
|
@ -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);
|
||||
}
|
||||
43
drivers/gpu/drm/xe/xe_drm_client.h
Normal file
43
drivers/gpu/drm/xe/xe_drm_client.h
Normal file
|
|
@ -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
|
||||
Loading…
Reference in New Issue
Block a user