From df3aa1a9db8f977b52962322c95fd93d52d37f04 Mon Sep 17 00:00:00 2001 From: XairRrR Date: Thu, 8 Oct 2026 14:58:06 +0200 Subject: [PATCH] fix(libkernel): raise the open file soft limit on Linux Each direct memory backing keeps a memfd open, so a title such as Dreaming Sarah (PPSA02929) holds about 1100 descriptors at startup. With the systemd default soft limit of 1024, later opens fail with EMFILE: memfd_create throws "create direct memory backing: Too many open files", or the title's fopen returns NULL and it faults in fread. libkernel now raises the RLIMIT_NOFILE soft limit to the hard limit when it is loaded, before the title creates any descriptor, and throws if the limit cannot be read or raised. --- core/libs/prx/libkernel/CMakeLists.txt | 1 + .../prx/libkernel/File/src/OpenFileLimit.cpp | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 core/libs/prx/libkernel/File/src/OpenFileLimit.cpp diff --git a/core/libs/prx/libkernel/CMakeLists.txt b/core/libs/prx/libkernel/CMakeLists.txt index 2520ab477..37c28d6f8 100644 --- a/core/libs/prx/libkernel/CMakeLists.txt +++ b/core/libs/prx/libkernel/CMakeLists.txt @@ -6,6 +6,7 @@ add_library(libkernel SHARED EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/File/src/DirectoryDescriptor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/File/src/NativeStat.cpp ${CMAKE_CURRENT_SOURCE_DIR}/File/src/Open.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/File/src/OpenFileLimit.cpp ${CMAKE_CURRENT_SOURCE_DIR}/File/src/Stdio.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Semaphore/src/Semaphore.cpp ${CMAKE_CURRENT_SOURCE_DIR}/SyncOnAddress/src/SyncOnAddress.cpp diff --git a/core/libs/prx/libkernel/File/src/OpenFileLimit.cpp b/core/libs/prx/libkernel/File/src/OpenFileLimit.cpp new file mode 100644 index 000000000..6d698a585 --- /dev/null +++ b/core/libs/prx/libkernel/File/src/OpenFileLimit.cpp @@ -0,0 +1,21 @@ +#if defined(__linux__) + +#include +#include +#include + +namespace { + +struct OpenFileLimit { + OpenFileLimit() { + rlimit limit{}; + if (getrlimit(RLIMIT_NOFILE, &limit) != 0) throw std::system_error(errno, std::generic_category(), "read open file limit"); + if (limit.rlim_cur >= limit.rlim_max) return; + limit.rlim_cur = limit.rlim_max; + if (setrlimit(RLIMIT_NOFILE, &limit) != 0) throw std::system_error(errno, std::generic_category(), "raise open file limit"); + } +} openFileLimit; + +} + +#endif