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: 47a80d7ff4 ("rusticl/event: proper eventing support")
Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22510>
This commit is contained in:
Karol Herbst
2023-04-15 03:48:16 +02:00
committed by Marge Bot
parent 00b9685d96
commit 60cfe15d79
+9 -4
View 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 {