From: Christoph Hellwig <hch@lst.de>
To: Shaohua Li <shli@fb.com>, neilb@suse.de
Cc: linux-raid@vger.kernel.org, Kernel-team@fb.com, dan.j.williams@intel.com
Subject: [PATCH 05/12] raid5-cache: use FUA writes for the log
Date: Sat, 12 Sep 2015 08:17:11 +0200 [thread overview]
Message-ID: <1442038638-6947-6-git-send-email-hch@lst.de> (raw)
In-Reply-To: <1442038638-6947-1-git-send-email-hch@lst.de>
If we submit writes with the FUA bit for the log they are guaranteed to
be on stable storage once the endio callback is called. This allows
to simplify the IO unit state machine, and decrease latencies a lot
when the device supports FUA. Use this to improve performance on devices
that support FUA, or keep the old code if the device doesn't support it.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
drivers/md/raid5-cache.c | 35 ++++++++++++++++++++++++++++++-----
1 file changed, 30 insertions(+), 5 deletions(-)
diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
index c288c43..d813c89 100644
--- a/drivers/md/raid5-cache.c
+++ b/drivers/md/raid5-cache.c
@@ -81,6 +81,8 @@ struct r5l_log {
struct list_head no_space_stripes; /* pending stripes, log has no space */
spinlock_t no_space_stripes_lock;
+
+ bool use_fua;
};
/*
@@ -203,6 +205,22 @@ static void r5l_io_run_stripes(struct r5l_io_unit *io)
}
}
+static void r5l_log_run_stripes(struct r5l_log *log)
+{
+ struct r5l_io_unit *io, *next;
+
+ assert_spin_locked(&log->io_list_lock);
+
+ list_for_each_entry_safe(io, next, &log->running_ios, log_sibling) {
+ /* don't change list order */
+ if (io->state < IO_UNIT_IO_END)
+ break;
+
+ list_move_tail(&io->log_sibling, &log->finished_ios);
+ r5l_io_run_stripes(io);
+ }
+}
+
/* XXX: totally ignores I/O errors */
static void r5l_log_endio(struct bio *bio)
{
@@ -217,11 +235,15 @@ static void r5l_log_endio(struct bio *bio)
spin_lock_irqsave(&log->io_list_lock, flags);
__r5l_set_io_unit_state(io, IO_UNIT_IO_END);
- r5l_move_io_unit_list(&log->running_ios, &log->io_end_ios,
- IO_UNIT_IO_END);
+ if (log->use_fua)
+ r5l_log_run_stripes(log);
+ else
+ r5l_move_io_unit_list(&log->running_ios, &log->io_end_ios,
+ IO_UNIT_IO_END);
spin_unlock_irqrestore(&log->io_list_lock, flags);
- md_wakeup_thread(log->rdev->mddev->thread);
+ if (!log->use_fua)
+ md_wakeup_thread(log->rdev->mddev->thread);
}
static void r5l_submit_current_io(struct r5l_log *log)
@@ -248,7 +270,7 @@ static void r5l_submit_current_io(struct r5l_log *log)
while ((bio = bio_list_pop(&io->bios))) {
/* all IO must start from rdev->data_offset */
bio->bi_iter.bi_sector += log->rdev->data_offset;
- submit_bio(WRITE, bio);
+ submit_bio(WRITE | (log->use_fua ? REQ_FUA : 0), bio);
}
}
@@ -614,7 +636,8 @@ static void r5l_log_flush_endio(struct bio *bio)
void r5l_flush_stripe_to_raid(struct r5l_log *log)
{
bool do_flush;
- if (!log)
+
+ if (!log || log->use_fua)
return;
spin_lock_irq(&log->io_list_lock);
@@ -1066,6 +1089,8 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev)
return -ENOMEM;
log->rdev = rdev;
+ log->use_fua = (rdev->bdev->bd_disk->queue->flush_flags & REQ_FUA);
+
log->uuid_checksum = crc32_le(~0, (void *)rdev->mddev->uuid,
sizeof(rdev->mddev->uuid));
--
1.9.1
next prev parent reply other threads:[~2015-09-12 6:17 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-12 6:17 raid5-cache I/O path improvements V2 Christoph Hellwig
2015-09-12 6:17 ` [PATCH 01/12] raid5-cache: port to 4.3-rc Christoph Hellwig
2015-09-12 6:17 ` [PATCH 02/12] raid5-cache: free I/O units earlier Christoph Hellwig
2015-09-15 7:00 ` Neil Brown
2015-09-17 1:50 ` Christoph Hellwig
2015-09-15 8:07 ` Neil Brown
2015-09-17 1:48 ` Christoph Hellwig
2015-09-12 6:17 ` [PATCH 03/12] raid5-cache: rename flushed_ios to finished_ios Christoph Hellwig
2015-09-12 6:17 ` [PATCH 04/12] raid5-cache: factor out a helper to run all stripes for an I/O unit Christoph Hellwig
2015-09-12 6:17 ` Christoph Hellwig [this message]
2015-09-12 6:17 ` [PATCH 06/12] raid5-cache: clean up r5l_get_meta Christoph Hellwig
2015-09-12 6:17 ` [PATCH 07/12] raid5-cache: refactor bio allocation Christoph Hellwig
2015-09-12 6:17 ` [PATCH 08/12] raid5-cache: take rdev->data_offset into account early on Christoph Hellwig
2015-09-12 6:17 ` [PATCH 09/12] raid5-cache: inline r5l_alloc_io_unit into r5l_new_meta Christoph Hellwig
2015-09-12 6:17 ` [PATCH 10/12] raid5-cache: new helper: r5_reserve_log_entry Christoph Hellwig
2015-09-12 6:17 ` [PATCH 11/12] raid5-cache: small log->seq cleanup Christoph Hellwig
2015-09-12 6:17 ` [PATCH 12/12] raid5-cache: use bio chaining Christoph Hellwig
2015-09-14 19:11 ` raid5-cache I/O path improvements V2 Shaohua Li
2015-09-15 7:23 ` Neil Brown
2015-09-15 21:54 ` Shaohua Li
2015-09-17 1:53 ` Christoph Hellwig
2015-09-28 14:01 ` Christoph Hellwig
2015-09-30 5:39 ` Neil Brown
2015-09-30 15:00 ` Christoph Hellwig
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=1442038638-6947-6-git-send-email-hch@lst.de \
--to=hch@lst.de \
--cc=Kernel-team@fb.com \
--cc=dan.j.williams@intel.com \
--cc=linux-raid@vger.kernel.org \
--cc=neilb@suse.de \
--cc=shli@fb.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).