xfs
[Top] [All Lists]

Re: [PATCH v3] xfs: re-enable xfsaild idle mode and fix associated races

To: Brian Foster <bfoster@xxxxxxxxxx>
Subject: Re: [PATCH v3] xfs: re-enable xfsaild idle mode and fix associated races
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Mon, 2 Jul 2012 03:05:02 -0400
Cc: xfs@xxxxxxxxxxx
In-reply-to: <1340880776-45730-1-git-send-email-bfoster@xxxxxxxxxx>
References: <1340880776-45730-1-git-send-email-bfoster@xxxxxxxxxx>
User-agent: Mutt/1.5.21 (2010-09-15)
>                       __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.

<Prev in Thread] Current Thread [Next in Thread>