vserver 1.9.5.x5
[linux-2.6.git] / arch / um / kernel / signal_user.c
index 52cfd60..62f4578 100644 (file)
@@ -41,6 +41,7 @@ void set_handler(int sig, void (*handler)(int), int flags, ...)
        while((mask = va_arg(ap, int)) != -1){
                sigaddset(&action.sa_mask, mask);
        }
+       va_end(ap);
        action.sa_flags = flags;
        action.sa_restorer = NULL;
        if(sigaction(sig, &action, NULL) < 0)
@@ -57,6 +58,10 @@ int change_sig(int signal, int on)
        return(!sigismember(&old, signal));
 }
 
+/* Both here and in set/get_signal we don't touch SIGPROF, because we must not
+ * disable profiling; it's safe because the profiling code does not interact
+ * with the kernel code at all.*/
+
 static void change_signals(int type)
 {
        sigset_t mask;
@@ -65,7 +70,6 @@ static void change_signals(int type)
        sigaddset(&mask, SIGVTALRM);
        sigaddset(&mask, SIGALRM);
        sigaddset(&mask, SIGIO);
-       sigaddset(&mask, SIGPROF);
        if(sigprocmask(type, &mask, NULL) < 0)
                panic("Failed to change signal mask - errno = %d", errno);
 }
@@ -80,6 +84,12 @@ void unblock_signals(void)
        change_signals(SIG_UNBLOCK);
 }
 
+/* These are the asynchronous signals.  SIGVTALRM and SIGARLM are handled
+ * together under SIGVTALRM_BIT.  SIGPROF is excluded because we want to
+ * be able to profile all of UML, not just the non-critical sections.  If
+ * profiling is not thread-safe, then that is not my problem.  We can disable
+ * profiling when SMP is enabled in that case.
+ */
 #define SIGIO_BIT 0
 #define SIGVTALRM_BIT 1
 
@@ -114,6 +124,11 @@ int set_signals(int enable)
                sigaddset(&mask, SIGVTALRM);
                sigaddset(&mask, SIGALRM);
        }
+
+       /* This is safe - sigprocmask is guaranteed to copy locally the
+        * value of new_set, do his work and then, at the end, write to
+        * old_set.
+        */
        if(sigprocmask(SIG_UNBLOCK, &mask, &mask) < 0)
                panic("Failed to enable signals");
        ret = enable_mask(&mask);