[PATCH v3] xfs: re-enable xfsaild idle mode and fix associated races
Christoph Hellwig
hch at infradead.org
Mon Jul 2 02:05:02 CDT 2012
> __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.
More information about the xfs
mailing list