From: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
To: jaxboe@fusionio.com, jmarchan@redhat.com,
torvalds@linux-foundation.org, vgoyal@redhat.com,
Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
lkml <linux-kernel@vger.kernel.org>
Subject: [PATCH 0/2 v7] blk: fix a wrong accounting of hd_struct->in_flight
Date: Wed, 08 Dec 2010 14:42:46 +0900 [thread overview]
Message-ID: <4CFF1AD6.2020007@jp.fujitsu.com> (raw)
From: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
This patch fixes the problem that Yasuaki reported on the following post:
https://lkml.org/lkml/2010/10/12/23
How to fix:
Does not change the target partition of diskstat accounting after
merging multiple IOs so that in_flight will not go out of the sync.
It is achieved by keeping track of the sector number against which
we do the accounting.
Signed-off-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Tested-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
---
block/blk-core.c | 12 +++++++-----
block/blk-merge.c | 2 +-
include/linux/blkdev.h | 7 +++++++
3 files changed, 15 insertions(+), 6 deletions(-)
Index: linux-2.6.37-rc5/block/blk-core.c
===================================================================
--- linux-2.6.37-rc5.orig/block/blk-core.c 2010-12-07 13:09:04.000000000 +0900
+++ linux-2.6.37-rc5/block/blk-core.c 2010-12-08 09:42:40.000000000 +0900
@@ -64,11 +64,13 @@ static void drive_stat_acct(struct reque
return;
cpu = part_stat_lock();
- part = disk_map_sector_rcu(rq->rq_disk, blk_rq_pos(rq));
- if (!new_io)
+ if (!new_io) {
+ part = disk_map_sector_rcu(rq->rq_disk, blk_rq_acct_pos(rq));
part_stat_inc(cpu, part, merges[rw]);
- else {
+ } else {
+ rq->__acct_sector = rq->__sector;
+ part = disk_map_sector_rcu(rq->rq_disk, blk_rq_acct_pos(rq));
part_round_stats(cpu, part);
part_inc_in_flight(part, rw);
}
@@ -1776,7 +1778,7 @@ static void blk_account_io_completion(st
int cpu;
cpu = part_stat_lock();
- part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req));
+ part = disk_map_sector_rcu(req->rq_disk, blk_rq_acct_pos(req));
part_stat_add(cpu, part, sectors[rw], bytes >> 9);
part_stat_unlock();
}
@@ -1796,7 +1798,7 @@ static void blk_account_io_done(struct r
int cpu;
cpu = part_stat_lock();
- part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req));
+ part = disk_map_sector_rcu(req->rq_disk, blk_rq_acct_pos(req));
part_stat_inc(cpu, part, ios[rw]);
part_stat_add(cpu, part, ticks[rw], duration);
Index: linux-2.6.37-rc5/block/blk-merge.c
===================================================================
--- linux-2.6.37-rc5.orig/block/blk-merge.c 2010-12-07 13:09:04.000000000 +0900
+++ linux-2.6.37-rc5/block/blk-merge.c 2010-12-08 09:43:50.000000000 +0900
@@ -351,7 +351,7 @@ static void blk_account_io_merge(struct
int cpu;
cpu = part_stat_lock();
- part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req));
+ part = disk_map_sector_rcu(req->rq_disk, blk_rq_acct_pos(req));
part_round_stats(cpu, part);
part_dec_in_flight(part, rq_data_dir(req));
Index: linux-2.6.37-rc5/include/linux/blkdev.h
===================================================================
--- linux-2.6.37-rc5.orig/include/linux/blkdev.h 2010-12-07 13:09:04.000000000 +0900
+++ linux-2.6.37-rc5/include/linux/blkdev.h 2010-12-08 13:58:02.000000000 +0900
@@ -91,6 +91,7 @@ struct request {
/* the following two fields are internal, NEVER access directly */
unsigned int __data_len; /* total data len */
sector_t __sector; /* sector cursor */
+ sector_t __acct_sector; /* sector cursor for accounting */
struct bio *bio;
struct bio *biotail;
@@ -719,6 +720,7 @@ static inline struct request_queue *bdev
/*
* blk_rq_pos() : the current sector
+ * blk_rq_acct_pos() : the sector for accounting
* blk_rq_bytes() : bytes left in the entire request
* blk_rq_cur_bytes() : bytes left in the current segment
* blk_rq_err_bytes() : bytes left till the next error boundary
@@ -730,6 +732,11 @@ static inline sector_t blk_rq_pos(const
return rq->__sector;
}
+static inline sector_t blk_rq_acct_pos(const struct request *rq)
+{
+ return rq->__acct_sector;
+}
+
static inline unsigned int blk_rq_bytes(const struct request *rq)
{
return rq->__data_len;
reply other threads:[~2010-12-08 5:43 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=4CFF1AD6.2020007@jp.fujitsu.com \
--to=takeuchi_satoru@jp.fujitsu.com \
--cc=isimatu.yasuaki@jp.fujitsu.com \
--cc=jaxboe@fusionio.com \
--cc=jmarchan@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox