lkml.org 
[lkml]   [2004]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
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/

\
 
 \ /
  Last update: 2005-03-22 14:05    [W:0.088 / U:0.200 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site