rusticl/event: drop work item before updating status
authorKarol Herbst <kherbst@redhat.com>
Sat, 15 Apr 2023 01:48:16 +0000 (03:48 +0200)
committerMarge Bot <emma+marge@anholt.net>
Sat, 15 Apr 2023 21:07:01 +0000 (21:07 +0000)
This fixes some CTS compiler tests where they relied on the cl_kernel
object to be released in time so it can recompile a program without
throwing CL_INVALID_OPERATION due to still having active kernel objects.

Fixes: 47a80d7ff4f ("rusticl/event: proper eventing support")
Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22510>

src/gallium/frontends/rusticl/core/event.rs

index bc9ffe2..febcdc2 100644 (file)
@@ -29,6 +29,7 @@ struct EventMutState {
     status: cl_int,
     cbs: [Vec<(EventCB, *mut c_void)>; 3],
     fence: Option<PipeFence>,
+    work: Option<EventSig>,
 }
 
 #[repr(C)]
@@ -38,7 +39,6 @@ pub struct Event {
     pub queue: Option<Arc<Queue>>,
     pub cmd_type: cl_command_type,
     pub deps: Vec<Arc<Event>>,
-    work: Option<EventSig>,
     state: Mutex<EventMutState>,
     cv: Condvar,
 }
@@ -66,8 +66,8 @@ impl Event {
                 status: CL_QUEUED as cl_int,
                 cbs: [Vec::new(), Vec::new(), Vec::new()],
                 fence: None,
+                work: Some(work),
             }),
-            work: Some(work),
             cv: Condvar::new(),
         })
     }
@@ -83,8 +83,8 @@ impl Event {
                 status: CL_SUBMITTED as cl_int,
                 cbs: [Vec::new(), Vec::new(), Vec::new()],
                 fence: None,
+                work: None,
             }),
-            work: None,
             cv: Condvar::new(),
         })
     }
@@ -161,7 +161,8 @@ impl Event {
         let mut lock = self.state();
         let status = lock.status;
         if status == CL_QUEUED as cl_int {
-            let new = self.work.as_ref().map_or(
+            let work = lock.work.take();
+            let new = work.as_ref().map_or(
                 // if there is no work
                 CL_SUBMITTED as cl_int,
                 |w| {
@@ -174,6 +175,10 @@ impl Event {
                     res
                 },
             );
+            // we have to make sure that the work object is dropped before we notify about the
+            // status change. It's probably fine to move the value above, but we have to be
+            // absolutely sure it happens before the status update.
+            drop(work);
             self.set_status(&mut lock, new);
             new
         } else {