Module: Mesa Branch: staging/23.3 Commit: 14fac5200d4e5384c71d999318c9f891f6d3822c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=14fac5200d4e5384c71d999318c9f891f6d3822c
Author: Karol Herbst <kher...@redhat.com> Date: Fri Oct 27 23:27:15 2023 +0200 rusticl/mesa/screen: do not derefence the entire pipe_screen struct Apparently the dereferences made tsan report data races on the pipe_screen object. Cc: mesa-stable Signed-off-by: Karol Herbst <kher...@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25944> (cherry picked from commit f7830240acc43280154dacd0ab075dcaa0051da8) --- .pick_status.json | 2 +- src/gallium/frontends/rusticl/mesa/pipe/screen.rs | 45 +++++++++++------------ 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index aca4addf7da..671845e903c 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -84,7 +84,7 @@ "description": "rusticl/mesa/screen: do not derefence the entire pipe_screen struct", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/gallium/frontends/rusticl/mesa/pipe/screen.rs b/src/gallium/frontends/rusticl/mesa/pipe/screen.rs index cb89345afb5..c3272f4c321 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/screen.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/screen.rs @@ -234,9 +234,13 @@ impl PipeScreen { } fn compute_param_wrapped(&self, cap: pipe_compute_cap, ptr: *mut c_void) -> i32 { - let s = &mut unsafe { *self.screen }; unsafe { - s.get_compute_param.unwrap()(self.screen, pipe_shader_ir::PIPE_SHADER_IR_NIR, cap, ptr) + (*self.screen).get_compute_param.unwrap()( + self.screen, + pipe_shader_ir::PIPE_SHADER_IR_NIR, + cap, + ptr, + ) } } @@ -245,10 +249,7 @@ impl PipeScreen { } pub fn name(&self) -> String { - unsafe { - let s = *self.screen; - c_string_to_string(s.get_name.unwrap()(self.screen)) - } + unsafe { c_string_to_string((*self.screen).get_name.unwrap()(self.screen)) } } pub fn device_node_mask(&self) -> Option<u32> { @@ -274,10 +275,7 @@ impl PipeScreen { } pub fn device_vendor(&self) -> String { - unsafe { - let s = *self.screen; - c_string_to_string(s.get_device_vendor.unwrap()(self.screen)) - } + unsafe { c_string_to_string((*self.screen).get_device_vendor.unwrap()(self.screen)) } } pub fn device_type(&self) -> pipe_loader_device_type { @@ -296,9 +294,7 @@ impl PipeScreen { pub fn cl_cts_version(&self) -> &CStr { unsafe { - let s = *self.screen; - - let ptr = s + let ptr = (*self.screen) .get_cl_cts_version .map_or(ptr::null(), |get_cl_cts_version| { get_cl_cts_version(self.screen) @@ -318,8 +314,9 @@ impl PipeScreen { target: pipe_texture_target, bindings: u32, ) -> bool { - let s = &mut unsafe { *self.screen }; - unsafe { s.is_format_supported.unwrap()(self.screen, format, target, 0, 0, bindings) } + unsafe { + (*self.screen).is_format_supported.unwrap()(self.screen, format, target, 0, 0, bindings) + } } pub fn get_timestamp(&self) -> u64 { @@ -346,9 +343,7 @@ impl PipeScreen { } pub fn shader_cache(&self) -> Option<DiskCacheBorrowed> { - let s = &mut unsafe { *self.screen }; - - let ptr = if let Some(func) = s.get_disk_shader_cache { + let ptr = if let Some(func) = unsafe { *self.screen }.get_disk_shader_cache { unsafe { func(self.screen) } } else { ptr::null_mut() @@ -358,8 +353,7 @@ impl PipeScreen { } pub fn finalize_nir(&self, nir: &NirShader) { - let s = &mut unsafe { *self.screen }; - if let Some(func) = s.finalize_nir { + if let Some(func) = unsafe { *self.screen }.finalize_nir { unsafe { func(self.screen, nir.get_nir().cast()); } @@ -368,15 +362,18 @@ impl PipeScreen { pub(super) fn unref_fence(&self, mut fence: *mut pipe_fence_handle) { unsafe { - let s = &mut *self.screen; - s.fence_reference.unwrap()(s, &mut fence, ptr::null_mut()); + (*self.screen).fence_reference.unwrap()(self.screen, &mut fence, ptr::null_mut()); } } pub(super) fn fence_finish(&self, fence: *mut pipe_fence_handle) { unsafe { - let s = &mut *self.screen; - s.fence_finish.unwrap()(s, ptr::null_mut(), fence, OS_TIMEOUT_INFINITE as u64); + (*self.screen).fence_finish.unwrap()( + self.screen, + ptr::null_mut(), + fence, + OS_TIMEOUT_INFINITE as u64, + ); } } }