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

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon May 10 12:30:25 UTC 2021


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

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>

---

 src/gallium/frontends/clover/core/memory.cpp | 6 ++++++
 src/gallium/frontends/clover/core/memory.hpp | 3 +++
 2 files changed, 9 insertions(+)

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