> __set_current_state(TASK_KILLABLE); > else > __set_current_state(TASK_INTERRUPTIBLE); > - schedule_timeout(tout ? > - msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); > + > + spin_lock(&ailp->xa_lock); > + > + /* > + * Idle if the AIL is empty and we are not racing with a target > + * update. We check the AIL after we set the task to a sleep > + * state to guarantee that we either catch an xa_target update > + * or that a wake_up resets the state to TASK_RUNNING. > + * Otherwise, we run the risk of sleeping indefinitely. > + * > + * The barrier matches the xa_target update in xfs_ail_push(). > + */ > + smp_rmb(); > + if (!xfs_ail_min(ailp) && > + ailp->xa_target == ailp->xa_target_prev) { > + spin_unlock(&ailp->xa_lock); > + schedule(); > + tout = 0; > + continue; > + } I still don't like this at all all - we have one place to do all the timeout decisions, and that is and then end of xfsaild_push. Splitting this decision over two functions makes the code a lot harder to understand and maintain over the long run. That doesn't mean I don't like the algorithm behind this patch, it just needs to move into the right place. _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs