[OpenAFS-devel] afs_osi_Sleep and afs_osi_Wakeup on Linux
chas williams
chas@cmf.nrl.navy.mil
Mon, 03 Jun 2002 18:52:21 -0400
In message <OF7F777427.0C0E6194-ON85256BCD.0071CA60@in.ibm.com>,"Srikanth Vishw
>while (seq == evp->seq) {
> AFS_ASSERT_GLOCK();
> AFS_GUNLOCK();
> interruptible_sleep_on(&evp->cond);
> AFS_GLOCK();
>...
>Is there a better way to do this ? May be a Linux API ? Something
>like Solaris's cv_wait(kcondvar_t *, kmutex_t *) would be nice.
this is a somewhat fairly well known problem with using interruptible_sleep_on
see pg 286 of linux device drivers second edition. you need to put the
event on the wait queue before you do anything that trigger the corresponding
wake_up. i think this would be more correct than the unlock_/lock_kernel idea.
something like (and this probably isnt quite right, but close i hope):
wait_queue_t wait;
init_waitqueue_entry(&wait, current);
/* blah blah blah */
add_wait_queue(&evp->cond, &wait);
set_current_state(TASK_INTERRUPTIBLE);
while (seq == evp->seq) {
AFS_ASSERT_GLOCK();
AFS_GUNLOCK();
schedule();
AFS_GLOCK();
/* blah blah blah */
}
set_current_state(TASK_RUNNING);
remove_wait_queue(&evp->cond, &wait);