From: David Woodhouse <dwmw2@infradead.org>
To: Jens Axboe <jens.axboe@oracle.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Ric Wheeler <ricwheeler@gmail.com>,
linux-fsdevel@vger.kernel.org, gilad@codefidence.com,
matthew@wil.cx
Subject: [PATCH 7/7] [BLOCK] Allow elevators to sort/merge discard requests
Date: Sat, 09 Aug 2008 17:33:46 +0100 [thread overview]
Message-ID: <1218299626.26926.112.camel@pmac.infradead.org> (raw)
In-Reply-To: <1218299181.26926.88.camel@pmac.infradead.org>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
---
block/blk-core.c | 2 +-
block/blk-merge.c | 12 +++++++-----
block/elevator.c | 4 +++-
include/linux/blkdev.h | 5 +++--
4 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index 2442fb7..0c8ed97 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1078,7 +1078,7 @@ void init_request_from_bio(struct request *req, struct bio *bio)
if (unlikely(bio_barrier(bio)))
req->cmd_flags |= (REQ_HARDBARRIER | REQ_NOMERGE);
if (unlikely(bio_discard(bio))) {
- req->cmd_flags |= (REQ_SOFTBARRIER | REQ_DISCARD);
+ req->cmd_flags |= REQ_DISCARD;
req->q->prepare_discard_fn(req->q, req);
}
diff --git a/block/blk-merge.c b/block/blk-merge.c
index 5efc9e7..58a0ea3 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -11,7 +11,7 @@
void blk_recalc_rq_sectors(struct request *rq, int nsect)
{
- if (blk_fs_request(rq)) {
+ if (blk_fs_request(rq) || blk_discard_rq(rq)) {
rq->hard_sector += nsect;
rq->hard_nr_sectors -= nsect;
@@ -317,8 +317,9 @@ int ll_back_merge_fn(struct request_queue *q, struct request *req,
if (!bio_flagged(bio, BIO_SEG_VALID))
blk_recount_segments(q, bio);
len = req->biotail->bi_hw_back_size + bio->bi_hw_front_size;
- if (BIOVEC_VIRT_MERGEABLE(__BVEC_END(req->biotail), __BVEC_START(bio))
- && !BIOVEC_VIRT_OVERSIZE(len)) {
+ if (!bio_has_data(bio) ||
+ (BIOVEC_VIRT_MERGEABLE(__BVEC_END(req->biotail), __BVEC_START(bio))
+ && !BIOVEC_VIRT_OVERSIZE(len))) {
int mergeable = ll_new_mergeable(q, req, bio);
if (mergeable) {
@@ -356,8 +357,9 @@ int ll_front_merge_fn(struct request_queue *q, struct request *req,
blk_recount_segments(q, bio);
if (!bio_flagged(req->bio, BIO_SEG_VALID))
blk_recount_segments(q, req->bio);
- if (BIOVEC_VIRT_MERGEABLE(__BVEC_END(bio), __BVEC_START(req->bio)) &&
- !BIOVEC_VIRT_OVERSIZE(len)) {
+ if (!bio_has_data(bio) ||
+ (BIOVEC_VIRT_MERGEABLE(__BVEC_END(bio), __BVEC_START(req->bio)) &&
+ !BIOVEC_VIRT_OVERSIZE(len))) {
int mergeable = ll_new_mergeable(q, req, bio);
if (mergeable) {
diff --git a/block/elevator.c b/block/elevator.c
index 17ae417..4e27daa 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -444,6 +444,8 @@ void elv_dispatch_sort(struct request_queue *q, struct request *rq)
list_for_each_prev(entry, &q->queue_head) {
struct request *pos = list_entry_rq(entry);
+ if (blk_discard_rq(rq) != blk_discard_rq(pos))
+ break;
if (rq_data_dir(rq) != rq_data_dir(pos))
break;
if (pos->cmd_flags & stop_flags)
@@ -698,7 +700,7 @@ void __elv_add_request(struct request_queue *q, struct request *rq, int where,
* this request is scheduling boundary, update
* end_sector
*/
- if (blk_fs_request(rq)) {
+ if (blk_fs_request(rq) || blk_discard_rq(rq)) {
q->end_sector = rq_end_sector(rq);
q->boundary_rq = rq;
}
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index f8957c5..b9cb7e1 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -531,7 +531,7 @@ enum {
#define blk_noretry_request(rq) ((rq)->cmd_flags & REQ_FAILFAST)
#define blk_rq_started(rq) ((rq)->cmd_flags & REQ_STARTED)
-#define blk_account_rq(rq) (blk_rq_started(rq) && blk_fs_request(rq))
+#define blk_account_rq(rq) (blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq)))
#define blk_pm_suspend_request(rq) ((rq)->cmd_type == REQ_TYPE_PM_SUSPEND)
#define blk_pm_resume_request(rq) ((rq)->cmd_type == REQ_TYPE_PM_RESUME)
@@ -588,7 +588,8 @@ static inline void blk_clear_queue_full(struct request_queue *q, int rw)
#define RQ_NOMERGE_FLAGS \
(REQ_NOMERGE | REQ_STARTED | REQ_HARDBARRIER | REQ_SOFTBARRIER)
#define rq_mergeable(rq) \
- (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && blk_fs_request((rq)))
+ (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \
+ (blk_discard_rq(rq) || blk_fs_request((rq))))
/*
* q->prep_rq_fn return values
--
1.5.5.1
--
David Woodhouse Open Source Technology Centre
David.Woodhouse@intel.com Intel Corporation
next prev parent reply other threads:[~2008-08-09 16:33 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-09 16:26 [PATCH 0/7] Discard requests, v2 David Woodhouse
2008-08-09 16:29 ` [PATCH 1/7] [BLOCK] Fix typo causing compile error in blk_queue_bounce() David Woodhouse
2008-08-09 16:30 ` [PATCH 2/7] [BLOCK] Fix up comments about matching flags between bio and rq David Woodhouse
2008-08-09 16:30 ` [PATCH 3/7] [BLOCK] Add 'discard' request handling David Woodhouse
2008-08-09 20:39 ` OGAWA Hirofumi
2008-08-09 21:37 ` David Woodhouse
2008-08-10 6:32 ` David Woodhouse
2008-08-09 16:31 ` [PATCH 4/7] [FAT] Let the block device know when sectors can be discarded David Woodhouse
2008-08-09 16:32 ` [PATCH 5/7] [MTD] Support 'discard sectors' operation in translation layer support core David Woodhouse
2008-08-09 16:33 ` [PATCH 6/7] [MTD] [FTL] Support 'discard sectors' operation David Woodhouse
2008-08-09 16:33 ` David Woodhouse [this message]
2008-10-03 20:29 ` [PATCH 7/7] [BLOCK] Allow elevators to sort/merge discard requests Andrew Morton
2008-10-07 12:07 ` Jens Axboe
2008-08-09 22:48 ` [PATCH 0/7] Discard requests, v2 OGAWA Hirofumi
2008-08-10 10:25 ` David Woodhouse
2008-08-10 16:37 ` Jamie Lokier
2008-08-10 17:55 ` OGAWA Hirofumi
2008-08-10 20:07 ` David Woodhouse
2008-08-10 21:40 ` OGAWA Hirofumi
2008-08-11 9:40 ` David Woodhouse
2008-08-11 10:25 ` OGAWA Hirofumi
2008-08-11 13:17 ` David Woodhouse
2008-08-11 14:21 ` OGAWA Hirofumi
2008-08-10 10:29 ` [PATCH 8/7] blktrace: support discard requests David Woodhouse
2008-08-10 10:35 ` [USERSPACE PATCH] " David Woodhouse
2008-08-15 8:43 ` Jens Axboe
2008-08-15 9:01 ` David Woodhouse
2008-08-15 9:08 ` Jens Axboe
2008-08-10 10:41 ` [PATCH 8/7] " David Woodhouse
2008-08-13 11:17 ` Jens Axboe
2008-08-10 11:48 ` [PATCH 9/7] blktrace: simplify flags handling in __blk_add_trace David Woodhouse
2008-08-10 11:50 ` David Woodhouse
2008-08-11 15:11 ` [PATCH 10/7] [BLOCK] Add BLKDISCARD ioctl to allow userspace to discard sectors David Woodhouse
2008-08-11 18:27 ` Matthew Wilcox
2008-08-11 20:52 ` David Woodhouse
2008-08-12 9:14 ` [PATCH 0/7] Discard requests, v2 Jens Axboe
2008-08-12 10:00 ` David Woodhouse
2008-08-12 10:54 ` Jens Axboe
2008-08-12 11:16 ` David Woodhouse
2008-08-12 12:19 ` David Woodhouse
2008-08-12 12:53 ` Jens Axboe
2008-08-12 13:04 ` David Woodhouse
2008-08-12 15:47 ` David Woodhouse
2008-08-12 18:04 ` Jamie Lokier
2008-08-13 10:22 ` David Woodhouse
2008-08-13 12:19 ` Jamie Lokier
2008-08-13 12:26 ` David Woodhouse
2008-08-13 11:15 ` Jens Axboe
2008-08-13 11:23 ` David Woodhouse
2008-08-13 11:32 ` Jens Axboe
2008-08-13 11:34 ` David Woodhouse
2008-08-13 12:07 ` David Woodhouse
2008-08-14 7:49 ` Jens Axboe
2008-08-14 7:52 ` David Woodhouse
2008-08-14 7:25 ` David Woodhouse
2008-08-14 7:33 ` Stephen Rothwell
2008-08-14 7:37 ` David Woodhouse
2008-08-14 7:42 ` Jens Axboe
2008-08-14 7:46 ` Stephen Rothwell
2008-08-12 18:10 ` Jamie Lokier
2008-08-13 10:20 ` David Woodhouse
2008-08-12 11:42 ` Matthew Wilcox
2008-08-12 11:46 ` David Woodhouse
2008-08-12 19:53 ` OGAWA Hirofumi
2008-08-12 20:11 ` OGAWA Hirofumi
2008-08-13 11:39 ` [PATCH 11/7] Kill REQ_TYPE_FLUSH David Woodhouse
2008-08-13 11:58 ` Geert Uytterhoeven
2008-08-13 12:43 ` David Woodhouse
2008-08-13 15:40 ` Jens Axboe
2008-08-13 15:46 ` David Woodhouse
2008-08-16 17:08 ` [PATCH 0/2] MMC discard support (was [PATCH 0/7] Discard requests, v2) Pierre Ossman
2008-08-16 17:11 ` [PATCH 1/2] mmc_block: factor out the mmc request handling Pierre Ossman
2008-08-16 17:12 ` [PATCH 2/2] mmc_block: erase discarded blocks Pierre Ossman
2008-08-16 17:38 ` [PATCH 0/2] MMC discard support (was [PATCH 0/7] Discard requests, v2) David Woodhouse
2008-08-16 17:51 ` Pierre Ossman
2008-08-22 9:24 ` Jens Axboe
2008-08-22 9:45 ` David Woodhouse
2008-08-22 10:50 ` Jens Axboe
2008-08-22 10:58 ` David Woodhouse
2008-08-22 11:11 ` Pierre Ossman
2008-08-22 11:19 ` Jens Axboe
2008-08-22 11:13 ` Pierre Ossman
2008-08-22 11:20 ` Jens Axboe
2008-08-22 14:49 ` OGAWA Hirofumi
2008-08-22 23:02 ` Pierre Ossman
2008-08-22 23:59 ` OGAWA Hirofumi
2008-08-24 11:23 ` Pierre Ossman
2008-08-24 13:39 ` OGAWA Hirofumi
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=1218299626.26926.112.camel@pmac.infradead.org \
--to=dwmw2@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=gilad@codefidence.com \
--cc=jens.axboe@oracle.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=matthew@wil.cx \
--cc=ricwheeler@gmail.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;
as well as URLs for NNTP newsgroup(s).