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>
(cherry picked from commit 60cfe15d79)
This commit is contained in:
Karol Herbst 2023-04-15 03:48:16 +02:00 committed by Dylan Baker
parent 4ee849dd06
commit c18c0e2ee1
2 changed files with 10 additions and 5 deletions

View File

@ -2424,7 +2424,7 @@
"description": "rusticl/event: drop work item before updating status",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "47a80d7ff4f966e3839640efd5f9d75e36af8906",
"notes": null

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 {