Module: Mesa
Branch: staging/23.3
Commit: 4d9ec22da3ccf3ffc1d1da59f63f682ce42fbb8b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4d9ec22da3ccf3ffc1d1da59f63f682ce42fbb8b

Author: Yiwei Zhang <[email protected]>
Date:   Tue Nov 28 12:17:29 2023 -0800

venus: properly initialize ring monitor initial alive status

This avoids a potential race condition if two threads are competing for
the monitor with the initial states, and the losing one may run into
alive status being false and abort.

Fixes: 4a4b05869a6 ("venus: check and configure new ringMonitoring feature")
Signed-off-by: Yiwei Zhang <[email protected]>
Reported-by: Lina Versace <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26179>
(cherry picked from commit 8ac7d78bf3512aa7575f9c8595494ea592ab2e58)

---

 .pick_status.json               | 2 +-
 src/virtio/vulkan/vn_common.c   | 4 +---
 src/virtio/vulkan/vn_instance.c | 3 +++
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index b1dbc03a27b..6713728252c 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -434,7 +434,7 @@
         "description": "venus: properly initialize ring monitor initial alive 
status",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "4a4b05869a6ad909417e30d46706ad6038084901",
         "notes": null
diff --git a/src/virtio/vulkan/vn_common.c b/src/virtio/vulkan/vn_common.c
index 72101e71f3b..27c2b05977b 100644
--- a/src/virtio/vulkan/vn_common.c
+++ b/src/virtio/vulkan/vn_common.c
@@ -168,10 +168,8 @@ vn_relax_init(struct vn_ring *ring, const char *reason)
              ring->monitor.report_period_us);
 #endif
 
-      if (vn_ring_monitor_acquire(ring)) {
-         ring->monitor.alive = true;
+      if (vn_ring_monitor_acquire(ring))
          vn_ring_unset_status_bits(ring, VK_RING_STATUS_ALIVE_BIT_MESA);
-      }
    }
 
    return (struct vn_relax_state){
diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c
index 29aae7b243c..0ef092ab6d0 100644
--- a/src/virtio/vulkan/vn_instance.c
+++ b/src/virtio/vulkan/vn_instance.c
@@ -137,6 +137,9 @@ vn_instance_init_ring(struct vn_instance *instance)
    ring->monitor.report_period_us = 3000000;
    mtx_init(&ring->monitor.mutex, mtx_plain);
 
+   /* ring monitor should be alive at all time */
+   ring->monitor.alive = true;
+
    const struct VkRingMonitorInfoMESA monitor_info = {
       .sType = VK_STRUCTURE_TYPE_RING_MONITOR_INFO_MESA,
       .maxReportingPeriodMicroseconds = ring->monitor.report_period_us,

Reply via email to