mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Vivek Goyal <vgoyal@redhat.com>
To: linux-kernel@vger.kernel.org, jaxboe@fusionio.com
Cc: dpshah@google.com, vgoyal@redhat.com
Subject: [PATCH 14/14] blk-throttle: Make no throttling rule group processing lockless
Date: Wed, 18 May 2011 15:13:26 -0400	[thread overview]
Message-ID: <1305746006-5837-15-git-send-email-vgoyal@redhat.com> (raw)
In-Reply-To: <1305746006-5837-1-git-send-email-vgoyal@redhat.com>

Currently we take a queue lock on each bio to check if there are any
throttling rules associated with the group and also update the stats.
Now access the group under rcu and update the stats without taking
the queue lock. Queue lock is taken only if there are throttling rules
associated with the group.

So the common case of root group when there are no rules, save
unnecessary pounding of request queue lock.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
---
 block/blk-throttle.c |   53 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 44ce1a5..7df7067 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -229,6 +229,22 @@ __throtl_tg_fill_dev_details(struct throtl_data *td, struct throtl_grp *tg)
 	}
 }
 
+/*
+ * Should be called with without queue lock held. Here queue lock will be
+ * taken rarely. It will be taken only once during life time of a group
+ * if need be
+ */
+static void
+throtl_tg_fill_dev_details(struct throtl_data *td, struct throtl_grp *tg)
+{
+	if (!tg || tg->blkg.dev)
+		return;
+
+	spin_lock_irq(td->queue->queue_lock);
+	__throtl_tg_fill_dev_details(td, tg);
+	spin_unlock_irq(td->queue->queue_lock);
+}
+
 static void throtl_init_add_tg_lists(struct throtl_data *td,
 			struct throtl_grp *tg, struct blkio_cgroup *blkcg)
 {
@@ -666,6 +682,12 @@ static bool tg_with_in_bps_limit(struct throtl_data *td, struct throtl_grp *tg,
 	return 0;
 }
 
+static bool tg_no_rule_group(struct throtl_grp *tg, bool rw) {
+	if (tg->bps[rw] == -1 && tg->iops[rw] == -1)
+		return 1;
+	return 0;
+}
+
 /*
  * Returns whether one can dispatch a bio or not. Also returns approx number
  * of jiffies to wait before this bio is with-in IO rate and can be dispatched
@@ -730,10 +752,6 @@ static void throtl_charge_bio(struct throtl_grp *tg, struct bio *bio)
 	tg->bytes_disp[rw] += bio->bi_size;
 	tg->io_disp[rw]++;
 
-	/*
-	 * TODO: This will take blkg->stats_lock. Figure out a way
-	 * to avoid this cost.
-	 */
 	blkiocg_update_dispatch_stats(&tg->blkg, bio->bi_size, rw, sync);
 }
 
@@ -1111,12 +1129,39 @@ int blk_throtl_bio(struct request_queue *q, struct bio **biop)
 	struct throtl_grp *tg;
 	struct bio *bio = *biop;
 	bool rw = bio_data_dir(bio), update_disptime = true;
+	struct blkio_cgroup *blkcg;
 
 	if (bio->bi_rw & REQ_THROTTLED) {
 		bio->bi_rw &= ~REQ_THROTTLED;
 		return 0;
 	}
 
+	/*
+	 * A throtl_grp pointer retrieved under rcu can be used to access
+	 * basic fields like stats and io rates. If a group has no rules,
+	 * just update the dispatch stats in lockless manner and return.
+	 */
+
+	rcu_read_lock();
+	blkcg = task_blkio_cgroup(current);
+	tg = throtl_find_tg(td, blkcg);
+	if (tg) {
+		throtl_tg_fill_dev_details(td, tg);
+
+		if (tg_no_rule_group(tg, rw)) {
+			blkiocg_update_dispatch_stats(&tg->blkg, bio->bi_size,
+					rw, bio->bi_rw & REQ_SYNC);
+			rcu_read_unlock();
+			return 0;
+		}
+	}
+	rcu_read_unlock();
+
+	/*
+	 * Either group has not been allocated yet or it is not an unlimited
+	 * IO group
+	 */
+
 	spin_lock_irq(q->queue_lock);
 	tg = throtl_get_tg(td);
 
-- 
1.7.1


  parent reply	other threads:[~2011-05-18 19:14 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-18 19:13 [RFC PATCH 00/14] blk-throttle: lockless bio processing for no throttle rule group Vivek Goyal
2011-05-18 19:13 ` [PATCH 01/14] blk-throttle: Use task_subsys_state() to determine a task's blkio_cgroup Vivek Goyal
2011-05-18 19:13 ` [PATCH 02/14] blk-throttle: Do the new group initialization with the help of a function Vivek Goyal
2011-05-18 19:13 ` [PATCH 03/14] blk-cgroup: move some fields of unaccounted_time file under right config option Vivek Goyal
2011-05-18 19:13 ` [PATCH 04/14] cfq-iosched: Get rid of redundant function parameter "create" Vivek Goyal
2011-05-18 19:13 ` [PATCH 05/14] cfq-iosched: Fix a possible race with cfq cgroup removal code Vivek Goyal
2011-05-18 19:13 ` [PATCH 06/14] blk-cgroup: Allow sleeping while dynamically allocating a group Vivek Goyal
2011-05-18 19:13 ` [PATCH 07/14] blk-throttle: Dynamically allocate root group Vivek Goyal
2011-05-18 19:13 ` [PATCH 08/14] blk-throttle: Introduce a helper function to fill in device details Vivek Goyal
2011-05-18 19:13 ` [PATCH 09/14] blk-throttle: Use helper function to add root throtl group to lists Vivek Goyal
2011-05-18 19:13 ` [PATCH 10/14] blk-throttle: Free up a group only after one rcu grace period Vivek Goyal
2011-05-18 19:13 ` [PATCH 11/14] blk-throttle: Make dispatch stats per cpu Vivek Goyal
2011-05-18 19:13 ` [PATCH 12/14] blk-cgroup: Make 64bit per cpu stats safe on 32bit arch Vivek Goyal
2011-05-18 19:13 ` [PATCH 13/14] blk-cgroup: Make cgroup stat reset path blkg->lock free for dispatch stats Vivek Goyal
2011-05-18 19:13 ` Vivek Goyal [this message]
2011-05-19 18:33 ` [RFC PATCH 00/14] blk-throttle: lockless bio processing for no throttle rule group Jens Axboe
2011-05-19 18:44   ` Vivek Goyal

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=1305746006-5837-15-git-send-email-vgoyal@redhat.com \
    --to=vgoyal@redhat.com \
    --cc=dpshah@google.com \
    --cc=jaxboe@fusionio.com \
    --cc=linux-kernel@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

Powered by JetHome