From 2b6bc445bf9bdb2c6d33addd969a80a106d476ad Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Mon, 25 Aug 2025 11:48:01 +0200 Subject: [PATCH 1/2] [Android] Avoid calling membarrier on older Android versions --- src/coreclr/pal/src/thread/process.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/coreclr/pal/src/thread/process.cpp b/src/coreclr/pal/src/thread/process.cpp index 9b779c0689c5c2..e835c4f394d671 100644 --- a/src/coreclr/pal/src/thread/process.cpp +++ b/src/coreclr/pal/src/thread/process.cpp @@ -2826,6 +2826,17 @@ InitializeFlushProcessWriteBuffers() _ASSERTE(s_flushUsingMemBarrier == 0); #if defined(__linux__) || HAVE_SYS_MEMBARRIER_H + +#ifdef TARGET_ANDROID + // Avoid calling membarrier on older Android versions where membarrier + // may be barred by seccomp causing the process to be killed. + int apiLevel = android_get_device_api_level(); + if (apiLevel < __ANDROID_API_Q__) + { + return TRUE; + } +#endif + // Starting with Linux kernel 4.14, process memory barriers can be generated // using MEMBARRIER_CMD_PRIVATE_EXPEDITED. int mask = membarrier(MEMBARRIER_CMD_QUERY, 0, 0); From 2af0ce150d418414a97d03cb151e40a28b966484 Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Mon, 25 Aug 2025 16:58:20 +0200 Subject: [PATCH 2/2] Initialize s_helperPage on older Androids --- src/coreclr/pal/src/thread/process.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/coreclr/pal/src/thread/process.cpp b/src/coreclr/pal/src/thread/process.cpp index e835c4f394d671..e19dbc72a6e017 100644 --- a/src/coreclr/pal/src/thread/process.cpp +++ b/src/coreclr/pal/src/thread/process.cpp @@ -2831,23 +2831,21 @@ InitializeFlushProcessWriteBuffers() // Avoid calling membarrier on older Android versions where membarrier // may be barred by seccomp causing the process to be killed. int apiLevel = android_get_device_api_level(); - if (apiLevel < __ANDROID_API_Q__) - { - return TRUE; - } + if (apiLevel >= __ANDROID_API_Q__) #endif - - // Starting with Linux kernel 4.14, process memory barriers can be generated - // using MEMBARRIER_CMD_PRIVATE_EXPEDITED. - int mask = membarrier(MEMBARRIER_CMD_QUERY, 0, 0); - if (mask >= 0 && - mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED) { - // Register intent to use the private expedited command. - if (membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0, 0) == 0) + // Starting with Linux kernel 4.14, process memory barriers can be generated + // using MEMBARRIER_CMD_PRIVATE_EXPEDITED. + int mask = membarrier(MEMBARRIER_CMD_QUERY, 0, 0); + if (mask >= 0 && + mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED) { - s_flushUsingMemBarrier = TRUE; - return TRUE; + // Register intent to use the private expedited command. + if (membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0, 0) == 0) + { + s_flushUsingMemBarrier = TRUE; + return TRUE; + } } } #endif