Re: [PATCH] reserved buffers only for PF_MEMALLOC

From: Marcelo Tosatti
Date: Tue Aug 10 2004 - 15:16:07 EST


On Tue, Aug 10, 2004 at 01:20:24PM -0400, Rik van Riel wrote:
>
> The buffer allocation path in 2.4 has a long standing bug,
> where non-PF_MEMALLOC tasks can dig into the reserved pool
> in get_unused_buffer_head(). The following patch makes the
> reserved pool only accessible to PF_MEMALLOC tasks.
>
> Other processes will loop in create_buffers() - the only
> function that calls get_unused_buffer_head() - and will call
> try_to_free_pages(GFP_NOIO), freeing any buffer heads that
> have become freeable due to IO completion.
>
> Note that PF_MEMALLOC tasks will NOT do anything inside
> try_to_free_pages(), so it is needed that they are able to
> dig into the reserved buffer heads while other tasks are
> not.

Sounds the correct thing to do, thanks.

Out of curiosity: Do you actually seen any practical problem due to
get_unused_buffer_head() calls eating into the reserved pool?

Or have any testcase which would trigger a problem (OOM) due to it?
>
> Signed-off-by: Rik van Riel <riel@xxxxxxxxxx>
>
> --- linux/fs/buffer.c.deadlock 2004-08-10 11:33:08.000000000 -0400
> +++ linux/fs/buffer.c 2004-08-10 11:34:54.000000000 -0400
> @@ -1260,8 +1260,9 @@ struct buffer_head * get_unused_buffer_h
>
> /*
> * If we need an async buffer, use the reserved buffer heads.
> + * Non-PF_MEMALLOC tasks can just loop in create_buffers().
> */
> - if (async) {
> + if (async && (current->flags & PF_MEMALLOC)) {
> spin_lock(&unused_list_lock);
> if (unused_list) {
> bh = unused_list;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/