From: Wu Fengguang <fengguang.wu@intel.com>
To: <linux-fsdevel@vger.kernel.org>
Cc: Jan Kara <jack@suse.cz>, Peter Zijlstra <a.p.zijlstra@chello.nl>,
Wu Fengguang <fengguang.wu@intel.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH 2/5] writeback: charge leaked page dirties to active tasks
Date: Mon, 21 Nov 2011 21:03:44 +0800 [thread overview]
Message-ID: <20111121131215.772231181@intel.com> (raw)
In-Reply-To: 20111121130342.211953629@intel.com
[-- Attachment #1: writeback-save-leaks-at-exit.patch --]
[-- Type: text/plain, Size: 2566 bytes --]
It's a years long problem that a large number of short-lived dirtiers
(eg. gcc instances in a fast kernel build) may starve long-run dirtiers
(eg. dd) as well as pushing the dirty pages to the global hard limit.
The solution is to charge the pages dirtied by the exited gcc to the
other random dirtying tasks. It sounds not perfect, however should
behave good enough in practice, seeing as that throttled tasks aren't
actually running so those that are running are more likely to pick it up
and get throttled, therefore promoting an equal spread.
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
include/linux/writeback.h | 2 ++
kernel/exit.c | 2 ++
mm/page-writeback.c | 12 ++++++++++++
3 files changed, 16 insertions(+)
--- linux-next.orig/include/linux/writeback.h 2011-11-17 20:57:02.000000000 +0800
+++ linux-next/include/linux/writeback.h 2011-11-17 20:57:12.000000000 +0800
@@ -7,6 +7,8 @@
#include <linux/sched.h>
#include <linux/fs.h>
+DECLARE_PER_CPU(int, dirty_leaks);
+
/*
* The 1/4 region under the global dirty thresh is for smooth dirty throttling:
*
--- linux-next.orig/mm/page-writeback.c 2011-11-17 20:57:04.000000000 +0800
+++ linux-next/mm/page-writeback.c 2011-11-17 20:57:13.000000000 +0800
@@ -1194,6 +1194,7 @@ void set_page_dirty_balance(struct page
}
static DEFINE_PER_CPU(int, bdp_ratelimits);
+DEFINE_PER_CPU(int, dirty_leaks) = 0;
/**
* balance_dirty_pages_ratelimited_nr - balance dirty memory state
@@ -1242,6 +1243,17 @@ void balance_dirty_pages_ratelimited_nr(
ratelimit = 0;
}
}
+ /*
+ * Pick up the dirtied pages by the exited tasks. This avoids lots of
+ * short-lived tasks (eg. gcc invocations in a kernel build) escaping
+ * the dirty throttling and livelock other long-run dirtiers.
+ */
+ p = &__get_cpu_var(dirty_leaks);
+ if (*p > 0 && current->nr_dirtied < ratelimit) {
+ nr_pages_dirtied = min(*p, ratelimit - current->nr_dirtied);
+ *p -= nr_pages_dirtied;
+ current->nr_dirtied += nr_pages_dirtied;
+ }
preempt_enable();
if (unlikely(current->nr_dirtied >= ratelimit))
--- linux-next.orig/kernel/exit.c 2011-11-17 20:57:02.000000000 +0800
+++ linux-next/kernel/exit.c 2011-11-17 20:57:04.000000000 +0800
@@ -1037,6 +1037,8 @@ NORET_TYPE void do_exit(long code)
validate_creds_for_do_exit(tsk);
preempt_disable();
+ if (tsk->nr_dirtied)
+ __this_cpu_add(dirty_leaks, tsk->nr_dirtied);
exit_rcu();
/* causes final put_task_struct in finish_task_switch(). */
tsk->state = TASK_DEAD;
next prev parent reply other threads:[~2011-11-21 13:03 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-21 13:03 [PATCH 0/5] dirty throttling bits for 3.3 Wu Fengguang
2011-11-21 13:03 ` [PATCH 1/5] writeback: balanced_rate cannot exceed write bandwidth Wu Fengguang
2011-11-21 22:50 ` Jan Kara
2011-11-22 6:41 ` Wu Fengguang
2011-11-22 21:04 ` Jan Kara
2011-11-23 13:17 ` Wu Fengguang
2011-11-21 13:03 ` Wu Fengguang [this message]
2011-11-21 21:49 ` [PATCH 2/5] writeback: charge leaked page dirties to active tasks Andrew Morton
2011-11-21 23:46 ` Jan Kara
2011-11-22 13:35 ` Wu Fengguang
2011-11-21 13:03 ` [PATCH 3/5] writeback: fix dirtied pages accounting on sub-page writes Wu Fengguang
2011-11-22 0:11 ` Jan Kara
2011-11-22 9:21 ` Wu Fengguang
2011-11-22 12:21 ` Jan Kara
2011-11-22 12:30 ` Wu Fengguang
2011-11-22 12:48 ` Jan Kara
2011-11-22 13:02 ` Wu Fengguang
2011-11-22 12:57 ` Peter Zijlstra
2011-11-22 13:07 ` Wu Fengguang
2011-11-22 13:41 ` Wu Fengguang
2011-11-22 13:53 ` Peter Zijlstra
2011-11-22 14:11 ` Wu Fengguang
2011-11-28 13:51 ` Wu Fengguang
2011-11-21 13:03 ` [PATCH 4/5] writeback: fix dirtied pages accounting on redirty Wu Fengguang
2011-11-21 21:51 ` Andrew Morton
2011-11-22 13:59 ` Wu Fengguang
2011-11-21 13:03 ` [PATCH 5/5] writeback: dirty ratelimit - think time compensation Wu Fengguang
2011-11-23 12:44 ` [PATCH 0/5] dirty throttling bits for 3.3 Peter Zijlstra
2011-11-28 13:56 ` Wu Fengguang
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=20111121131215.772231181@intel.com \
--to=fengguang.wu@intel.com \
--cc=a.p.zijlstra@chello.nl \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).