[llvm] 50e6218 - Reland "[llvm-exegesis] Add thread IDs to subprocess memory names (#84451)"
Aiden Grossman via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 22 11:51:15 PDT 2024
Author: Aiden Grossman
Date: 2024-03-22T11:51:09-07:00
New Revision: 50e6218132d6d9cfc2645fa19cf72d0437a62d95
URL: https://github.com/llvm/llvm-project/commit/50e6218132d6d9cfc2645fa19cf72d0437a62d95
DIFF: https://github.com/llvm/llvm-project/commit/50e6218132d6d9cfc2645fa19cf72d0437a62d95.diff
LOG: Reland "[llvm-exegesis] Add thread IDs to subprocess memory names (#84451)"
This reverts commit 1fe9c417a0bf143f9bb9f9e1fbf7b20f44196883.
This relands commit 6bbe8a296ee91754d423c59c35727eaa624f7140.
This was causing build failures on one of the ARMv8 builders. Still not
completely sure why, but relanding it to see if the failure pops up
again. If it does, the plan is to fix forward by disabling tests on ARM
temporarily as llvm-exegesis does not currently use SubprocessMemory
on ARM.
Added:
Modified:
llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp
llvm/tools/llvm-exegesis/lib/SubprocessMemory.h
llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
Removed:
################################################################################
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
index 6d5f0286fb9c19..498308e2edbe1f 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
@@ -405,6 +405,7 @@ class SubProcessFunctionExecutorImpl
if (AddMemDefError)
return AddMemDefError;
+ long ParentTID = SubprocessMemory::getCurrentTID();
pid_t ParentOrChildPID = fork();
if (ParentOrChildPID == -1) {
@@ -418,7 +419,7 @@ class SubProcessFunctionExecutorImpl
// Unregister handlers, signal handling is now handled through ptrace in
// the host process.
sys::unregisterHandlers();
- runChildSubprocess(PipeFiles[0], Key);
+ runChildSubprocess(PipeFiles[0], Key, ParentTID);
// The child process terminates in the above function, so we should never
// get to this point.
llvm_unreachable("Child process didn't exit when expected.");
@@ -439,8 +440,8 @@ class SubProcessFunctionExecutorImpl
setrlimit(RLIMIT_CORE, &rlim);
}
- [[noreturn]] void runChildSubprocess(int Pipe,
- const BenchmarkKey &Key) const {
+ [[noreturn]] void runChildSubprocess(int Pipe, const BenchmarkKey &Key,
+ long ParentTID) const {
// Disable core dumps in the child process as otherwise everytime we
// encounter an execution failure like a segmentation fault, we will create
// a core dump. We report the information directly rather than require the
@@ -497,7 +498,7 @@ class SubProcessFunctionExecutorImpl
Expected<int> AuxMemFDOrError =
SubprocessMemory::setupAuxiliaryMemoryInSubprocess(
- Key.MemoryValues, ParentPID, CounterFileDescriptor);
+ Key.MemoryValues, ParentPID, ParentTID, CounterFileDescriptor);
if (!AuxMemFDOrError)
exit(ChildProcessExitCodeE::AuxiliaryMemorySetupFailed);
diff --git a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp
index a49fa077257d00..1fd81bd407becb 100644
--- a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp
+++ b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp
@@ -9,11 +9,13 @@
#include "SubprocessMemory.h"
#include "Error.h"
#include "llvm/Support/Error.h"
+#include "llvm/Support/FormatVariadic.h"
#include <cerrno>
#ifdef __linux__
#include <fcntl.h>
#include <sys/mman.h>
+#include <sys/syscall.h>
#include <unistd.h>
#endif
@@ -22,12 +24,21 @@ namespace exegesis {
#if defined(__linux__) && !defined(__ANDROID__)
+long SubprocessMemory::getCurrentTID() {
+ // We're using the raw syscall here rather than the gettid() function provided
+ // by most libcs for compatibility as gettid() was only added to glibc in
+ // version 2.30.
+ return syscall(SYS_gettid);
+}
+
Error SubprocessMemory::initializeSubprocessMemory(pid_t ProcessID) {
// Add the PID to the shared memory name so that if we're running multiple
// processes at the same time, they won't interfere with each other.
// This comes up particularly often when running the exegesis tests with
- // llvm-lit
- std::string AuxiliaryMemoryName = "/auxmem" + std::to_string(ProcessID);
+ // llvm-lit. Additionally add the TID so that downstream consumers
+ // using multiple threads don't run into conflicts.
+ std::string AuxiliaryMemoryName =
+ formatv("/{0}auxmem{1}", getCurrentTID(), ProcessID);
int AuxiliaryMemoryFD = shm_open(AuxiliaryMemoryName.c_str(),
O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (AuxiliaryMemoryFD == -1)
@@ -47,8 +58,8 @@ Error SubprocessMemory::addMemoryDefinition(
pid_t ProcessPID) {
SharedMemoryNames.reserve(MemoryDefinitions.size());
for (auto &[Name, MemVal] : MemoryDefinitions) {
- std::string SharedMemoryName = "/" + std::to_string(ProcessPID) + "memdef" +
- std::to_string(MemVal.Index);
+ std::string SharedMemoryName =
+ formatv("/{0}t{1}memdef{2}", ProcessPID, getCurrentTID(), MemVal.Index);
SharedMemoryNames.push_back(SharedMemoryName);
int SharedMemoryFD =
shm_open(SharedMemoryName.c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
@@ -82,8 +93,9 @@ Error SubprocessMemory::addMemoryDefinition(
Expected<int> SubprocessMemory::setupAuxiliaryMemoryInSubprocess(
std::unordered_map<std::string, MemoryValue> MemoryDefinitions,
- pid_t ParentPID, int CounterFileDescriptor) {
- std::string AuxiliaryMemoryName = "/auxmem" + std::to_string(ParentPID);
+ pid_t ParentPID, long ParentTID, int CounterFileDescriptor) {
+ std::string AuxiliaryMemoryName =
+ formatv("/{0}auxmem{1}", ParentTID, ParentPID);
int AuxiliaryMemoryFileDescriptor =
shm_open(AuxiliaryMemoryName.c_str(), O_RDWR, S_IRUSR | S_IWUSR);
if (AuxiliaryMemoryFileDescriptor == -1)
@@ -97,8 +109,8 @@ Expected<int> SubprocessMemory::setupAuxiliaryMemoryInSubprocess(
return make_error<Failure>("Mapping auxiliary memory failed");
AuxiliaryMemoryMapping[0] = CounterFileDescriptor;
for (auto &[Name, MemVal] : MemoryDefinitions) {
- std::string MemoryValueName = "/" + std::to_string(ParentPID) + "memdef" +
- std::to_string(MemVal.Index);
+ std::string MemoryValueName =
+ formatv("/{0}t{1}memdef{2}", ParentPID, ParentTID, MemVal.Index);
AuxiliaryMemoryMapping[AuxiliaryMemoryOffset + MemVal.Index] =
shm_open(MemoryValueName.c_str(), O_RDWR, S_IRUSR | S_IWUSR);
if (AuxiliaryMemoryMapping[AuxiliaryMemoryOffset + MemVal.Index] == -1)
@@ -133,7 +145,7 @@ Error SubprocessMemory::addMemoryDefinition(
Expected<int> SubprocessMemory::setupAuxiliaryMemoryInSubprocess(
std::unordered_map<std::string, MemoryValue> MemoryDefinitions,
- pid_t ParentPID, int CounterFileDescriptor) {
+ pid_t ParentPID, long ParentTID, int CounterFileDescriptor) {
return make_error<Failure>(
"setupAuxiliaryMemoryInSubprocess is only supported on Linux");
}
diff --git a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h
index e20b50cdc8118f..572d1085d9cffa 100644
--- a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h
+++ b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h
@@ -35,6 +35,9 @@ class SubprocessMemory {
static constexpr const size_t AuxiliaryMemoryOffset = 1;
static constexpr const size_t AuxiliaryMemorySize = 4096;
+ // Gets the thread ID for the calling thread.
+ static long getCurrentTID();
+
Error initializeSubprocessMemory(pid_t ProcessID);
// The following function sets up memory definitions. It creates shared
@@ -54,7 +57,7 @@ class SubprocessMemory {
// section.
static Expected<int> setupAuxiliaryMemoryInSubprocess(
std::unordered_map<std::string, MemoryValue> MemoryDefinitions,
- pid_t ParentPID, int CounterFileDescriptor);
+ pid_t ParentPID, long ParentTID, int CounterFileDescriptor);
~SubprocessMemory();
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
index c07ec188a602c4..7c23e7b7e9c5a5 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
@@ -17,6 +17,7 @@
#include <endian.h>
#include <fcntl.h>
#include <sys/mman.h>
+#include <sys/syscall.h>
#include <unistd.h>
#endif // __linux__
@@ -49,7 +50,9 @@ class SubprocessMemoryTest : public X86TestBase {
std::string getSharedMemoryName(const unsigned TestNumber,
const unsigned DefinitionNumber) {
- return "/" + std::to_string(getSharedMemoryNumber(TestNumber)) + "memdef" +
+ long CurrentTID = syscall(SYS_gettid);
+ return "/" + std::to_string(getSharedMemoryNumber(TestNumber)) + "t" +
+ std::to_string(CurrentTID) + "memdef" +
std::to_string(DefinitionNumber);
}
More information about the llvm-commits
mailing list