From 4d9ec22da3ccf3ffc1d1da59f63f682ce42fbb8b Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Tue, 28 Nov 2023 12:17:29 -0800 Subject: [PATCH] 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 Reported-by: Lina Versace Part-of: (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 b1dbc03..6713728 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 72101e7..27c2b05 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 29aae7b..0ef092a 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, -- 2.7.4