]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE12-linux-block-signals-in-cvwait-too-20020130 openafs-stable-1_2_3
authorNickolai Zeldovich <kolya@mit.edu>
Wed, 30 Jan 2002 21:15:36 +0000 (21:15 +0000)
committerDerrick Brashear <shadow@dementia.org>
Wed, 30 Jan 2002 21:15:36 +0000 (21:15 +0000)
Block signals when sleeping in CV_WAIT() and CV_TIMEDWAIT(), similar
to the linux-avoid-signal-wakeups-while-sleeping-20020129 change for
afs_osi_Sleep().

(cherry picked from commit 7573d5ed14df78d619a035ca50981f7ae3bfd5b6)

src/rx/LINUX/rx_kmutex.h

index fa5e15ae244f5071e978b88503cafbd56bb46d13..8b492132fa4d2ac66287a824c2836fef697c9d8d 100644 (file)
@@ -106,16 +106,28 @@ static inline void MUTEX_EXIT(afs_kmutex_t *l)
 static inline int CV_WAIT(afs_kcondvar_t *cv, afs_kmutex_t *l)
 {
     int isAFSGlocked = ISAFS_GLOCK(); 
+    sigset_t saved_set;
 
     if (isAFSGlocked) AFS_GUNLOCK();
     MUTEX_EXIT(l);
 
+    spin_lock_irq(&current->sigmask_lock);
+    saved_set = current->blocked;
+    sigfillset(&current->blocked);
+    recalc_sigpending(current);
+    spin_unlock_irq(&current->sigmask_lock);
+
 #if defined(AFS_LINUX24_ENV)
     interruptible_sleep_on((wait_queue_head_t *)cv);
 #else
     interruptible_sleep_on((struct wait_queue**)cv);
 #endif
 
+    spin_lock_irq(&current->sigmask_lock);
+    current->blocked = saved_set;
+    recalc_sigpending(current);
+    spin_unlock_irq(&current->sigmask_lock);
+
     MUTEX_ENTER(l);
     if (isAFSGlocked) AFS_GLOCK();
 
@@ -126,16 +138,28 @@ static inline int CV_TIMEDWAIT(afs_kcondvar_t *cv, afs_kmutex_t *l, int waittime
 {
     int isAFSGlocked = ISAFS_GLOCK();
     long t = waittime * HZ / 1000;
+    sigset_t saved_set;
 
     if (isAFSGlocked) AFS_GUNLOCK();
     MUTEX_EXIT(l);
     
+    spin_lock_irq(&current->sigmask_lock);
+    saved_set = current->blocked;
+    sigfillset(&current->blocked);
+    recalc_sigpending(current);
+    spin_unlock_irq(&current->sigmask_lock);
+
 #if defined(AFS_LINUX24_ENV)
     t = interruptible_sleep_on_timeout((wait_queue_head_t *)cv, t);
 #else
     t = interruptible_sleep_on_timeout((struct wait_queue**)cv, t);
 #endif
     
+    spin_lock_irq(&current->sigmask_lock);
+    current->blocked = saved_set;
+    recalc_sigpending(current);
+    spin_unlock_irq(&current->sigmask_lock);
+
     MUTEX_ENTER(l);
     if (isAFSGlocked) AFS_GLOCK();