From: "Matias Bjørling" <m@bjorling.me>
To: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: "Javier González" <javier@cnexlabs.com>,
"Matias Bjørling" <m@bjorling.me>
Subject: [PATCH 24/25] lightnvm: pblk: add iostat support
Date: Wed, 20 Dec 2017 18:22:04 +0100 [thread overview]
Message-ID: <20171220172205.26464-25-m@bjorling.me> (raw)
In-Reply-To: <20171220172205.26464-1-m@bjorling.me>
From: Javier González <javier@cnexlabs.com>
Since pblk registers its own block device, the iostat accounting is
not automatically done for us. Therefore, add the necessary
accounting logic to satisfy the iostat interface.
Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <m@bjorling.me>
---
drivers/lightnvm/pblk-cache.c | 5 +++++
drivers/lightnvm/pblk-read.c | 31 +++++++++++++++++++------------
drivers/lightnvm/pblk.h | 1 +
3 files changed, 25 insertions(+), 12 deletions(-)
diff --git a/drivers/lightnvm/pblk-cache.c b/drivers/lightnvm/pblk-cache.c
index 0d227ef..000fcad 100644
--- a/drivers/lightnvm/pblk-cache.c
+++ b/drivers/lightnvm/pblk-cache.c
@@ -19,12 +19,16 @@
int pblk_write_to_cache(struct pblk *pblk, struct bio *bio, unsigned long flags)
{
+ struct request_queue *q = pblk->dev->q;
struct pblk_w_ctx w_ctx;
sector_t lba = pblk_get_lba(bio);
+ unsigned long start_time = jiffies;
unsigned int bpos, pos;
int nr_entries = pblk_get_secs(bio);
int i, ret;
+ generic_start_io_acct(q, WRITE, bio_sectors(bio), &pblk->disk->part0);
+
/* Update the write buffer head (mem) with the entries that we can
* write. The write in itself cannot fail, so there is no need to
* rollback from here on.
@@ -67,6 +71,7 @@ int pblk_write_to_cache(struct pblk *pblk, struct bio *bio, unsigned long flags)
pblk_rl_inserted(&pblk->rl, nr_entries);
out:
+ generic_end_io_acct(q, WRITE, &pblk->disk->part0, start_time);
pblk_write_should_kick(pblk);
return ret;
}
diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c
index 0fe0c04..2f76128 100644
--- a/drivers/lightnvm/pblk-read.c
+++ b/drivers/lightnvm/pblk-read.c
@@ -158,8 +158,12 @@ static void pblk_end_user_read(struct bio *bio)
static void __pblk_end_io_read(struct pblk *pblk, struct nvm_rq *rqd,
bool put_line)
{
+ struct nvm_tgt_dev *dev = pblk->dev;
struct pblk_g_ctx *r_ctx = nvm_rq_to_pdu(rqd);
struct bio *bio = rqd->bio;
+ unsigned long start_time = r_ctx->start_time;
+
+ generic_end_io_acct(dev->q, READ, &pblk->disk->part0, start_time);
if (rqd->error)
pblk_log_read_err(pblk, rqd);
@@ -193,9 +197,9 @@ static void pblk_end_io_read(struct nvm_rq *rqd)
__pblk_end_io_read(pblk, rqd, true);
}
-static int pblk_fill_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd,
- unsigned int bio_init_idx,
- unsigned long *read_bitmap)
+static int pblk_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd,
+ unsigned int bio_init_idx,
+ unsigned long *read_bitmap)
{
struct bio *new_bio, *bio = rqd->bio;
struct pblk_sec_meta *meta_list = rqd->meta_list;
@@ -306,6 +310,8 @@ static int pblk_fill_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd,
return NVM_IO_OK;
err:
+ pr_err("pblk: failed to perform partial read\n");
+
/* Free allocated pages in new bio */
pblk_bio_free_pages(pblk, bio, 0, new_bio->bi_vcnt);
__pblk_end_io_read(pblk, rqd, false);
@@ -357,6 +363,7 @@ static void pblk_read_rq(struct pblk *pblk, struct nvm_rq *rqd,
int pblk_submit_read(struct pblk *pblk, struct bio *bio)
{
struct nvm_tgt_dev *dev = pblk->dev;
+ struct request_queue *q = dev->q;
sector_t blba = pblk_get_lba(bio);
unsigned int nr_secs = pblk_get_secs(bio);
struct pblk_g_ctx *r_ctx;
@@ -372,6 +379,8 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
return NVM_IO_ERR;
}
+ generic_start_io_acct(q, READ, bio_sectors(bio), &pblk->disk->part0);
+
bitmap_zero(&read_bitmap, nr_secs);
rqd = pblk_alloc_rqd(pblk, PBLK_READ);
@@ -383,6 +392,7 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
rqd->end_io = pblk_end_io_read;
r_ctx = nvm_rq_to_pdu(rqd);
+ r_ctx->start_time = jiffies;
r_ctx->lba = blba;
/* Save the index for this bio's start. This is needed in case
@@ -422,7 +432,7 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
int_bio = bio_clone_fast(bio, GFP_KERNEL, pblk_bio_set);
if (!int_bio) {
pr_err("pblk: could not clone read bio\n");
- return NVM_IO_ERR;
+ goto fail_end_io;
}
rqd->bio = int_bio;
@@ -433,7 +443,7 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
pr_err("pblk: read IO submission failed\n");
if (int_bio)
bio_put(int_bio);
- return ret;
+ goto fail_end_io;
}
return NVM_IO_OK;
@@ -442,17 +452,14 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
/* The read bio request could be partially filled by the write buffer,
* but there are some holes that need to be read from the drive.
*/
- ret = pblk_fill_partial_read_bio(pblk, rqd, bio_init_idx, &read_bitmap);
- if (ret) {
- pr_err("pblk: failed to perform partial read\n");
- return ret;
- }
-
- return NVM_IO_OK;
+ return pblk_partial_read_bio(pblk, rqd, bio_init_idx, &read_bitmap);
fail_rqd_free:
pblk_free_rqd(pblk, rqd, PBLK_READ);
return ret;
+fail_end_io:
+ __pblk_end_io_read(pblk, rqd, false);
+ return ret;
}
static int read_ppalist_rq_gc(struct pblk *pblk, struct nvm_rq *rqd,
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h
index cb38990..1e9eafd 100644
--- a/drivers/lightnvm/pblk.h
+++ b/drivers/lightnvm/pblk.h
@@ -113,6 +113,7 @@ struct pblk_c_ctx {
/* read context */
struct pblk_g_ctx {
void *private;
+ unsigned long start_time;
u64 lba;
};
--
2.9.3
next prev parent reply other threads:[~2017-12-20 17:23 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-20 17:21 [PATCH 00/25] Updates to lightnvm and pblk Matias Bjørling
2017-12-20 17:21 ` [PATCH 01/25] null_blk: remove lightnvm support Matias Bjørling
2017-12-20 17:21 ` [PATCH 02/25] lightnvm: remove rrpc Matias Bjørling
2017-12-20 17:21 ` [PATCH 03/25] lightnvm: use internal pblk methods Matias Bjørling
2017-12-20 17:21 ` [PATCH 04/25] lightnvm: remove hybrid ocssd 1.2 support Matias Bjørling
2017-12-20 17:21 ` [PATCH 05/25] lightnvm: remove unnecessary field from nvm_rq Matias Bjørling
2017-12-20 17:21 ` [PATCH 06/25] lightnvm: remove lower page tables Matias Bjørling
2017-12-20 17:21 ` [PATCH 07/25] lightnvm: make geometry structures 2.0 ready Matias Bjørling
2017-12-20 17:21 ` [PATCH 08/25] lightnvm: refactor target type lookup Matias Bjørling
2017-12-20 17:21 ` [PATCH 09/25] lightnvm: guarantee target unique name across devs Matias Bjørling
2017-12-20 17:21 ` [PATCH 10/25] lightnvm: pblk: compress and reorder helper functions Matias Bjørling
2017-12-20 17:21 ` [PATCH 11/25] lightnvm: pblk: remove pblk_for_each_lun helper Matias Bjørling
2017-12-20 17:21 ` [PATCH 12/25] lightnvm: pblk: refactor emeta consistency check Matias Bjørling
2017-12-20 17:21 ` [PATCH 13/25] lightnvm: pblk: rename sync_point to flush_point Matias Bjørling
2017-12-20 17:21 ` [PATCH 14/25] lightnvm: pblk: clear flush point on completed writes Matias Bjørling
2017-12-28 13:19 ` [PATCH v2] " Hans Holmberg
2017-12-20 17:21 ` [PATCH 15/25] lightnvm: pblk: prevent premature sync point resets Matias Bjørling
2017-12-20 17:21 ` [PATCH 16/25] lightnvm: pblk: remove pblk_gc_stop Matias Bjørling
2017-12-20 17:21 ` [PATCH 17/25] lightnvm: pblk: use exact free block counter in RL Matias Bjørling
2017-12-20 17:21 ` [PATCH 18/25] lightnvm: set target over-provision on create ioctl Matias Bjørling
2017-12-20 17:21 ` [PATCH 19/25] lightnvm: pblk: ignore high ecc errors on recovery Matias Bjørling
2017-12-20 17:22 ` [PATCH 20/25] lightnvm: pblk: do not log recovery read errors Matias Bjørling
2017-12-20 17:22 ` [PATCH 21/25] lightnvm: pblk: ensure kthread alloc. before kicking it Matias Bjørling
2017-12-20 17:22 ` [PATCH 22/25] lightnvm: pblk: free write buffer on init failure Matias Bjørling
2017-12-20 17:22 ` [PATCH 23/25] lightnvm: pblk: print instance name on instance info Matias Bjørling
2017-12-20 17:22 ` Matias Bjørling [this message]
2017-12-20 17:22 ` [PATCH 25/25] lightnvm: pblk: refactor pblk_ppa_comp function Matias Bjørling
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=20171220172205.26464-25-m@bjorling.me \
--to=m@bjorling.me \
--cc=javier@cnexlabs.com \
--cc=linux-block@vger.kernel.org \
--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
all inboxes | Powered by JetHome®