[compiler-rt] 97b989b - [compiler-rt] During profile flushing, setup SIGKILL mask earlier (#68622)

via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 10 12:19:29 PDT 2023


Author: serge-sans-paille
Date: 2023-10-10T19:19:23Z
New Revision: 97b989b27496d5aeadb3b90cbb9305ddcd9e35d2

URL: https://github.com/llvm/llvm-project/commit/97b989b27496d5aeadb3b90cbb9305ddcd9e35d2
DIFF: https://github.com/llvm/llvm-project/commit/97b989b27496d5aeadb3b90cbb9305ddcd9e35d2.diff

LOG: [compiler-rt] During profile flushing, setup SIGKILL mask earlier (#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

Co-authored-by: serge-sans-paille <sguelton at mozilla.com>

Added: 
    

Modified: 
    compiler-rt/lib/profile/InstrProfilingFile.c

Removed: 
    


################################################################################
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