From: Andrea Arcangeli <andrea@suse.de>
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org, Nick Piggin <npiggin@novell.com>,
Rik van Riel <riel@conectiva.com.br>
Subject: writeback-highmem
Date: Fri, 21 Jan 2005 07:01:35 +0100 [thread overview]
Message-ID: <20050121060135.GF12647@dualathlon.random> (raw)
In-Reply-To: <20050121055043.GE12647@dualathlon.random>
This needed highmem fix from Rik is still missing too, so please apply
along the other 5 (it's orthogonal so you can apply this one in any
order you want).
From: Rik van Riel <riel@redhat.com>
Subject: [PATCH][1/2] adjust dirty threshold for lowmem-only mappings
Simply running "dd if=/dev/zero of=/dev/hd<one you can miss>" will
result in OOM kills, with the dirty pagecache completely filling up
lowmem. This patch is part 1 to fixing that problem.
This patch effectively lowers the dirty limit for mappings which cannot
be cached in highmem, counting the dirty limit as a percentage of lowmem
instead. This should prevent heavy block device writers from pushing
the VM over the edge and triggering OOM kills.
Signed-off-by: Rik van Riel <riel@redhat.com>
Acked-by: Andrea Arcangeli <andrea@suse.de>
--- x/mm/page-writeback.c.orig 2005-01-04 01:13:30.000000000 +0100
+++ x/mm/page-writeback.c 2005-01-04 02:41:29.573177184 +0100
@@ -133,7 +133,8 @@ static void get_writeback_state(struct w
* clamping level.
*/
static void
-get_dirty_limits(struct writeback_state *wbs, long *pbackground, long *pdirty)
+get_dirty_limits(struct writeback_state *wbs, long *pbackground, long *pdirty,
+ struct address_space *mapping)
{
int background_ratio; /* Percentages */
int dirty_ratio;
@@ -141,10 +142,20 @@ get_dirty_limits(struct writeback_state
long background;
long dirty;
struct task_struct *tsk;
+ unsigned long available_memory = total_pages;
get_writeback_state(wbs);
- unmapped_ratio = 100 - (wbs->nr_mapped * 100) / total_pages;
+#ifdef CONFIG_HIGHMEM
+ /*
+ * In some cases we can only allocate from low memory,
+ * so we exclude high memory from our count.
+ */
+ if (mapping && !(mapping_gfp_mask(mapping) & __GFP_HIGHMEM))
+ available_memory -= totalhigh_pages;
+#endif
+
+ unmapped_ratio = 100 - (wbs->nr_mapped * 100) / available_memory;
dirty_ratio = vm_dirty_ratio;
if (dirty_ratio > unmapped_ratio / 2)
@@ -194,7 +205,7 @@ static void balance_dirty_pages(struct a
.nr_to_write = write_chunk,
};
- get_dirty_limits(&wbs, &background_thresh, &dirty_thresh);
+ get_dirty_limits(&wbs, &background_thresh, &dirty_thresh, mapping);
nr_reclaimable = wbs.nr_dirty + wbs.nr_unstable;
if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh)
break;
@@ -210,7 +221,7 @@ static void balance_dirty_pages(struct a
if (nr_reclaimable) {
writeback_inodes(&wbc);
get_dirty_limits(&wbs, &background_thresh,
- &dirty_thresh);
+ &dirty_thresh, mapping);
nr_reclaimable = wbs.nr_dirty + wbs.nr_unstable;
if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh)
break;
@@ -296,7 +307,7 @@ static void background_writeout(unsigned
long background_thresh;
long dirty_thresh;
- get_dirty_limits(&wbs, &background_thresh, &dirty_thresh);
+ get_dirty_limits(&wbs, &background_thresh, &dirty_thresh, NULL);
if (wbs.nr_dirty + wbs.nr_unstable < background_thresh
&& min_pages <= 0)
break;
next prev parent reply other threads:[~2005-01-21 6:02 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-21 5:48 OOM fixes 1/5 Andrea Arcangeli
2005-01-21 5:49 ` OOM fixes 2/5 Andrea Arcangeli
2005-01-21 5:49 ` OOM fixes 3/5 Andrea Arcangeli
2005-01-21 5:50 ` OOM fixes 4/5 Andrea Arcangeli
2005-01-21 5:50 ` OOM fixes 5/5 Andrea Arcangeli
2005-01-21 6:01 ` Andrea Arcangeli [this message]
2005-01-21 6:26 ` writeback-highmem Andrew Morton
2005-01-21 6:41 ` writeback-highmem Andrea Arcangeli
2005-01-21 13:46 ` writeback-highmem Rik van Riel
2005-01-21 6:20 ` OOM fixes 2/5 Andrew Morton
2005-01-21 6:35 ` Andrea Arcangeli
2005-01-21 6:36 ` Nick Piggin
2005-01-21 6:46 ` Andrew Morton
2005-01-21 7:04 ` Nick Piggin
2005-01-21 7:17 ` Andrea Arcangeli
2005-01-21 7:04 ` Andrea Arcangeli
2005-01-21 7:08 ` Andi Kleen
2005-01-21 7:21 ` Andrea Arcangeli
2005-01-21 6:52 ` Andrea Arcangeli
2005-01-21 7:00 ` Andrew Morton
2005-01-21 7:10 ` Andrea Arcangeli
2005-01-22 6:35 ` OOM fixes 1/5 Andrea Arcangeli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050121060135.GF12647@dualathlon.random \
--to=andrea@suse.de \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=npiggin@novell.com \
--cc=riel@conectiva.com.br \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox