From: Nickolai Zeldovich Date: Wed, 30 Jan 2002 21:13:48 +0000 (+0000) Subject: Block signals when sleeping in CV_WAIT() and CV_TIMEDWAIT(), similar X-Git-Tag: openafs-devel-1_3_0~19 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=7573d5ed14df78d619a035ca50981f7ae3bfd5b6 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(). --- diff --git a/src/rx/LINUX/rx_kmutex.h b/src/rx/LINUX/rx_kmutex.h index fa5e15a..8b49213 100644 --- a/src/rx/LINUX/rx_kmutex.h +++ b/src/rx/LINUX/rx_kmutex.h @@ -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(¤t->sigmask_lock); + saved_set = current->blocked; + sigfillset(¤t->blocked); + recalc_sigpending(current); + spin_unlock_irq(¤t->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(¤t->sigmask_lock); + current->blocked = saved_set; + recalc_sigpending(current); + spin_unlock_irq(¤t->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(¤t->sigmask_lock); + saved_set = current->blocked; + sigfillset(¤t->blocked); + recalc_sigpending(current); + spin_unlock_irq(¤t->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(¤t->sigmask_lock); + current->blocked = saved_set; + recalc_sigpending(current); + spin_unlock_irq(¤t->sigmask_lock); + MUTEX_ENTER(l); if (isAFSGlocked) AFS_GLOCK();