[PATCH v2 1/8] [ANDROID]: Add a new xe_user structure
Matthew Brost
matthew.brost at intel.com
Fri Aug 22 17:01:25 UTC 2025
On Fri, Aug 22, 2025 at 11:48:54AM -0400, Rodrigo Vivi wrote:
> On Fri, Aug 22, 2025 at 08:59:23AM +0000, Aakash Deep Sarkar wrote:
> > For Android GPU work period event we need to track the runtime
> > on the GPU for each user id. This means we can have multiple
> > xe files opened by different processes/threads belonging to
> > the same user id. All these xe files need to be grouped together
> > so that one can easily identify these while calculating the
> > run time for the given user id.
> >
> > Currently, the xe driver doesn't record the user id of the
> > calling process. Also, all the xe files created using open
> > call are clubbed together inside the xe device structure
> > with no way to distinguish between them based on the user id
> > of the calling process.
>
> I thought I had already given this feedback, but I'm not sure if
> I forgot or if I was just ignored. I'm sorry either way.
>
> Android is not a justification. Please keep 'Android' mentions
> and ralated 'Android' justifications in the cover letter ONLY!
>
> The patch needs to make sense by itself. The patch needs to make
> sense in the currently linux upstream.
>
So what are the rules here? There is another series [1] floating around
with a justification that Android needs this. Does that mean we can't
accept any Andriod only code upstream?
Matt
[1] https://patchwork.freedesktop.org/series/152701/
> This also means no --subject-prefix=ANDROID.
>
> Please!
>
> >
> > To remedy these limitations we are adding another layer of
> > indirection between xe device and xe file. xe device will
> > now have a list of xe users each with a given user id; and each
> > xe user will have a list of xe files each of which is created
> > by a process that is associated with this user id.
> >
> > The lifetime of the xe user structure should be between when
> > a process with a new user id has opened the xe device; and when
> > the last xe file belonging to this user id is closed.
> >
> > Signed-off-by: Aakash Deep Sarkar <aakash.deep.sarkar at intel.com>
> > ---
> > drivers/gpu/drm/xe/Makefile | 2 +
> > drivers/gpu/drm/xe/xe_user.c | 59 ++++++++++++++++++++++++++
> > drivers/gpu/drm/xe/xe_user.h | 81 ++++++++++++++++++++++++++++++++++++
> > 3 files changed, 142 insertions(+)
> > create mode 100644 drivers/gpu/drm/xe/xe_user.c
> > create mode 100644 drivers/gpu/drm/xe/xe_user.h
> >
> > diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> > index 8e0c3412a757..89212fc7ef44 100644
> > --- a/drivers/gpu/drm/xe/Makefile
> > +++ b/drivers/gpu/drm/xe/Makefile
> > @@ -325,6 +325,8 @@ ifeq ($(CONFIG_DEBUG_FS),y)
> >
> > xe-$(CONFIG_PCI_IOV) += xe_gt_sriov_pf_debugfs.o
> >
> > + xe-y += xe_user.o
> > +
> > xe-$(CONFIG_DRM_XE_DISPLAY) += \
> > i915-display/intel_display_debugfs.o \
> > i915-display/intel_display_debugfs_params.o \
> > diff --git a/drivers/gpu/drm/xe/xe_user.c b/drivers/gpu/drm/xe/xe_user.c
> > new file mode 100644
> > index 000000000000..8c285a68115a
> > --- /dev/null
> > +++ b/drivers/gpu/drm/xe/xe_user.c
> > @@ -0,0 +1,59 @@
> > +// SPDX-License-Identifier: MIT
> > +/*
> > + * Copyright © 2023 Intel Corporation
> > + */
> > +
> > +#include <linux/slab.h>
> > +
> > +#include "xe_user.h"
> > +
> > +/**
> > + * worker thread to emit gpu work period event for this xe user
> > + * @work: work instance for this xe user
> > + *
> > + * Return: void
> > + */
> > +static inline void work_period_worker(struct work_struct *work)
> > +{
> > + //TODO: Implement this worker
> > +}
> > +
> > +/**
> > + * xe_user_alloc() - Allocate xe user
> > + * @void: No arg
> > + *
> > + * Allocate xe user struct to track activity on the gpu
> > + * by the application. Call this API whenever a new app
> > + * has opened xe device.
> > + *
> > + * Return: pointer to user struct or NULL if can't allocate
> > + */
> > +struct xe_user *xe_user_alloc(void)
> > +{
> > + struct xe_user *user;
> > +
> > + user = kzalloc(sizeof(*user), GFP_KERNEL);
> > + if (!user)
> > + return NULL;
> > +
> > + kref_init(&user->refcount);
> > + mutex_init(&user->filelist_lock);
> > + INIT_LIST_HEAD(&user->filelist);
> > + //TODO: Add a hook into xe device
> > + INIT_WORK(&user->work, work_period_worker);
> > + return user;
> > +}
> > +
> > +/**
> > + * __xe_user_free() - Free user struct
> > + * @kref: The reference
> > + *
> > + * Return: void
> > + */
> > +void __xe_user_free(struct kref *kref)
> > +{
> > + struct xe_user *user =
> > + container_of(kref, struct xe_user, refcount);
> > +
> > + kfree(user);
> > +}
> > diff --git a/drivers/gpu/drm/xe/xe_user.h b/drivers/gpu/drm/xe/xe_user.h
> > new file mode 100644
> > index 000000000000..e52f66d3f3b0
> > --- /dev/null
> > +++ b/drivers/gpu/drm/xe/xe_user.h
> > @@ -0,0 +1,81 @@
> > +/* SPDX-License-Identifier: MIT */
> > +/*
> > + * Copyright © 2023 Intel Corporation
> > + */
> > +
> > +#ifndef _XE_USER_H_
> > +#define _XE_USER_H_
> > +
> > +#include <linux/kref.h>
> > +#include <linux/list.h>
> > +#include <linux/workqueue.h>
> > +
> > +/**
> > + * This is a per process/user id structure for a xe device
> > + * client. It is allocated when a new process/app opens the
> > + * xe device and destroyed when the last xe file belonging
> > + * to this user id is destroyed.
> > + */
> > +struct xe_user {
> > + /**
> > + * @refcount: reference count
> > + */
> > + struct kref refcount;
> > +
> > + /**
> > + * @xe: pointer to the xe_device
> > + */
> > + struct xe_device *xe;
> > +
> > + /**
> > + * @filelist_lock: lock protecting the filelist
> > + */
> > + struct mutex filelist_lock;
> > +
> > + /**
> > + * @filelist: list of xe files belonging to this xe user
> > + */
> > + struct list_head filelist;
> > +
> > + /**
> > + * @work: work to emit the gpu work period event for this
> > + * xe user
> > + */
> > + struct work_struct work;
> > +
> > + /**
> > + * @uid: user id for this xe_user
> > + */
> > + u32 uid;
> > +
> > + /**
> > + * @active_duration_ns: sum total of xe_file.active_duration_ns
> > + * for all xe files belonging to this xe user
> > + */
> > + u64 active_duration_ns;
> > +
> > + /**
> > + * @last_timestamp_ns: timestamp in ns when we last emitted event
> > + * for this xe user
> > + */
> > + u64 last_timestamp_ns;
> > +};
> > +
> > +struct xe_user *xe_user_alloc(void);
> > +
> > +static inline struct xe_user *
> > +xe_user_get(struct xe_user *user)
> > +{
> > + kref_get(&user->refcount);
> > + return user;
> > +}
> > +
> > +void __xe_user_free(struct kref *kref);
> > +
> > +static inline void xe_user_put(struct xe_user *user)
> > +{
> > + kref_put(&user->refcount, __xe_user_free);
> > +}
> > +
> > +#endif // _XE_USER_H_
> > +
> > --
> > 2.49.0
> >
More information about the Intel-xe
mailing list