[compiler-rt] [compiler-rt] During profile flushing, setup SIGKILL mask earlier (PR #68622)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 9 12:38:24 PDT 2023
https://github.com/serge-sans-paille created https://github.com/llvm/llvm-project/pull/68622
In multi threaded application, it is possible for one thread to terminate the program while another is flushing profile information. We setup a signal mask to delay SIGKILL so that we can safely flush the profile.
This patch setups the mask earlier: it reduces the window during which a SIGKILL can end the computation prematurely.
This fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1850940, where a profiled firefox was encountering several:
LLVM Profile Error: Failed to write file "default_*.profraw": Broken pipe
>From 8c6535baa41d8af62190af61336196bc3623655d Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton at mozilla.com>
Date: Mon, 9 Oct 2023 21:24:38 +0200
Subject: [PATCH] [compiler-rt] During profile flushing, setup SIGKILL mask
earlier
In multi threaded application, it is possible for one thread to
terminate the program while another is flushing profile information. We
setup a signal mask to delay SIGKILL so that we can safely flush the profile.
This patch setups the mask earlier: it reduces the window during which a
SIGKILL can end the computation prematurely.
This fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1850940, where
a profiled firefox was encountering several:
LLVM Profile Error: Failed to write file "default_*.profraw": Broken pipe
---
compiler-rt/lib/profile/InstrProfilingFile.c | 24 +++++++++++++-------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/compiler-rt/lib/profile/InstrProfilingFile.c b/compiler-rt/lib/profile/InstrProfilingFile.c
index 5556eccbf578790..ae7872c63f796c0 100644
--- a/compiler-rt/lib/profile/InstrProfilingFile.c
+++ b/compiler-rt/lib/profile/InstrProfilingFile.c
@@ -1034,10 +1034,14 @@ int __llvm_profile_write_file(void) {
int rc, Length;
const char *Filename;
char *FilenameBuf;
- int PDeathSig = 0;
+
+ // Temporarily suspend getting SIGKILL when the parent exits.
+ int PDeathSig = lprofSuspendSigKill();
if (lprofProfileDumped() || __llvm_profile_is_continuous_mode_enabled()) {
PROF_NOTE("Profile data not written to file: %s.\n", "already written");
+ if (PDeathSig == 1)
+ lprofRestoreSigKill();
return 0;
}
@@ -1048,6 +1052,8 @@ int __llvm_profile_write_file(void) {
/* Check the filename. */
if (!Filename) {
PROF_ERR("Failed to write file : %s\n", "Filename not set");
+ if (PDeathSig == 1)
+ lprofRestoreSigKill();
return -1;
}
@@ -1057,12 +1063,11 @@ int __llvm_profile_write_file(void) {
"expected %d, but get %d\n",
INSTR_PROF_RAW_VERSION,
(int)GET_VERSION(__llvm_profile_get_version()));
+ if (PDeathSig == 1)
+ lprofRestoreSigKill();
return -1;
}
- // Temporarily suspend getting SIGKILL when the parent exits.
- PDeathSig = lprofSuspendSigKill();
-
/* Write profile data to the file. */
rc = writeFile(Filename);
if (rc)
@@ -1095,7 +1100,9 @@ int __llvm_orderfile_write_file(void) {
int rc, Length, LengthBeforeAppend, SuffixLength;
const char *Filename;
char *FilenameBuf;
- int PDeathSig = 0;
+
+ // Temporarily suspend getting SIGKILL when the parent exits.
+ int PDeathSig = lprofSuspendSigKill();
SuffixLength = strlen(OrderFileSuffix);
Length = getCurFilenameLength() + SuffixLength;
@@ -1105,6 +1112,8 @@ int __llvm_orderfile_write_file(void) {
/* Check the filename. */
if (!Filename) {
PROF_ERR("Failed to write file : %s\n", "Filename not set");
+ if (PDeathSig == 1)
+ lprofRestoreSigKill();
return -1;
}
@@ -1119,12 +1128,11 @@ int __llvm_orderfile_write_file(void) {
"expected %d, but get %d\n",
INSTR_PROF_RAW_VERSION,
(int)GET_VERSION(__llvm_profile_get_version()));
+ if (PDeathSig == 1)
+ lprofRestoreSigKill();
return -1;
}
- // Temporarily suspend getting SIGKILL when the parent exits.
- PDeathSig = lprofSuspendSigKill();
-
/* Write order data to the file. */
rc = writeOrderFile(Filename);
if (rc)
More information about the llvm-commits
mailing list