radv: Fix threading issue with submission refcounts.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sat, 29 Aug 2020 01:25:02 +0000 (03:25 +0200)
committerMarge Bot <eric+marge@anholt.net>
Wed, 2 Sep 2020 18:00:40 +0000 (18:00 +0000)
If decrement == 0 then:

- it isn't safe to access the submission
- even if it is, checking that the result of the atomic_sub is 0
  doesn't given an unique owner anymore.

So skip it. The submission always starts out with refcount >= 1,
so first one to decrement to 0 still get dibs on executing it.

Fixes: 4aa75bb3bdd "radv: Add wait-before-submit support for timelines."
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6478>

src/amd/vulkan/radv_device.c

index b0eba6abe8677f9cfcb2afc53c816bf0228f9dcb..90167a9d60387c725879b546184790a272347bbf 100644 (file)
@@ -4414,6 +4414,12 @@ radv_queue_enqueue_submission(struct radv_deferred_queue_submission *submission,
         * submitted, but if the queue was empty, we decrement ourselves as there is no previous
         * submission. */
        uint32_t decrement = submission->wait_semaphore_count - wait_cnt + (is_first ? 1 : 0);
         * submitted, but if the queue was empty, we decrement ourselves as there is no previous
         * submission. */
        uint32_t decrement = submission->wait_semaphore_count - wait_cnt + (is_first ? 1 : 0);
+
+       /* if decrement is zero, then we don't have a refcounted reference to the
+        * submission anymore, so it is not safe to access the submission. */
+       if (!decrement)
+               return VK_SUCCESS;
+
        return radv_queue_trigger_submission(submission, decrement, processing_list);
 }
 
        return radv_queue_trigger_submission(submission, decrement, processing_list);
 }