[llvm] [z/OS] Implement shared memory handling for JIT (PR #89933)
Fanbo Meng via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 24 07:19:08 PDT 2024
https://github.com/fanbo-meng updated https://github.com/llvm/llvm-project/pull/89933
>From 00033e062e3bebf6a1255ac7f76838a856e13ec8 Mon Sep 17 00:00:00 2001
From: Kai Nacke <kai.peter.nacke at ibm.com>
Date: Tue, 30 Aug 2022 16:10:36 -0400
Subject: [PATCH 1/2] [z/OS] Implement shared memory handling for JIT
Implements the functionality using shmget(), shmat(), and shmdt().
Use the BLAKE3 hash to map the name of the shared memory to a key.
---
llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp | 32 +++++++++++++++++++
.../ExecutorSharedMemoryMapperService.cpp | 31 ++++++++++++++++++
2 files changed, 63 insertions(+)
diff --git a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
index 2c87b344083edb..ba538abcc30a74 100644
--- a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
@@ -16,6 +16,10 @@
#if defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
#include <fcntl.h>
#include <sys/mman.h>
+#if defined(__MVS__)
+#include <sys/shm.h>
+#include "llvm/Support/BLAKE3.h"
+#endif
#include <unistd.h>
#elif defined(_WIN32)
#include <windows.h>
@@ -239,6 +243,24 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
#if defined(LLVM_ON_UNIX)
+#if defined(__MVS__)
+ ArrayRef<uint8_t> Data(
+ reinterpret_cast<const uint8_t *>(SharedMemoryName.c_str()),
+ SharedMemoryName.size());
+ auto HashedName = BLAKE3::hash<sizeof(key_t)>(Data);
+ key_t Key = *reinterpret_cast<key_t *>(HashedName.data());
+ int SharedMemoryId =
+ shmget(Key, NumBytes, IPC_CREAT | __IPC_SHAREAS | 0700);
+ if (SharedMemoryId < 0) {
+ return OnReserved(errorCodeToError(
+ std::error_code(errno, std::generic_category())));
+ }
+ LocalAddr = shmat(SharedMemoryId, nullptr, 0);
+ if (LocalAddr == reinterpret_cast<void *>(-1)) {
+ return OnReserved(errorCodeToError(
+ std::error_code(errno, std::generic_category())));
+ }
+#else
int SharedMemoryFile = shm_open(SharedMemoryName.c_str(), O_RDWR, 0700);
if (SharedMemoryFile < 0) {
return OnReserved(errorCodeToError(errnoAsErrorCode()));
@@ -254,6 +276,7 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
}
close(SharedMemoryFile);
+#endif
#elif defined(_WIN32)
@@ -373,8 +396,13 @@ void SharedMemoryMapper::release(ArrayRef<ExecutorAddr> Bases,
#if defined(LLVM_ON_UNIX)
+#if defined(__MVS__)
+ if (shmdt(Reservations[Base].LocalAddr) < 0)
+ Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
+#else
if (munmap(Reservations[Base].LocalAddr, Reservations[Base].Size) != 0)
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
+#endif
#elif defined(_WIN32)
@@ -415,7 +443,11 @@ SharedMemoryMapper::~SharedMemoryMapper() {
#if defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
+#if defined(__MVS__)
+ shmdt(R.second.LocalAddr);
+#else
munmap(R.second.LocalAddr, R.second.Size);
+#endif
#elif defined(_WIN32)
diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
index 6614beec760fb3..eb9864ee83fd71 100644
--- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
@@ -18,6 +18,10 @@
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
+#if defined(__MVS__)
+#include <sys/shm.h>
+#include "llvm/Support/BLAKE3.h"
+#endif
#include <unistd.h>
#endif
@@ -59,6 +63,21 @@ ExecutorSharedMemoryMapperService::reserve(uint64_t Size) {
SharedMemoryName = SharedMemoryNameStream.str();
}
+#if defined(__MVS__)
+ ArrayRef<uint8_t> Data(
+ reinterpret_cast<const uint8_t *>(SharedMemoryName.c_str()),
+ SharedMemoryName.size());
+ auto HashedName = BLAKE3::hash<sizeof(key_t)>(Data);
+ key_t Key = *reinterpret_cast<key_t *>(HashedName.data());
+ int SharedMemoryId =
+ shmget(Key, Size, IPC_CREAT | IPC_EXCL | __IPC_SHAREAS | 0700);
+ if (SharedMemoryId < 0)
+ return errorCodeToError(errnoAsErrorCode());
+
+ void *Addr = shmat(SharedMemoryId, nullptr, 0);
+ if (Addr == reinterpret_cast<void *>(-1))
+ return errorCodeToError(errnoAsErrorCode());
+#else
int SharedMemoryFile =
shm_open(SharedMemoryName.c_str(), O_RDWR | O_CREAT | O_EXCL, 0700);
if (SharedMemoryFile < 0)
@@ -73,6 +92,7 @@ ExecutorSharedMemoryMapperService::reserve(uint64_t Size) {
return errorCodeToError(errnoAsErrorCode());
close(SharedMemoryFile);
+#endif
#elif defined(_WIN32)
@@ -131,6 +151,9 @@ Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize(
#if defined(LLVM_ON_UNIX)
+#if defined(__MVS__)
+ // TODO Is it possible to change the protection level?
+#else
int NativeProt = 0;
if ((Segment.RAG.Prot & MemProt::Read) == MemProt::Read)
NativeProt |= PROT_READ;
@@ -141,6 +164,7 @@ Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize(
if (mprotect(Segment.Addr.toPtr<void *>(), Segment.Size, NativeProt))
return errorCodeToError(errnoAsErrorCode());
+#endif
#elif defined(_WIN32)
@@ -239,8 +263,15 @@ Error ExecutorSharedMemoryMapperService::release(
#if defined(LLVM_ON_UNIX)
+#if defined(__MVS__)
+ (void)Size;
+
+ if (shmdt(Base.toPtr<void *>()) < 0)
+ Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
+#else
if (munmap(Base.toPtr<void *>(), Size) != 0)
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
+#endif
#elif defined(_WIN32)
(void)Size;
>From d45e7ef3768110aa53c5aef4965cf5bf46604702 Mon Sep 17 00:00:00 2001
From: Fanbo Meng <fanbo.meng at ibm.com>
Date: Wed, 24 Apr 2024 09:18:51 -0500
Subject: [PATCH 2/2] formatting code
---
llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp | 2 +-
.../Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
index ba538abcc30a74..bba3329e8cc269 100644
--- a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
@@ -17,8 +17,8 @@
#include <fcntl.h>
#include <sys/mman.h>
#if defined(__MVS__)
-#include <sys/shm.h>
#include "llvm/Support/BLAKE3.h"
+#include <sys/shm.h>
#endif
#include <unistd.h>
#elif defined(_WIN32)
diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
index eb9864ee83fd71..f5118c0f2bfa43 100644
--- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
@@ -19,8 +19,8 @@
#include <fcntl.h>
#include <sys/mman.h>
#if defined(__MVS__)
-#include <sys/shm.h>
#include "llvm/Support/BLAKE3.h"
+#include <sys/shm.h>
#endif
#include <unistd.h>
#endif
@@ -152,7 +152,7 @@ Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize(
#if defined(LLVM_ON_UNIX)
#if defined(__MVS__)
- // TODO Is it possible to change the protection level?
+ // TODO Is it possible to change the protection level?
#else
int NativeProt = 0;
if ((Segment.RAG.Prot & MemProt::Read) == MemProt::Read)
More information about the llvm-commits
mailing list