diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2009-04-06 08:48:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-06 11:04:54 -0400 |
commit | aeb6fafb8fa53266d70ca7474fcda2bdaf96524a (patch) | |
tree | ebe8e0c616a9dbfdfe5184b64d0150ea02d3d1b2 /block | |
parent | 644b2d99b7a8677a56909a7b1fde31677eba4471 (diff) |
block: Add flag for telling the IO schedulers NOT to anticipate more IO
By default, CFQ will anticipate more IO from a given io context if the
previously completed IO was sync. This used to be fine, since the only
sync IO was reads and O_DIRECT writes. But with more "normal" sync writes
being used now, we don't want to anticipate for those.
Add a bio/request flag that informs the IO scheduler that this is a sync
request that we should not idle for. Introduce WRITE_ODIRECT specifically
for O_DIRECT writes, and make sure that the other sync writes set this
flag.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-core.c | 2 | ||||
-rw-r--r-- | block/cfq-iosched.c | 4 |
2 files changed, 5 insertions, 1 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index c4198f083e5b..25572802dac2 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -1128,6 +1128,8 @@ void init_request_from_bio(struct request *req, struct bio *bio) | |||
1128 | req->cmd_flags |= REQ_UNPLUG; | 1128 | req->cmd_flags |= REQ_UNPLUG; |
1129 | if (bio_rw_meta(bio)) | 1129 | if (bio_rw_meta(bio)) |
1130 | req->cmd_flags |= REQ_RW_META; | 1130 | req->cmd_flags |= REQ_RW_META; |
1131 | if (bio_noidle(bio)) | ||
1132 | req->cmd_flags |= REQ_NOIDLE; | ||
1131 | 1133 | ||
1132 | req->errors = 0; | 1134 | req->errors = 0; |
1133 | req->hard_sector = req->sector = bio->bi_sector; | 1135 | req->hard_sector = req->sector = bio->bi_sector; |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 664ebfd092ec..9e809345f71a 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1992,8 +1992,10 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq) | |||
1992 | } | 1992 | } |
1993 | if (cfq_slice_used(cfqq) || cfq_class_idle(cfqq)) | 1993 | if (cfq_slice_used(cfqq) || cfq_class_idle(cfqq)) |
1994 | cfq_slice_expired(cfqd, 1); | 1994 | cfq_slice_expired(cfqd, 1); |
1995 | else if (sync && RB_EMPTY_ROOT(&cfqq->sort_list)) | 1995 | else if (sync && !rq_noidle(rq) && |
1996 | RB_EMPTY_ROOT(&cfqq->sort_list)) { | ||
1996 | cfq_arm_slice_timer(cfqd); | 1997 | cfq_arm_slice_timer(cfqd); |
1998 | } | ||
1997 | } | 1999 | } |
1998 | 2000 | ||
1999 | if (!cfqd->rq_in_driver) | 2001 | if (!cfqd->rq_in_driver) |