mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
drm/xe: Use the filelist from drm for ccs_mode change
Drop the exclusive client count tracking and use the filelist from the
drm to track the active clients. This also ensures the clients created
internally by the driver won't block changing the ccs mode.
Fixes: ce8c161cba ("drm/xe: Add ref counting for xe_file")
Signed-off-by: Balasubramani Vivekanandan <balasubramani.vivekanandan@intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241008073628.377433-3-balasubramani.vivekanandan@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
This commit is contained in:
committed by
Lucas De Marchi
parent
23ea2c7572
commit
1c35f1ed1f
@@ -88,10 +88,6 @@ static int xe_file_open(struct drm_device *dev, struct drm_file *file)
|
||||
mutex_init(&xef->exec_queue.lock);
|
||||
xa_init_flags(&xef->exec_queue.xa, XA_FLAGS_ALLOC1);
|
||||
|
||||
spin_lock(&xe->clients.lock);
|
||||
xe->clients.count++;
|
||||
spin_unlock(&xe->clients.lock);
|
||||
|
||||
file->driver_priv = xef;
|
||||
kref_init(&xef->refcount);
|
||||
|
||||
@@ -108,17 +104,12 @@ static int xe_file_open(struct drm_device *dev, struct drm_file *file)
|
||||
static void xe_file_destroy(struct kref *ref)
|
||||
{
|
||||
struct xe_file *xef = container_of(ref, struct xe_file, refcount);
|
||||
struct xe_device *xe = xef->xe;
|
||||
|
||||
xa_destroy(&xef->exec_queue.xa);
|
||||
mutex_destroy(&xef->exec_queue.lock);
|
||||
xa_destroy(&xef->vm.xa);
|
||||
mutex_destroy(&xef->vm.lock);
|
||||
|
||||
spin_lock(&xe->clients.lock);
|
||||
xe->clients.count--;
|
||||
spin_unlock(&xe->clients.lock);
|
||||
|
||||
xe_drm_client_put(xef->client);
|
||||
kfree(xef->process_name);
|
||||
kfree(xef);
|
||||
@@ -334,7 +325,6 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
|
||||
xe->info.force_execlist = xe_modparam.force_execlist;
|
||||
|
||||
spin_lock_init(&xe->irq.lock);
|
||||
spin_lock_init(&xe->clients.lock);
|
||||
|
||||
init_waitqueue_head(&xe->ufence_wq);
|
||||
|
||||
|
||||
@@ -379,15 +379,6 @@ struct xe_device {
|
||||
struct workqueue_struct *wq;
|
||||
} sriov;
|
||||
|
||||
/** @clients: drm clients info */
|
||||
struct {
|
||||
/** @clients.lock: Protects drm clients info */
|
||||
spinlock_t lock;
|
||||
|
||||
/** @clients.count: number of drm clients */
|
||||
u64 count;
|
||||
} clients;
|
||||
|
||||
/** @usm: unified memory state */
|
||||
struct {
|
||||
/** @usm.asid: convert a ASID to VM */
|
||||
|
||||
@@ -139,9 +139,10 @@ ccs_mode_store(struct device *kdev, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
/* CCS mode can only be updated when there are no drm clients */
|
||||
spin_lock(&xe->clients.lock);
|
||||
if (xe->clients.count) {
|
||||
spin_unlock(&xe->clients.lock);
|
||||
mutex_lock(&xe->drm.filelist_mutex);
|
||||
if (!list_empty(&xe->drm.filelist)) {
|
||||
mutex_unlock(&xe->drm.filelist_mutex);
|
||||
xe_gt_dbg(gt, "Rejecting compute mode change as there are active drm clients\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@@ -152,7 +153,7 @@ ccs_mode_store(struct device *kdev, struct device_attribute *attr,
|
||||
xe_gt_reset_async(gt);
|
||||
}
|
||||
|
||||
spin_unlock(&xe->clients.lock);
|
||||
mutex_unlock(&xe->drm.filelist_mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user