diff options
author | Javier González <jg@lightnvm.io> | 2017-06-26 05:57:19 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-06-26 18:27:39 -0400 |
commit | 0880a9aa2d91ff5131ecd0902a758afe760b9c1c (patch) | |
tree | 4a6859cc239610cf63a4a4875a6048e5b6a6b680 | |
parent | fd1b0158f5f5937d73d5c61e229350c6b905d0da (diff) |
lightnvm: pblk: delete redundant buffer pointer
After refactoring the metadata path, the backpointer controlling
synced I/Os in a line becomes unnecessary; metadata is scheduled
on the write thread, thus we know when the end of the line is reached
and act on it directly.
Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <matias@cnexlabs.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | drivers/lightnvm/pblk-core.c | 18 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-init.c | 1 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-map.c | 2 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-recovery.c | 2 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-sysfs.c | 10 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-write.c | 13 | ||||
-rw-r--r-- | drivers/lightnvm/pblk.h | 6 |
7 files changed, 11 insertions, 41 deletions
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c index 6e4b06f841e7..beae1618483f 100644 --- a/drivers/lightnvm/pblk-core.c +++ b/drivers/lightnvm/pblk-core.c | |||
@@ -65,8 +65,8 @@ static void pblk_end_io_erase(struct nvm_rq *rqd) | |||
65 | mempool_free(rqd, pblk->g_rq_pool); | 65 | mempool_free(rqd, pblk->g_rq_pool); |
66 | } | 66 | } |
67 | 67 | ||
68 | static void __pblk_map_invalidate(struct pblk *pblk, struct pblk_line *line, | 68 | void __pblk_map_invalidate(struct pblk *pblk, struct pblk_line *line, |
69 | u64 paddr) | 69 | u64 paddr) |
70 | { | 70 | { |
71 | struct pblk_line_mgmt *l_mg = &pblk->l_mg; | 71 | struct pblk_line_mgmt *l_mg = &pblk->l_mg; |
72 | struct list_head *move_list = NULL; | 72 | struct list_head *move_list = NULL; |
@@ -129,18 +129,6 @@ void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa) | |||
129 | __pblk_map_invalidate(pblk, line, paddr); | 129 | __pblk_map_invalidate(pblk, line, paddr); |
130 | } | 130 | } |
131 | 131 | ||
132 | void pblk_map_pad_invalidate(struct pblk *pblk, struct pblk_line *line, | ||
133 | u64 paddr) | ||
134 | { | ||
135 | __pblk_map_invalidate(pblk, line, paddr); | ||
136 | |||
137 | pblk_rb_sync_init(&pblk->rwb, NULL); | ||
138 | line->left_ssecs--; | ||
139 | if (!line->left_ssecs) | ||
140 | pblk_line_run_ws(pblk, line, NULL, pblk_line_close_ws); | ||
141 | pblk_rb_sync_end(&pblk->rwb, NULL); | ||
142 | } | ||
143 | |||
144 | static void pblk_invalidate_range(struct pblk *pblk, sector_t slba, | 132 | static void pblk_invalidate_range(struct pblk *pblk, sector_t slba, |
145 | unsigned int nr_secs) | 133 | unsigned int nr_secs) |
146 | { | 134 | { |
@@ -1057,7 +1045,7 @@ retry_smeta: | |||
1057 | line->sec_in_line -= lm->emeta_sec[0]; | 1045 | line->sec_in_line -= lm->emeta_sec[0]; |
1058 | line->emeta_ssec = off; | 1046 | line->emeta_ssec = off; |
1059 | line->nr_valid_lbas = 0; | 1047 | line->nr_valid_lbas = 0; |
1060 | line->left_ssecs = line->left_msecs = line->sec_in_line; | 1048 | line->left_msecs = line->sec_in_line; |
1061 | *line->vsc = cpu_to_le32(line->sec_in_line); | 1049 | *line->vsc = cpu_to_le32(line->sec_in_line); |
1062 | 1050 | ||
1063 | if (lm->sec_per_line - line->sec_in_line != | 1051 | if (lm->sec_per_line - line->sec_in_line != |
diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c index 54e03c3e7962..cd10f2d74cf9 100644 --- a/drivers/lightnvm/pblk-init.c +++ b/drivers/lightnvm/pblk-init.c | |||
@@ -890,7 +890,6 @@ static void *pblk_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk, | |||
890 | atomic_long_set(&pblk->req_writes, 0); | 890 | atomic_long_set(&pblk->req_writes, 0); |
891 | atomic_long_set(&pblk->sub_writes, 0); | 891 | atomic_long_set(&pblk->sub_writes, 0); |
892 | atomic_long_set(&pblk->sync_writes, 0); | 892 | atomic_long_set(&pblk->sync_writes, 0); |
893 | atomic_long_set(&pblk->compl_writes, 0); | ||
894 | atomic_long_set(&pblk->inflight_reads, 0); | 893 | atomic_long_set(&pblk->inflight_reads, 0); |
895 | atomic_long_set(&pblk->cache_reads, 0); | 894 | atomic_long_set(&pblk->cache_reads, 0); |
896 | atomic_long_set(&pblk->sync_reads, 0); | 895 | atomic_long_set(&pblk->sync_reads, 0); |
diff --git a/drivers/lightnvm/pblk-map.c b/drivers/lightnvm/pblk-map.c index 08580a649499..9942d9bc7b3a 100644 --- a/drivers/lightnvm/pblk-map.c +++ b/drivers/lightnvm/pblk-map.c | |||
@@ -56,7 +56,7 @@ static void pblk_map_page_data(struct pblk *pblk, unsigned int sentry, | |||
56 | u64 addr_empty = cpu_to_le64(ADDR_EMPTY); | 56 | u64 addr_empty = cpu_to_le64(ADDR_EMPTY); |
57 | 57 | ||
58 | lba_list[paddr] = meta_list[i].lba = addr_empty; | 58 | lba_list[paddr] = meta_list[i].lba = addr_empty; |
59 | pblk_map_pad_invalidate(pblk, line, paddr); | 59 | __pblk_map_invalidate(pblk, line, paddr); |
60 | } | 60 | } |
61 | } | 61 | } |
62 | 62 | ||
diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c index ba02d0bc3e45..7b0ace2f4957 100644 --- a/drivers/lightnvm/pblk-recovery.c +++ b/drivers/lightnvm/pblk-recovery.c | |||
@@ -553,7 +553,6 @@ next_rq: | |||
553 | if (ret) | 553 | if (ret) |
554 | pr_err("pblk: OOB read failed (err:%d)\n", ret); | 554 | pr_err("pblk: OOB read failed (err:%d)\n", ret); |
555 | 555 | ||
556 | line->left_ssecs = line->left_msecs; | ||
557 | left_ppas = 0; | 556 | left_ppas = 0; |
558 | } | 557 | } |
559 | 558 | ||
@@ -659,7 +658,6 @@ next_rq: | |||
659 | /* Roll back failed sectors */ | 658 | /* Roll back failed sectors */ |
660 | line->cur_sec -= nr_error_bits; | 659 | line->cur_sec -= nr_error_bits; |
661 | line->left_msecs += nr_error_bits; | 660 | line->left_msecs += nr_error_bits; |
662 | line->left_ssecs = line->left_msecs; | ||
663 | bitmap_clear(line->map_bitmap, line->cur_sec, nr_error_bits); | 661 | bitmap_clear(line->map_bitmap, line->cur_sec, nr_error_bits); |
664 | 662 | ||
665 | left_ppas = 0; | 663 | left_ppas = 0; |
diff --git a/drivers/lightnvm/pblk-sysfs.c b/drivers/lightnvm/pblk-sysfs.c index 3d9a77646a3d..e1e92c9498a9 100644 --- a/drivers/lightnvm/pblk-sysfs.c +++ b/drivers/lightnvm/pblk-sysfs.c | |||
@@ -154,7 +154,7 @@ static ssize_t pblk_sysfs_lines(struct pblk *pblk, char *page) | |||
154 | int d_line_cnt = 0, l_line_cnt = 0; | 154 | int d_line_cnt = 0, l_line_cnt = 0; |
155 | int gc_full = 0, gc_high = 0, gc_mid = 0, gc_low = 0, gc_empty = 0; | 155 | int gc_full = 0, gc_high = 0, gc_mid = 0, gc_low = 0, gc_empty = 0; |
156 | int bad = 0, cor = 0; | 156 | int bad = 0, cor = 0; |
157 | int msecs = 0, ssecs = 0, cur_sec = 0, vsc = 0, sec_in_line = 0; | 157 | int msecs = 0, cur_sec = 0, vsc = 0, sec_in_line = 0; |
158 | int map_weight = 0, meta_weight = 0; | 158 | int map_weight = 0, meta_weight = 0; |
159 | 159 | ||
160 | spin_lock(&l_mg->free_lock); | 160 | spin_lock(&l_mg->free_lock); |
@@ -227,7 +227,6 @@ static ssize_t pblk_sysfs_lines(struct pblk *pblk, char *page) | |||
227 | if (l_mg->data_line) { | 227 | if (l_mg->data_line) { |
228 | cur_sec = l_mg->data_line->cur_sec; | 228 | cur_sec = l_mg->data_line->cur_sec; |
229 | msecs = l_mg->data_line->left_msecs; | 229 | msecs = l_mg->data_line->left_msecs; |
230 | ssecs = l_mg->data_line->left_ssecs; | ||
231 | vsc = le32_to_cpu(*l_mg->data_line->vsc); | 230 | vsc = le32_to_cpu(*l_mg->data_line->vsc); |
232 | sec_in_line = l_mg->data_line->sec_in_line; | 231 | sec_in_line = l_mg->data_line->sec_in_line; |
233 | meta_weight = bitmap_weight(&l_mg->meta_bitmap, | 232 | meta_weight = bitmap_weight(&l_mg->meta_bitmap, |
@@ -259,8 +258,8 @@ static ssize_t pblk_sysfs_lines(struct pblk *pblk, char *page) | |||
259 | atomic_read(&pblk->gc.inflight_gc)); | 258 | atomic_read(&pblk->gc.inflight_gc)); |
260 | 259 | ||
261 | sz += snprintf(page + sz, PAGE_SIZE - sz, | 260 | sz += snprintf(page + sz, PAGE_SIZE - sz, |
262 | "data (%d) cur:%d, left:%d/%d, vsc:%d, s:%d, map:%d/%d (%d)\n", | 261 | "data (%d) cur:%d, left:%d, vsc:%d, s:%d, map:%d/%d (%d)\n", |
263 | cur_data, cur_sec, msecs, ssecs, vsc, sec_in_line, | 262 | cur_data, cur_sec, msecs, vsc, sec_in_line, |
264 | map_weight, lm->sec_per_line, meta_weight); | 263 | map_weight, lm->sec_per_line, meta_weight); |
265 | 264 | ||
266 | return sz; | 265 | return sz; |
@@ -303,7 +302,7 @@ static ssize_t pblk_sysfs_get_sec_per_write(struct pblk *pblk, char *page) | |||
303 | static ssize_t pblk_sysfs_stats_debug(struct pblk *pblk, char *page) | 302 | static ssize_t pblk_sysfs_stats_debug(struct pblk *pblk, char *page) |
304 | { | 303 | { |
305 | return snprintf(page, PAGE_SIZE, | 304 | return snprintf(page, PAGE_SIZE, |
306 | "%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\n", | 305 | "%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\n", |
307 | atomic_long_read(&pblk->inflight_writes), | 306 | atomic_long_read(&pblk->inflight_writes), |
308 | atomic_long_read(&pblk->inflight_reads), | 307 | atomic_long_read(&pblk->inflight_reads), |
309 | atomic_long_read(&pblk->req_writes), | 308 | atomic_long_read(&pblk->req_writes), |
@@ -312,7 +311,6 @@ static ssize_t pblk_sysfs_stats_debug(struct pblk *pblk, char *page) | |||
312 | atomic_long_read(&pblk->padded_wb), | 311 | atomic_long_read(&pblk->padded_wb), |
313 | atomic_long_read(&pblk->sub_writes), | 312 | atomic_long_read(&pblk->sub_writes), |
314 | atomic_long_read(&pblk->sync_writes), | 313 | atomic_long_read(&pblk->sync_writes), |
315 | atomic_long_read(&pblk->compl_writes), | ||
316 | atomic_long_read(&pblk->recov_writes), | 314 | atomic_long_read(&pblk->recov_writes), |
317 | atomic_long_read(&pblk->recov_gc_writes), | 315 | atomic_long_read(&pblk->recov_gc_writes), |
318 | atomic_long_read(&pblk->recov_gc_reads), | 316 | atomic_long_read(&pblk->recov_gc_reads), |
diff --git a/drivers/lightnvm/pblk-write.c b/drivers/lightnvm/pblk-write.c index 1739c970692e..a29a34786ac5 100644 --- a/drivers/lightnvm/pblk-write.c +++ b/drivers/lightnvm/pblk-write.c | |||
@@ -17,16 +17,6 @@ | |||
17 | 17 | ||
18 | #include "pblk.h" | 18 | #include "pblk.h" |
19 | 19 | ||
20 | static void pblk_sync_line(struct pblk *pblk, struct pblk_line *line) | ||
21 | { | ||
22 | #ifdef CONFIG_NVM_DEBUG | ||
23 | atomic_long_inc(&pblk->sync_writes); | ||
24 | #endif | ||
25 | |||
26 | /* Counter protected by rb sync lock */ | ||
27 | line->left_ssecs--; | ||
28 | } | ||
29 | |||
30 | static unsigned long pblk_end_w_bio(struct pblk *pblk, struct nvm_rq *rqd, | 20 | static unsigned long pblk_end_w_bio(struct pblk *pblk, struct nvm_rq *rqd, |
31 | struct pblk_c_ctx *c_ctx) | 21 | struct pblk_c_ctx *c_ctx) |
32 | { | 22 | { |
@@ -44,14 +34,13 @@ static unsigned long pblk_end_w_bio(struct pblk *pblk, struct nvm_rq *rqd, | |||
44 | 34 | ||
45 | p = rqd->ppa_list[i]; | 35 | p = rqd->ppa_list[i]; |
46 | line = &pblk->lines[pblk_dev_ppa_to_line(p)]; | 36 | line = &pblk->lines[pblk_dev_ppa_to_line(p)]; |
47 | pblk_sync_line(pblk, line); | ||
48 | 37 | ||
49 | while ((original_bio = bio_list_pop(&w_ctx->bios))) | 38 | while ((original_bio = bio_list_pop(&w_ctx->bios))) |
50 | bio_endio(original_bio); | 39 | bio_endio(original_bio); |
51 | } | 40 | } |
52 | 41 | ||
53 | #ifdef CONFIG_NVM_DEBUG | 42 | #ifdef CONFIG_NVM_DEBUG |
54 | atomic_long_add(c_ctx->nr_valid, &pblk->compl_writes); | 43 | atomic_long_add(c_ctx->nr_valid, &pblk->sync_writes); |
55 | #endif | 44 | #endif |
56 | 45 | ||
57 | ret = pblk_rb_sync_advance(&pblk->rwb, c_ctx->nr_valid); | 46 | ret = pblk_rb_sync_advance(&pblk->rwb, c_ctx->nr_valid); |
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index 07ae3c07d563..50f30434718f 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h | |||
@@ -395,7 +395,6 @@ struct pblk_line { | |||
395 | atomic_t left_seblks; /* Blocks left for sync erasing */ | 395 | atomic_t left_seblks; /* Blocks left for sync erasing */ |
396 | 396 | ||
397 | int left_msecs; /* Sectors left for mapping */ | 397 | int left_msecs; /* Sectors left for mapping */ |
398 | int left_ssecs; /* Sectors left to sync */ | ||
399 | unsigned int cur_sec; /* Sector map pointer */ | 398 | unsigned int cur_sec; /* Sector map pointer */ |
400 | unsigned int nr_valid_lbas; /* Number of valid lbas in line */ | 399 | unsigned int nr_valid_lbas; /* Number of valid lbas in line */ |
401 | 400 | ||
@@ -555,7 +554,6 @@ struct pblk { | |||
555 | atomic_long_t req_writes; /* Sectors stored on write buffer */ | 554 | atomic_long_t req_writes; /* Sectors stored on write buffer */ |
556 | atomic_long_t sub_writes; /* Sectors submitted from buffer */ | 555 | atomic_long_t sub_writes; /* Sectors submitted from buffer */ |
557 | atomic_long_t sync_writes; /* Sectors synced to media */ | 556 | atomic_long_t sync_writes; /* Sectors synced to media */ |
558 | atomic_long_t compl_writes; /* Sectors completed in write bio */ | ||
559 | atomic_long_t inflight_reads; /* Inflight sector read requests */ | 557 | atomic_long_t inflight_reads; /* Inflight sector read requests */ |
560 | atomic_long_t cache_reads; /* Read requests that hit the cache */ | 558 | atomic_long_t cache_reads; /* Read requests that hit the cache */ |
561 | atomic_long_t sync_reads; /* Completed sector read requests */ | 559 | atomic_long_t sync_reads; /* Completed sector read requests */ |
@@ -706,11 +704,11 @@ void pblk_end_bio_sync(struct bio *bio); | |||
706 | void pblk_end_io_sync(struct nvm_rq *rqd); | 704 | void pblk_end_io_sync(struct nvm_rq *rqd); |
707 | int pblk_bio_add_pages(struct pblk *pblk, struct bio *bio, gfp_t flags, | 705 | int pblk_bio_add_pages(struct pblk *pblk, struct bio *bio, gfp_t flags, |
708 | int nr_pages); | 706 | int nr_pages); |
709 | void pblk_map_pad_invalidate(struct pblk *pblk, struct pblk_line *line, | ||
710 | u64 paddr); | ||
711 | void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off, | 707 | void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off, |
712 | int nr_pages); | 708 | int nr_pages); |
713 | void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa); | 709 | void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa); |
710 | void __pblk_map_invalidate(struct pblk *pblk, struct pblk_line *line, | ||
711 | u64 paddr); | ||
714 | void pblk_update_map(struct pblk *pblk, sector_t lba, struct ppa_addr ppa); | 712 | void pblk_update_map(struct pblk *pblk, sector_t lba, struct ppa_addr ppa); |
715 | void pblk_update_map_cache(struct pblk *pblk, sector_t lba, | 713 | void pblk_update_map_cache(struct pblk *pblk, sector_t lba, |
716 | struct ppa_addr ppa); | 714 | struct ppa_addr ppa); |