Commit 8f965392 authored by Tejas Upadhyay's avatar Tejas Upadhyay Committed by Rodrigo Vivi

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: default avatarHimal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: default avatarTejas Upadhyay <tejas.upadhyay@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent cb90d469
......@@ -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
// 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);
}
/* 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment