aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm
diff options
context:
space:
mode:
authorMatias Bjørling <mb@lightnvm.io>2018-10-09 07:11:40 -0400
committerJens Axboe <axboe@kernel.dk>2018-10-09 10:25:06 -0400
commitae14cc044b5988148d819c377fd0cc1c7504bc3c (patch)
treec0326f1f3909822f47654181c33c67c215251963 /drivers/lightnvm
parentd20be90ae0bb938ee0dfc8277d531191341d8e39 (diff)
lightnvm: pblk: refactor put line fn on read completion
The read completion path uses the put_line variable to decide whether the reference on a line should be released. The function name used for that is pblk_read_put_rqd_kref, which could lead one to believe that it is the rqd that is releasing the reference, while it is the line reference that is put. Rename and also split the function in two to account for either rqd or single ppa callers and move it to core, such that it later can be used in the write path as well. Signed-off-by: Matias Bjørling <mb@lightnvm.io> Reviewed-by: Javier González <javier@cnexlabs.com> Reviewed-by: Heiner Litz <hlitz@ucsc.edu> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/lightnvm')
-rw-r--r--drivers/lightnvm/pblk-core.c19
-rw-r--r--drivers/lightnvm/pblk-read.c18
-rw-r--r--drivers/lightnvm/pblk.h2
3 files changed, 22 insertions, 17 deletions
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index e0b513d07e14..5f99cf396072 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -1426,6 +1426,25 @@ retry_setup:
1426 return line; 1426 return line;
1427} 1427}
1428 1428
1429void pblk_ppa_to_line_put(struct pblk *pblk, struct ppa_addr ppa)
1430{
1431 struct pblk_line *line;
1432
1433 line = &pblk->lines[pblk_ppa_to_line(ppa)];
1434 kref_put(&line->ref, pblk_line_put_wq);
1435}
1436
1437void pblk_rq_to_line_put(struct pblk *pblk, struct nvm_rq *rqd)
1438{
1439 struct ppa_addr *ppa_list;
1440 int i;
1441
1442 ppa_list = (rqd->nr_ppas > 1) ? rqd->ppa_list : &rqd->ppa_addr;
1443
1444 for (i = 0; i < rqd->nr_ppas; i++)
1445 pblk_ppa_to_line_put(pblk, ppa_list[i]);
1446}
1447
1429static void pblk_stop_writes(struct pblk *pblk, struct pblk_line *line) 1448static void pblk_stop_writes(struct pblk *pblk, struct pblk_line *line)
1430{ 1449{
1431 lockdep_assert_held(&pblk->l_mg.free_lock); 1450 lockdep_assert_held(&pblk->l_mg.free_lock);
diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c
index ba3dcb6be4c3..ad1d7713bbda 100644
--- a/drivers/lightnvm/pblk-read.c
+++ b/drivers/lightnvm/pblk-read.c
@@ -165,22 +165,6 @@ static void pblk_read_check_rand(struct pblk *pblk, struct nvm_rq *rqd,
165 WARN_ONCE(j != rqd->nr_ppas, "pblk: corrupted random request\n"); 165 WARN_ONCE(j != rqd->nr_ppas, "pblk: corrupted random request\n");
166} 166}
167 167
168static void pblk_read_put_rqd_kref(struct pblk *pblk, struct nvm_rq *rqd)
169{
170 struct ppa_addr *ppa_list;
171 int i;
172
173 ppa_list = (rqd->nr_ppas > 1) ? rqd->ppa_list : &rqd->ppa_addr;
174
175 for (i = 0; i < rqd->nr_ppas; i++) {
176 struct ppa_addr ppa = ppa_list[i];
177 struct pblk_line *line;
178
179 line = &pblk->lines[pblk_ppa_to_line(ppa)];
180 kref_put(&line->ref, pblk_line_put_wq);
181 }
182}
183
184static void pblk_end_user_read(struct bio *bio) 168static void pblk_end_user_read(struct bio *bio)
185{ 169{
186#ifdef CONFIG_NVM_PBLK_DEBUG 170#ifdef CONFIG_NVM_PBLK_DEBUG
@@ -208,7 +192,7 @@ static void __pblk_end_io_read(struct pblk *pblk, struct nvm_rq *rqd,
208 bio_put(int_bio); 192 bio_put(int_bio);
209 193
210 if (put_line) 194 if (put_line)
211 pblk_read_put_rqd_kref(pblk, rqd); 195 pblk_rq_to_line_put(pblk, rqd);
212 196
213#ifdef CONFIG_NVM_PBLK_DEBUG 197#ifdef CONFIG_NVM_PBLK_DEBUG
214 atomic_long_add(rqd->nr_ppas, &pblk->sync_reads); 198 atomic_long_add(rqd->nr_ppas, &pblk->sync_reads);
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h
index 64ae0c7ed3bb..be67bbfa3d0a 100644
--- a/drivers/lightnvm/pblk.h
+++ b/drivers/lightnvm/pblk.h
@@ -787,6 +787,8 @@ struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data,
787struct pblk_line *pblk_line_get(struct pblk *pblk); 787struct pblk_line *pblk_line_get(struct pblk *pblk);
788struct pblk_line *pblk_line_get_first_data(struct pblk *pblk); 788struct pblk_line *pblk_line_get_first_data(struct pblk *pblk);
789struct pblk_line *pblk_line_replace_data(struct pblk *pblk); 789struct pblk_line *pblk_line_replace_data(struct pblk *pblk);
790void pblk_ppa_to_line_put(struct pblk *pblk, struct ppa_addr ppa);
791void pblk_rq_to_line_put(struct pblk *pblk, struct nvm_rq *rqd);
790int pblk_line_recov_alloc(struct pblk *pblk, struct pblk_line *line); 792int pblk_line_recov_alloc(struct pblk *pblk, struct pblk_line *line);
791void pblk_line_recov_close(struct pblk *pblk, struct pblk_line *line); 793void pblk_line_recov_close(struct pblk *pblk, struct pblk_line *line);
792struct pblk_line *pblk_line_get_data(struct pblk *pblk); 794struct pblk_line *pblk_line_get_data(struct pblk *pblk);