Module: Mesa
Branch: main
Commit: f7830240acc43280154dacd0ab075dcaa0051da8
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f7830240acc43280154dacd0ab075dcaa0051da8

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>

---

 src/gallium/frontends/rusticl/mesa/pipe/screen.rs | 45 +++++++++++------------
 1 file changed, 21 insertions(+), 24 deletions(-)

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,
+            );
         }
     }
 }

Reply via email to