llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: Vitaly Buka (vitalybuka)

<details>
<summary>Changes</summary>

A single 100 MiB __msan_memset faults in all 100 MiB of user pages before
SetShadow unmaps the corresponding shadow and origin pages. Under heavy test
parallelism on 192-CPU ppc64le (64 KiB pages, 24 MiB per-CPU RSS counter
batch), this causes two problems:
1. BackgroundThread (polling every 100 ms) can sample GetRSS() mid-memset
   during the temporary +100 MiB RSS spike before shadow/origin pages are
   unmapped.
2. If the thread migrates across CPUs during the 100 MiB user page faults,
   earlier CPUs retain partial positive per-CPU RSS batches while the single
   MmapFixedSuperNoReserve syscall unmaps all 100 MiB of shadow on the final
   CPU, causing global /proc/self/statm RSS to drop prematurely in non-origin
   mode.

Splitting the memset into 1 MiB chunks bounds the transient RSS spike to 1 MiB
and pairs each chunk's user page faults with its shadow/origin unmap on the
same CPU.

Assisted-by: Gemini


---
Full diff: https://github.com/llvm/llvm-project/pull/231058.diff


1 Files Affected:

- (modified) compiler-rt/test/msan/release_origin.c (+2-1) 


``````````diff
diff --git a/compiler-rt/test/msan/release_origin.c 
b/compiler-rt/test/msan/release_origin.c
index be20c83297add..560aee5182207 100644
--- a/compiler-rt/test/msan/release_origin.c
+++ b/compiler-rt/test/msan/release_origin.c
@@ -16,7 +16,8 @@ int main(int argc, char **argv) {
   p = malloc(s);
   sleep(1);
   fprintf(stderr, "memset\n");
-  memset(p, 1, s);
+  for (int i = 0; i < s; i += 1024 * 1024)
+    memset((char *)p + i, 1, 1024 * 1024);
   sleep(1);
   fprintf(stderr, "free\n");
   free(p);

``````````

</details>


https://github.com/llvm/llvm-project/pull/231058
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to