rusticl/mem: make Mem Send/Sync by storing mapping ptrs as usize

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26040>
This commit is contained in:
Karol Herbst
2023-10-06 00:55:35 +02:00
committed by Marge Bot
parent 7f110ec63d
commit dd5b0adc79

View File

@@ -49,7 +49,7 @@ impl MappingTransfer {
struct Mappings { struct Mappings {
tx: HashMap<&'static Device, MappingTransfer>, tx: HashMap<&'static Device, MappingTransfer>,
maps: HashMap<*mut c_void, u32>, maps: HashMap<usize, u32>,
} }
impl Mappings { impl Mappings {
@@ -60,6 +60,11 @@ impl Mappings {
}) })
} }
fn contains_ptr(&self, ptr: *mut c_void) -> bool {
let ptr = ptr as usize;
self.maps.contains_key(&ptr)
}
fn mark_pending(&mut self, dev: &Device) { fn mark_pending(&mut self, dev: &Device) {
self.tx.get_mut(dev).unwrap().pending += 1; self.tx.get_mut(dev).unwrap().pending += 1;
} }
@@ -71,6 +76,7 @@ impl Mappings {
} }
fn increase_ref(&mut self, dev: &Device, ptr: *mut c_void) -> bool { fn increase_ref(&mut self, dev: &Device, ptr: *mut c_void) -> bool {
let ptr = ptr as usize;
let res = self.maps.is_empty(); let res = self.maps.is_empty();
*self.maps.entry(ptr).or_default() += 1; *self.maps.entry(ptr).or_default() += 1;
self.unmark_pending(dev); self.unmark_pending(dev);
@@ -78,6 +84,7 @@ impl Mappings {
} }
fn decrease_ref(&mut self, ptr: *mut c_void, dev: &Device) -> (bool, Option<&PipeResource>) { fn decrease_ref(&mut self, ptr: *mut c_void, dev: &Device) -> (bool, Option<&PipeResource>) {
let ptr = ptr as usize;
if let Some(r) = self.maps.get_mut(&ptr) { if let Some(r) = self.maps.get_mut(&ptr) {
*r -= 1; *r -= 1;
@@ -1282,13 +1289,13 @@ impl Mem {
} }
pub fn is_mapped_ptr(&self, ptr: *mut c_void) -> bool { pub fn is_mapped_ptr(&self, ptr: *mut c_void) -> bool {
self.maps.lock().unwrap().maps.contains_key(&ptr) self.maps.lock().unwrap().contains_ptr(ptr)
} }
// TODO: only sync on unmap when the memory is not mapped for writing // TODO: only sync on unmap when the memory is not mapped for writing
pub fn unmap(&self, q: &Arc<Queue>, ctx: &PipeContext, ptr: *mut c_void) -> CLResult<()> { pub fn unmap(&self, q: &Arc<Queue>, ctx: &PipeContext, ptr: *mut c_void) -> CLResult<()> {
let mut lock = self.maps.lock().unwrap(); let mut lock = self.maps.lock().unwrap();
if !lock.maps.contains_key(&ptr) { if !lock.contains_ptr(ptr) {
return Ok(()); return Ok(());
} }