From: Chas Williams Date: Fri, 26 Jul 2002 05:35:04 +0000 (+0000) Subject: STABLE12-linux-cleanup-rx-cv-locking-20020725 X-Git-Tag: openafs-stable-1_2_6~27 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=44776eb8650fff762898b4c361b7f67febe7253e;p=packages%2Fo%2Fopenafs.git STABLE12-linux-cleanup-rx-cv-locking-20020725 cleanup wait queue usage grab glock before mutex (like all other ports) (cherry picked from commit fc71eb6e255b6d2bc1d24e9aae799329c675ec49) --- diff --git a/src/rx/LINUX/rx_kmutex.h b/src/rx/LINUX/rx_kmutex.h index 8b492132f..34ab41c31 100644 --- a/src/rx/LINUX/rx_kmutex.h +++ b/src/rx/LINUX/rx_kmutex.h @@ -107,6 +107,14 @@ static inline int CV_WAIT(afs_kcondvar_t *cv, afs_kmutex_t *l) { int isAFSGlocked = ISAFS_GLOCK(); sigset_t saved_set; +#ifdef DECLARE_WAITQUEUE + DECLARE_WAITQUEUE(wait, current); +#else + struct wait_queue wait = { current, NULL }; +#endif + + add_wait_queue((wait_queue_head_t *)cv, &wait); + set_current_state(TASK_INTERRUPTIBLE); if (isAFSGlocked) AFS_GUNLOCK(); MUTEX_EXIT(l); @@ -117,19 +125,16 @@ static inline int CV_WAIT(afs_kcondvar_t *cv, afs_kmutex_t *l) 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 + schedule(); + remove_wait_queue(cv, &wait); 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(); + MUTEX_ENTER(l); return 0; } @@ -139,6 +144,14 @@ 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; +#ifdef DECLARE_WAITQUEUE + DECLARE_WAITQUEUE(wait, current); +#else + struct wait_queue wait = { current, NULL }; +#endif + + add_wait_queue((wait_queue_head_t *)cv, &wait); + set_current_state(TASK_INTERRUPTIBLE); if (isAFSGlocked) AFS_GUNLOCK(); MUTEX_EXIT(l); @@ -149,19 +162,16 @@ static inline int CV_TIMEDWAIT(afs_kcondvar_t *cv, afs_kmutex_t *l, int waittime 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 + t = schedule_timeout(t); + remove_wait_queue(cv, &wait); 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(); + MUTEX_ENTER(l); return 0; }