[llvm] ee73651 - [z/OS] Implement shared memory handling for JIT (#89933)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 25 05:42:27 PDT 2024
Author: Fanbo Meng
Date: 2024-04-25T08:42:22-04:00
New Revision: ee7365198c5575337cfcbf3cb0a0c6689dd703f5
URL: https://github.com/llvm/llvm-project/commit/ee7365198c5575337cfcbf3cb0a0c6689dd703f5
DIFF: https://github.com/llvm/llvm-project/commit/ee7365198c5575337cfcbf3cb0a0c6689dd703f5.diff
LOG: [z/OS] Implement shared memory handling for JIT (#89933)
Fix 'use of undeclared identifier' build errors for shm_ functions on
z/OS by implementing the functionality using shmget(), shmat(), and
shmdt(). Use the BLAKE3 hash to map the name of the shared memory to a
key.
---------
Co-authored-by: Kai Nacke <kai.peter.nacke at ibm.com>
Added:
Modified:
llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
index 2c87b344083edb..bba3329e8cc269 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 "llvm/Support/BLAKE3.h"
+#include <sys/shm.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..f5118c0f2bfa43 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 "llvm/Support/BLAKE3.h"
+#include <sys/shm.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;
More information about the llvm-commits
mailing list