From: Fengguang Wu <fengguang.wu@intel.com>
To: Linux Memory Management List <linux-mm@kvack.org>
Cc: Vivek Goyal <vgoyal@redhat.com>, Fengguang Wu <fengguang.wu@intel.com>
Cc: Suresh Jayaraman <sjayaraman@suse.com>,
Andrea Righi <andrea@betterlinux.com>
Cc: Jeff Moyer <jmoyer@redhat.com>
Cc: <linux-fsdevel@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH 3/6] blk-cgroup: buffered write IO controller - bandwidth weight
Date: Wed, 28 Mar 2012 20:13:11 +0800 [thread overview]
Message-ID: <20120328131153.305137134@intel.com> (raw)
In-Reply-To: 20120328121308.568545879@intel.com
[-- Attachment #1: writeback-io-controller-weight.patch --]
[-- Type: text/plain, Size: 3526 bytes --]
blkcg->weight can be trivially supported for buffered writes by directly
scaling task_ratelimit in balance_dirty_pages().
However the sementics are not quite the same with direct IO.
- for direct IO, weight is normally applied to disk time
- for buffered writes, weight is applied to dirty rate
Notes about the (balanced_dirty_ratelimit > write_bw) check removal:
When there is only one dd running and its weight is set to
BLKIO_WEIGHT_MIN=10, bdi->dirty_ratelimit will end up balancing around
write_bw * BLKIO_WEIGHT_DEFAULT / BLKIO_WEIGHT_MIN
= write_bw * 50
So the limit should now be raised to (write_bw * 50) to deal with the
above extreme case, which seems too large to be useful for normal cases.
So just remove it.
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---
include/linux/blk-cgroup.h | 18 ++++++++++++++----
mm/page-writeback.c | 10 +++++-----
2 files changed, 19 insertions(+), 9 deletions(-)
--- linux-next.orig/include/linux/blk-cgroup.h 2012-03-28 13:42:26.686233288 +0800
+++ linux-next/include/linux/blk-cgroup.h 2012-03-28 14:25:16.150180560 +0800
@@ -21,6 +21,10 @@ enum blkio_policy_id {
BLKIO_POLICY_THROTL, /* Throttling */
};
+#define BLKIO_WEIGHT_MIN 10
+#define BLKIO_WEIGHT_MAX 1000
+#define BLKIO_WEIGHT_DEFAULT 500
+
/* Max limits for throttle policy */
#define THROTL_IOPS_MAX UINT_MAX
@@ -209,6 +213,11 @@ extern unsigned int blkcg_get_read_iops(
extern unsigned int blkcg_get_write_iops(struct blkio_cgroup *blkcg,
dev_t dev);
+static inline unsigned int blkcg_weight(struct blkio_cgroup *blkcg)
+{
+ return blkcg->weight;
+}
+
typedef void (blkio_unlink_group_fn) (void *key, struct blkio_group *blkg);
typedef void (blkio_update_group_weight_fn) (void *key,
@@ -259,11 +268,12 @@ static inline void blkio_policy_unregist
static inline char *blkg_path(struct blkio_group *blkg) { return NULL; }
-#endif
+static inline unsigned int blkcg_weight(struct blkio_cgroup *blkcg)
+{
+ return BLKIO_WEIGHT_DEFAULT;
+}
-#define BLKIO_WEIGHT_MIN 10
-#define BLKIO_WEIGHT_MAX 1000
-#define BLKIO_WEIGHT_DEFAULT 500
+#endif
#ifdef CONFIG_DEBUG_BLK_CGROUP
void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg);
--- linux-next.orig/mm/page-writeback.c 2012-03-28 13:42:26.678233289 +0800
+++ linux-next/mm/page-writeback.c 2012-03-28 14:26:02.694179605 +0800
@@ -905,11 +905,6 @@ static void bdi_update_dirty_ratelimit(s
*/
balanced_dirty_ratelimit = div_u64((u64)task_ratelimit * write_bw,
dirty_rate | 1);
- /*
- * balanced_dirty_ratelimit ~= (write_bw / N) <= write_bw
- */
- if (unlikely(balanced_dirty_ratelimit > write_bw))
- balanced_dirty_ratelimit = write_bw;
/*
* We could safely do this and return immediately:
@@ -1263,6 +1258,11 @@ static void balance_dirty_pages(struct a
bdi_thresh, bdi_dirty);
task_ratelimit = ((u64)dirty_ratelimit * pos_ratio) >>
RATELIMIT_CALC_SHIFT;
+
+ if (blkcg_weight(blkcg) != BLKIO_WEIGHT_DEFAULT)
+ task_ratelimit = (u64)task_ratelimit *
+ blkcg_weight(blkcg) / BLKIO_WEIGHT_DEFAULT;
+
max_pause = bdi_max_pause(bdi, bdi_dirty);
min_pause = bdi_min_pause(bdi, max_pause,
task_ratelimit, dirty_ratelimit,
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Fengguang Wu <fengguang.wu@intel.com>
To: Linux Memory Management List <linux-mm@kvack.org>
Cc: Vivek Goyal <vgoyal@redhat.com>,
Fengguang Wu <fengguang.wu@intel.com>,
Suresh Jayaraman <sjayaraman@suse.com>,
Andrea Righi <andrea@betterlinux.com>,
Jeff Moyer <jmoyer@redhat.com>,
linux-fsdevel@vger.kernel.org,
LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH 3/6] blk-cgroup: buffered write IO controller - bandwidth weight
Date: Wed, 28 Mar 2012 20:13:11 +0800 [thread overview]
Message-ID: <20120328131153.305137134@intel.com> (raw)
In-Reply-To: 20120328121308.568545879@intel.com
[-- Attachment #1: writeback-io-controller-weight.patch --]
[-- Type: text/plain, Size: 3526 bytes --]
blkcg->weight can be trivially supported for buffered writes by directly
scaling task_ratelimit in balance_dirty_pages().
However the sementics are not quite the same with direct IO.
- for direct IO, weight is normally applied to disk time
- for buffered writes, weight is applied to dirty rate
Notes about the (balanced_dirty_ratelimit > write_bw) check removal:
When there is only one dd running and its weight is set to
BLKIO_WEIGHT_MIN=10, bdi->dirty_ratelimit will end up balancing around
write_bw * BLKIO_WEIGHT_DEFAULT / BLKIO_WEIGHT_MIN
= write_bw * 50
So the limit should now be raised to (write_bw * 50) to deal with the
above extreme case, which seems too large to be useful for normal cases.
So just remove it.
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---
include/linux/blk-cgroup.h | 18 ++++++++++++++----
mm/page-writeback.c | 10 +++++-----
2 files changed, 19 insertions(+), 9 deletions(-)
--- linux-next.orig/include/linux/blk-cgroup.h 2012-03-28 13:42:26.686233288 +0800
+++ linux-next/include/linux/blk-cgroup.h 2012-03-28 14:25:16.150180560 +0800
@@ -21,6 +21,10 @@ enum blkio_policy_id {
BLKIO_POLICY_THROTL, /* Throttling */
};
+#define BLKIO_WEIGHT_MIN 10
+#define BLKIO_WEIGHT_MAX 1000
+#define BLKIO_WEIGHT_DEFAULT 500
+
/* Max limits for throttle policy */
#define THROTL_IOPS_MAX UINT_MAX
@@ -209,6 +213,11 @@ extern unsigned int blkcg_get_read_iops(
extern unsigned int blkcg_get_write_iops(struct blkio_cgroup *blkcg,
dev_t dev);
+static inline unsigned int blkcg_weight(struct blkio_cgroup *blkcg)
+{
+ return blkcg->weight;
+}
+
typedef void (blkio_unlink_group_fn) (void *key, struct blkio_group *blkg);
typedef void (blkio_update_group_weight_fn) (void *key,
@@ -259,11 +268,12 @@ static inline void blkio_policy_unregist
static inline char *blkg_path(struct blkio_group *blkg) { return NULL; }
-#endif
+static inline unsigned int blkcg_weight(struct blkio_cgroup *blkcg)
+{
+ return BLKIO_WEIGHT_DEFAULT;
+}
-#define BLKIO_WEIGHT_MIN 10
-#define BLKIO_WEIGHT_MAX 1000
-#define BLKIO_WEIGHT_DEFAULT 500
+#endif
#ifdef CONFIG_DEBUG_BLK_CGROUP
void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg);
--- linux-next.orig/mm/page-writeback.c 2012-03-28 13:42:26.678233289 +0800
+++ linux-next/mm/page-writeback.c 2012-03-28 14:26:02.694179605 +0800
@@ -905,11 +905,6 @@ static void bdi_update_dirty_ratelimit(s
*/
balanced_dirty_ratelimit = div_u64((u64)task_ratelimit * write_bw,
dirty_rate | 1);
- /*
- * balanced_dirty_ratelimit ~= (write_bw / N) <= write_bw
- */
- if (unlikely(balanced_dirty_ratelimit > write_bw))
- balanced_dirty_ratelimit = write_bw;
/*
* We could safely do this and return immediately:
@@ -1263,6 +1258,11 @@ static void balance_dirty_pages(struct a
bdi_thresh, bdi_dirty);
task_ratelimit = ((u64)dirty_ratelimit * pos_ratio) >>
RATELIMIT_CALC_SHIFT;
+
+ if (blkcg_weight(blkcg) != BLKIO_WEIGHT_DEFAULT)
+ task_ratelimit = (u64)task_ratelimit *
+ blkcg_weight(blkcg) / BLKIO_WEIGHT_DEFAULT;
+
max_pause = bdi_max_pause(bdi, bdi_dirty);
min_pause = bdi_min_pause(bdi, max_pause,
task_ratelimit, dirty_ratelimit,
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Fengguang Wu <fengguang.wu@intel.com>
To: Linux Memory Management List <linux-mm@kvack.org>
Cc: Vivek Goyal <vgoyal@redhat.com>, Fengguang Wu <fengguang.wu@intel.com>
Cc: Suresh Jayaraman <sjayaraman@suse.com>,
Andrea Righi <andrea@betterlinux.com>
Cc: Jeff Moyer <jmoyer@redhat.com>
Cc: <linux-fsdevel@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH 3/6] blk-cgroup: buffered write IO controller - bandwidth weight
Date: Wed, 28 Mar 2012 20:13:11 +0800 [thread overview]
Message-ID: <20120328131153.305137134@intel.com> (raw)
In-Reply-To: 20120328121308.568545879@intel.com
[-- Attachment #1: writeback-io-controller-weight.patch --]
[-- Type: text/plain, Size: 3223 bytes --]
blkcg->weight can be trivially supported for buffered writes by directly
scaling task_ratelimit in balance_dirty_pages().
However the sementics are not quite the same with direct IO.
- for direct IO, weight is normally applied to disk time
- for buffered writes, weight is applied to dirty rate
Notes about the (balanced_dirty_ratelimit > write_bw) check removal:
When there is only one dd running and its weight is set to
BLKIO_WEIGHT_MIN=10, bdi->dirty_ratelimit will end up balancing around
write_bw * BLKIO_WEIGHT_DEFAULT / BLKIO_WEIGHT_MIN
= write_bw * 50
So the limit should now be raised to (write_bw * 50) to deal with the
above extreme case, which seems too large to be useful for normal cases.
So just remove it.
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---
include/linux/blk-cgroup.h | 18 ++++++++++++++----
mm/page-writeback.c | 10 +++++-----
2 files changed, 19 insertions(+), 9 deletions(-)
--- linux-next.orig/include/linux/blk-cgroup.h 2012-03-28 13:42:26.686233288 +0800
+++ linux-next/include/linux/blk-cgroup.h 2012-03-28 14:25:16.150180560 +0800
@@ -21,6 +21,10 @@ enum blkio_policy_id {
BLKIO_POLICY_THROTL, /* Throttling */
};
+#define BLKIO_WEIGHT_MIN 10
+#define BLKIO_WEIGHT_MAX 1000
+#define BLKIO_WEIGHT_DEFAULT 500
+
/* Max limits for throttle policy */
#define THROTL_IOPS_MAX UINT_MAX
@@ -209,6 +213,11 @@ extern unsigned int blkcg_get_read_iops(
extern unsigned int blkcg_get_write_iops(struct blkio_cgroup *blkcg,
dev_t dev);
+static inline unsigned int blkcg_weight(struct blkio_cgroup *blkcg)
+{
+ return blkcg->weight;
+}
+
typedef void (blkio_unlink_group_fn) (void *key, struct blkio_group *blkg);
typedef void (blkio_update_group_weight_fn) (void *key,
@@ -259,11 +268,12 @@ static inline void blkio_policy_unregist
static inline char *blkg_path(struct blkio_group *blkg) { return NULL; }
-#endif
+static inline unsigned int blkcg_weight(struct blkio_cgroup *blkcg)
+{
+ return BLKIO_WEIGHT_DEFAULT;
+}
-#define BLKIO_WEIGHT_MIN 10
-#define BLKIO_WEIGHT_MAX 1000
-#define BLKIO_WEIGHT_DEFAULT 500
+#endif
#ifdef CONFIG_DEBUG_BLK_CGROUP
void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg);
--- linux-next.orig/mm/page-writeback.c 2012-03-28 13:42:26.678233289 +0800
+++ linux-next/mm/page-writeback.c 2012-03-28 14:26:02.694179605 +0800
@@ -905,11 +905,6 @@ static void bdi_update_dirty_ratelimit(s
*/
balanced_dirty_ratelimit = div_u64((u64)task_ratelimit * write_bw,
dirty_rate | 1);
- /*
- * balanced_dirty_ratelimit ~= (write_bw / N) <= write_bw
- */
- if (unlikely(balanced_dirty_ratelimit > write_bw))
- balanced_dirty_ratelimit = write_bw;
/*
* We could safely do this and return immediately:
@@ -1263,6 +1258,11 @@ static void balance_dirty_pages(struct a
bdi_thresh, bdi_dirty);
task_ratelimit = ((u64)dirty_ratelimit * pos_ratio) >>
RATELIMIT_CALC_SHIFT;
+
+ if (blkcg_weight(blkcg) != BLKIO_WEIGHT_DEFAULT)
+ task_ratelimit = (u64)task_ratelimit *
+ blkcg_weight(blkcg) / BLKIO_WEIGHT_DEFAULT;
+
max_pause = bdi_max_pause(bdi, bdi_dirty);
min_pause = bdi_min_pause(bdi, max_pause,
task_ratelimit, dirty_ratelimit,
next prev parent reply other threads:[~2012-03-28 12:13 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-28 12:13 [PATCH 0/6] buffered write IO controller in balance_dirty_pages() Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` [PATCH 1/6] blk-cgroup: move blk-cgroup.h in include/linux/blk-cgroup.h Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` [PATCH 2/6] blk-cgroup: account dirtied pages Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu [this message]
2012-03-28 12:13 ` [PATCH 3/6] blk-cgroup: buffered write IO controller - bandwidth weight Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` [PATCH 4/6] blk-cgroup: buffered write IO controller - bandwidth limit Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` [PATCH 5/6] blk-cgroup: buffered write IO controller - bandwidth limit interface Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` [PATCH 6/6] blk-cgroup: buffered write IO controller - debug trace Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 12:13 ` Fengguang Wu
2012-03-28 21:10 ` [PATCH 0/6] buffered write IO controller in balance_dirty_pages() Vivek Goyal
2012-03-28 21:10 ` Vivek Goyal
2012-03-28 22:35 ` Fengguang Wu
2012-03-28 22:35 ` Fengguang Wu
2012-03-29 2:48 ` Suresh Jayaraman
2012-03-29 2:48 ` Suresh Jayaraman
2012-03-29 0:34 ` KAMEZAWA Hiroyuki
2012-03-29 0:34 ` KAMEZAWA Hiroyuki
2012-03-29 1:22 ` Fengguang Wu
2012-03-29 1:22 ` Fengguang Wu
2012-04-01 4:16 ` Suresh Jayaraman
2012-04-01 4:16 ` Suresh Jayaraman
2012-04-01 8:30 ` Fengguang Wu
2012-04-01 8:30 ` Fengguang Wu
2012-04-01 20:56 ` Vivek Goyal
2012-04-01 20:56 ` Vivek Goyal
2012-04-03 8:00 ` Fengguang Wu
2012-04-03 14:53 ` Vivek Goyal
2012-04-03 14:53 ` Vivek Goyal
2012-04-03 23:32 ` Fengguang Wu
2012-04-03 23:32 ` Fengguang Wu
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=20120328131153.305137134@intel.com \
--to=fengguang.wu@intel.com \
--cc=linux-mm@kvack.org \
--cc=vgoyal@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.