]> git.hungrycats.org Git - linux/commitdiff
drm/xe: Clean up VM / exec queue file lock usage.
authorMatthew Brost <matthew.brost@intel.com>
Sat, 21 Sep 2024 01:17:12 +0000 (18:17 -0700)
committerMatthew Brost <matthew.brost@intel.com>
Tue, 24 Sep 2024 16:03:42 +0000 (09:03 -0700)
Both the VM / exec queue file lock protect the lookup and reference to
the object, nothing more. These locks are not intended anything else
underneath them. XA have their own locking too, so no need to take the
VM / exec queue file lock aside from when doing a lookup and reference
get.

Add some kernel doc to make this clear and cleanup a few typos too.

Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240921011712.2681510-1-matthew.brost@intel.com
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_device_types.h
drivers/gpu/drm/xe/xe_drm_client.c
drivers/gpu/drm/xe/xe_exec_queue.c
drivers/gpu/drm/xe/xe_vm.c

index cb5a9fd820cf541144753c96a90524d31832c333..53dcece40fc52fe318e6d4c8c95203693535b283 100644 (file)
@@ -171,10 +171,8 @@ static void xe_file_close(struct drm_device *dev, struct drm_file *file)
                xe_exec_queue_kill(q);
                xe_exec_queue_put(q);
        }
-       mutex_lock(&xef->vm.lock);
        xa_for_each(&xef->vm.xa, idx, vm)
                xe_vm_close_and_put(vm);
-       mutex_unlock(&xef->vm.lock);
 
        xe_file_put(xef);
 
index 5ad96d283a7161ab4473017af180f8711c688493..484fb34dde980192e5b3c637ba81a687152e5e25 100644 (file)
@@ -593,15 +593,23 @@ struct xe_file {
        struct {
                /** @vm.xe: xarray to store VMs */
                struct xarray xa;
-               /** @vm.lock: protects file VM state */
+               /**
+                * @vm.lock: Protects VM lookup + reference and removal a from
+                * file xarray. Not an intended to be an outer lock which does
+                * thing while being held.
+                */
                struct mutex lock;
        } vm;
 
        /** @exec_queue: Submission exec queue state for file */
        struct {
-               /** @exec_queue.xe: xarray to store engines */
+               /** @exec_queue.xa: xarray to store exece queues */
                struct xarray xa;
-               /** @exec_queue.lock: protects file engine state */
+               /**
+                * @exec_queue.lock: Protects exec queue lookup + reference and
+                * removal a frommfile xarray. Not an intended to be an outer
+                * lock which does thing while being held.
+                */
                struct mutex lock;
        } exec_queue;
 
index c4add8b38bbd29ad53867d70aad5c0f3784b5127..fb52a23e28f84ef8b4d2a99a0a41164759158762 100644 (file)
@@ -283,8 +283,15 @@ static void show_run_ticks(struct drm_printer *p, struct drm_file *file)
 
        /* Accumulate all the exec queues from this client */
        mutex_lock(&xef->exec_queue.lock);
-       xa_for_each(&xef->exec_queue.xa, i, q)
+       xa_for_each(&xef->exec_queue.xa, i, q) {
+               xe_exec_queue_get(q);
+               mutex_unlock(&xef->exec_queue.lock);
+
                xe_exec_queue_update_run_ticks(q);
+
+               mutex_lock(&xef->exec_queue.lock);
+               xe_exec_queue_put(q);
+       }
        mutex_unlock(&xef->exec_queue.lock);
 
        /* Get the total GPU cycles */
index 7f28b7fc68d58d1a57f21a708450cf26ebd2972f..7743ebdcbf4b9a4c051133e57970a265a94e0026 100644 (file)
@@ -635,9 +635,7 @@ int xe_exec_queue_create_ioctl(struct drm_device *dev, void *data,
                }
        }
 
-       mutex_lock(&xef->exec_queue.lock);
        err = xa_alloc(&xef->exec_queue.xa, &id, q, xa_limit_32b, GFP_KERNEL);
-       mutex_unlock(&xef->exec_queue.lock);
        if (err)
                goto kill_exec_queue;
 
index a3d7cb7cfd229df6c986d9aff0b025e60e921cd7..31fe31db3fdcadc75bc895bdaec8151078f6f142 100644 (file)
@@ -1765,9 +1765,7 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
        if (IS_ERR(vm))
                return PTR_ERR(vm);
 
-       mutex_lock(&xef->vm.lock);
        err = xa_alloc(&xef->vm.xa, &id, vm, xa_limit_32b, GFP_KERNEL);
-       mutex_unlock(&xef->vm.lock);
        if (err)
                goto err_close_and_put;
 
@@ -1799,9 +1797,7 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
        return 0;
 
 err_free_id:
-       mutex_lock(&xef->vm.lock);
        xa_erase(&xef->vm.xa, id);
-       mutex_unlock(&xef->vm.lock);
 err_close_and_put:
        xe_vm_close_and_put(vm);