[AMDGPU] Adding mutex to guard lld::elf::link interface use
authorjerryyin <zhuoryin@amd.com>
Mon, 21 Sep 2020 18:22:56 +0000 (11:22 -0700)
committerjerryyin <zhuoryin@amd.com>
Mon, 21 Sep 2020 18:37:57 +0000 (11:37 -0700)
check-mlir target run tests simultaneously with multiple threads. This caused multiple threads to invoke the `lld::elf::link()` interface at the same time. Since the interface does not have a thread-safe implementation, add a metex to prevent multi-threaded access.

I discovered this by looking the the failure stack trace. lld/ELF/symbolTable.cpp, SymbolTable::insert() hit into an assert with related to Epoch Trackers. The root cause is to due to there is no protection around the symMap (update) which is implemented in non-thread safe data structure: denseMap.

Differential Revision: https://reviews.llvm.org/D88038

mlir/tools/mlir-rocm-runner/mlir-rocm-runner.cpp

index d0c515b..41d03b2 100644 (file)
@@ -65,6 +65,8 @@
 // HIP headers.
 #include "hip/hip_version.h"
 
 // HIP headers.
 #include "hip/hip_version.h"
 
+#include <mutex>
+
 using namespace mlir;
 using namespace llvm;
 
 using namespace mlir;
 using namespace llvm;
 
@@ -146,6 +148,7 @@ static LogicalResult assembleIsa(const std::string isa, StringRef name,
   return success();
 }
 
   return success();
 }
 
+static std::mutex mutex;
 static LogicalResult createHsaco(const Blob &isaBlob, StringRef name,
                                  Blob &hsacoBlob) {
   // Save the ISA binary to a temp file.
 static LogicalResult createHsaco(const Blob &isaBlob, StringRef name,
                                  Blob &hsacoBlob) {
   // Save the ISA binary to a temp file.
@@ -175,6 +178,7 @@ static LogicalResult createHsaco(const Blob &isaBlob, StringRef name,
   }
   FileRemover cleanupHsaco(tempHsacoFilename);
 
   }
   FileRemover cleanupHsaco(tempHsacoFilename);
 
+  const std::lock_guard<std::mutex> lock(mutex);
   // Invoke lld. Expect a true return value from lld.
   bool ret = lld::elf::link({"ld.lld", "-shared", tempIsaBinaryFilename.c_str(),
                              "-o", tempHsacoFilename.c_str()},
   // Invoke lld. Expect a true return value from lld.
   bool ret = lld::elf::link({"ld.lld", "-shared", tempIsaBinaryFilename.c_str(),
                              "-o", tempHsacoFilename.c_str()},