Messages in this thread Patch in this message | | | Date | Tue, 10 Aug 2004 13:20:24 -0400 (EDT) | From | Rik van Riel <> | Subject | [PATCH] reserved buffers only for PF_MEMALLOC |
| |
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.
Signed-off-by: Rik van Riel <riel@redhat.com>
--- 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |