aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJavier González <jg@lightnvm.io>2017-06-26 05:57:19 -0400
committerJens Axboe <axboe@kernel.dk>2017-06-26 18:27:39 -0400
commit0880a9aa2d91ff5131ecd0902a758afe760b9c1c (patch)
tree4a6859cc239610cf63a4a4875a6048e5b6a6b680
parentfd1b0158f5f5937d73d5c61e229350c6b905d0da (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.c18
-rw-r--r--drivers/lightnvm/pblk-init.c1
-rw-r--r--drivers/lightnvm/pblk-map.c2
-rw-r--r--drivers/lightnvm/pblk-recovery.c2
-rw-r--r--drivers/lightnvm/pblk-sysfs.c10
-rw-r--r--drivers/lightnvm/pblk-write.c13
-rw-r--r--drivers/lightnvm/pblk.h6
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
68static void __pblk_map_invalidate(struct pblk *pblk, struct pblk_line *line, 68void __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
132void 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
144static void pblk_invalidate_range(struct pblk *pblk, sector_t slba, 132static 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)
303static ssize_t pblk_sysfs_stats_debug(struct pblk *pblk, char *page) 302static 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
20static 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
30static unsigned long pblk_end_w_bio(struct pblk *pblk, struct nvm_rq *rqd, 20static 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);
706void pblk_end_io_sync(struct nvm_rq *rqd); 704void pblk_end_io_sync(struct nvm_rq *rqd);
707int pblk_bio_add_pages(struct pblk *pblk, struct bio *bio, gfp_t flags, 705int pblk_bio_add_pages(struct pblk *pblk, struct bio *bio, gfp_t flags,
708 int nr_pages); 706 int nr_pages);
709void pblk_map_pad_invalidate(struct pblk *pblk, struct pblk_line *line,
710 u64 paddr);
711void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off, 707void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off,
712 int nr_pages); 708 int nr_pages);
713void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa); 709void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa);
710void __pblk_map_invalidate(struct pblk *pblk, struct pblk_line *line,
711 u64 paddr);
714void pblk_update_map(struct pblk *pblk, sector_t lba, struct ppa_addr ppa); 712void pblk_update_map(struct pblk *pblk, sector_t lba, struct ppa_addr ppa);
715void pblk_update_map_cache(struct pblk *pblk, sector_t lba, 713void pblk_update_map_cache(struct pblk *pblk, sector_t lba,
716 struct ppa_addr ppa); 714 struct ppa_addr ppa);