Module: Mesa Branch: main Commit: 60cfe15d799fdc5a57a691844cc30e49b3f74a47 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=60cfe15d799fdc5a57a691844cc30e49b3f74a47
Author: Karol Herbst <[email protected]> Date: Sat Apr 15 03:48:16 2023 +0200 rusticl/event: drop work item before updating status 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 <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22510> --- src/gallium/frontends/rusticl/core/event.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/gallium/frontends/rusticl/core/event.rs b/src/gallium/frontends/rusticl/core/event.rs index bc9ffe28204..febcdc27fef 100644 --- a/src/gallium/frontends/rusticl/core/event.rs +++ b/src/gallium/frontends/rusticl/core/event.rs @@ -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 {
