Mesa (staging/21.1): clover/memory: fix data race in buffer subclasses

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 11 20:51:07 UTC 2021


Module: Mesa
Branch: staging/21.1
Commit: 8a6b1a7ff2889b0be3f8352c009a14c63d9993a5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8a6b1a7ff2889b0be3f8352c009a14c63d9993a5

Author: Karol Herbst <kherbst at redhat.com>
Date:   Wed Jan 27 22:09:16 2021 +0100

clover/memory: fix data race in buffer subclasses

Cc: mesa-stable
Signed-off-by: Karol Herbst <kherbst at redhat.com>
Reviewed-by: Zoltán Böszörményi <zboszor at gmail.com>
Reviewed-by: Pierre Moreau <dev at pmoreau.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8765>
(cherry picked from commit 98280e834873a0f8711aa489a2a4e256a25566d0)

---

 .pick_status.json                            | 2 +-
 src/gallium/frontends/clover/core/memory.cpp | 6 ++++++
 src/gallium/frontends/clover/core/memory.hpp | 3 +++
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/.pick_status.json b/.pick_status.json
index cbeccdc8cc9..440e9130f97 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -445,7 +445,7 @@
         "description": "clover/memory: fix data race in buffer subclasses",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": null
     },
diff --git a/src/gallium/frontends/clover/core/memory.cpp b/src/gallium/frontends/clover/core/memory.cpp
index 54b9be7d147..e722af22b50 100644
--- a/src/gallium/frontends/clover/core/memory.cpp
+++ b/src/gallium/frontends/clover/core/memory.cpp
@@ -108,6 +108,7 @@ root_buffer::resource_undef(command_queue &q) {
 
 resource &
 root_buffer::resource(command_queue &q, const void *data_ptr) {
+   std::lock_guard<std::mutex> lock(resources_mtx);
    // Create a new resource if there's none for this device yet.
    if (!resources.count(&q.device())) {
       auto r = (!resources.empty() ?
@@ -125,6 +126,7 @@ root_buffer::resource(command_queue &q, const void *data_ptr) {
 
 void
 root_buffer::resource_out(command_queue &q) {
+   std::lock_guard<std::mutex> lock(resources_mtx);
    resources.erase(&q.device());
 }
 
@@ -137,6 +139,7 @@ sub_buffer::sub_buffer(root_buffer &parent, cl_mem_flags flags,
 
 resource &
 sub_buffer::resource_in(command_queue &q) {
+   std::lock_guard<std::mutex> lock(resources_mtx);
    // Create a new resource if there's none for this device yet.
    if (!resources.count(&q.device())) {
       auto r = new sub_resource(parent().resource_in(q), {{ offset() }});
@@ -155,6 +158,7 @@ sub_buffer::resource_undef(command_queue &q) {
 
 void
 sub_buffer::resource_out(command_queue &q) {
+   std::lock_guard<std::mutex> lock(resources_mtx);
    resources.erase(&q.device());
 }
 
@@ -188,6 +192,7 @@ image::resource_undef(command_queue &q) {
 
 resource &
 image::resource(command_queue &q, const void *data_ptr) {
+   std::lock_guard<std::mutex> lock(resources_mtx);
    // Create a new resource if there's none for this device yet.
    if (!resources.count(&q.device())) {
       auto r = (!resources.empty() ?
@@ -205,6 +210,7 @@ image::resource(command_queue &q, const void *data_ptr) {
 
 void
 image::resource_out(command_queue &q) {
+   std::lock_guard<std::mutex> lock(resources_mtx);
    resources.erase(&q.device());
 }
 
diff --git a/src/gallium/frontends/clover/core/memory.hpp b/src/gallium/frontends/clover/core/memory.hpp
index 284e86d7edc..19d6e2ad45f 100644
--- a/src/gallium/frontends/clover/core/memory.hpp
+++ b/src/gallium/frontends/clover/core/memory.hpp
@@ -107,6 +107,7 @@ namespace clover {
 
       std::map<device *,
                std::unique_ptr<root_resource>> resources;
+      std::mutex resources_mtx;
    };
 
    class sub_buffer : public buffer {
@@ -128,6 +129,7 @@ namespace clover {
       size_t _offset;
       std::map<device *,
                std::unique_ptr<sub_resource>> resources;
+      std::mutex resources_mtx;
    };
 
    class image : public memory_obj {
@@ -167,6 +169,7 @@ namespace clover {
       size_t _slice_pitch;
       std::map<device *,
                std::unique_ptr<root_resource>> resources;
+      std::mutex resources_mtx;
    };
 
    class image1d : public image {



More information about the mesa-commit mailing list