rusticl/queue: add a life check to prevent applications dead locking
Cc: mesa-stable
Reviewed-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit ccfeda77bd
)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33113>
This commit is contained in:

committed by
Dylan Baker

parent
ded1ec58f7
commit
32a93c197e
@@ -104,7 +104,7 @@
|
|||||||
"description": "rusticl/queue: add a life check to prevent applications dead locking",
|
"description": "rusticl/queue: add a life check to prevent applications dead locking",
|
||||||
"nominated": true,
|
"nominated": true,
|
||||||
"nomination_type": 1,
|
"nomination_type": 1,
|
||||||
"resolution": 0,
|
"resolution": 1,
|
||||||
"main_sha": null,
|
"main_sha": null,
|
||||||
"because_sha": null,
|
"because_sha": null,
|
||||||
"notes": null
|
"notes": null
|
||||||
|
@@ -212,6 +212,14 @@ impl Event {
|
|||||||
.wait_timeout(lock, Duration::from_secs(1))
|
.wait_timeout(lock, Duration::from_secs(1))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.0;
|
.0;
|
||||||
|
|
||||||
|
if let Some(queue) = &self.queue {
|
||||||
|
// in case the queue worker thread exited abnormally we'll need to stop spinning on
|
||||||
|
// the cv here, because otherwise we'll end up spinning endlessly.
|
||||||
|
if queue.is_dead() {
|
||||||
|
return CL_OUT_OF_HOST_MEMORY;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
lock.status
|
lock.status
|
||||||
}
|
}
|
||||||
|
@@ -88,7 +88,7 @@ pub struct Queue {
|
|||||||
pub props: cl_command_queue_properties,
|
pub props: cl_command_queue_properties,
|
||||||
pub props_v2: Option<Properties<cl_queue_properties>>,
|
pub props_v2: Option<Properties<cl_queue_properties>>,
|
||||||
state: Mutex<QueueState>,
|
state: Mutex<QueueState>,
|
||||||
_thrd: JoinHandle<()>,
|
thrd: JoinHandle<()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_cl_type_trait!(cl_command_queue, Queue, CL_INVALID_COMMAND_QUEUE);
|
impl_cl_type_trait!(cl_command_queue, Queue, CL_INVALID_COMMAND_QUEUE);
|
||||||
@@ -122,7 +122,7 @@ impl Queue {
|
|||||||
last: Weak::new(),
|
last: Weak::new(),
|
||||||
chan_in: tx_q,
|
chan_in: tx_q,
|
||||||
}),
|
}),
|
||||||
_thrd: thread::Builder::new()
|
thrd: thread::Builder::new()
|
||||||
.name("rusticl queue thread".into())
|
.name("rusticl queue thread".into())
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
// Track the error of all executed events. This is only needed for in-order
|
// Track the error of all executed events. This is only needed for in-order
|
||||||
@@ -250,6 +250,10 @@ impl Queue {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_dead(&self) -> bool {
|
||||||
|
self.thrd.is_finished()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_profiling_enabled(&self) -> bool {
|
pub fn is_profiling_enabled(&self) -> bool {
|
||||||
(self.props & (CL_QUEUE_PROFILING_ENABLE as u64)) != 0
|
(self.props & (CL_QUEUE_PROFILING_ENABLE as u64)) != 0
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user