On Fri, Feb 05, 2016 at 10:05:08AM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@xxxxxxxxxx>
>
> When a buffer on the dirty MRU is looked up and found, we remove the
> buffer from the MRU. However, we've already set the priority ofthe
of the
> buffer to "dirty" so when we are donw with it it will go back on the
done
> dirty buffer MRU regardless of whether it needs to or not.
>
> Hence when we move a buffer to a the dirty MRU, reocrd the old
record
> priority and restore it when we remove the buffer from the MRU on
> lookup. This will prevent us from putting fixed, now writeable
> buffers back on the dirty MRU and allow the cache routine to write,
> shake and reclaim the buffers once they are clean.
>
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> ---
> include/cache.h | 1 +
> libxfs/cache.c | 7 +++++++
> 2 files changed, 8 insertions(+)
>
...
> diff --git a/libxfs/cache.c b/libxfs/cache.c
> index d4b4a4e..0398be3 100644
> --- a/libxfs/cache.c
> +++ b/libxfs/cache.c
...
> @@ -434,6 +436,10 @@ cache_node_get(
> mru->cm_count--;
> list_del_init(&node->cn_mru);
> pthread_mutex_unlock(&mru->cm_mutex);
> + if (node->cn_old_priority != -1) {
Might be good to ASSERT(node->cn_priority == CACHE_DIRTY_PRIORITY) here.
Otherwise looks good:
Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx>
> + node->cn_priority =
> node->cn_old_priority;
> + node->cn_old_priority = -1;
> + }
> }
> node->cn_count++;
>
> @@ -534,6 +540,7 @@ cache_node_set_priority(
> pthread_mutex_lock(&node->cn_mutex);
> ASSERT(node->cn_count > 0);
> node->cn_priority = priority;
> + node->cn_old_priority = -1;
> pthread_mutex_unlock(&node->cn_mutex);
> }
>
> --
> 2.5.0
>
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs
|