summaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm
diff options
context:
space:
mode:
authorJavier González <javier@cnexlabs.com>2017-10-13 08:46:16 -0400
committerJens Axboe <axboe@kernel.dk>2017-10-13 10:34:57 -0400
commit55e836d401601e7903b36db015ce899dc11085ab (patch)
tree89608679816f984002cfd0944af27cd3eecc9b2a /drivers/lightnvm
parent2a19b10d423c6dc47449e905ed3a8eabb49c48a0 (diff)
lightnvm: pblk: put bio on bio completion
Simplify put bio by doing it on bio end_io instead of manually putting it on the completion path. Signed-off-by: Javier González <javier@cnexlabs.com> Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/lightnvm')
-rw-r--r--drivers/lightnvm/pblk-core.c10
-rw-r--r--drivers/lightnvm/pblk-read.c1
-rw-r--r--drivers/lightnvm/pblk-recovery.c1
-rw-r--r--drivers/lightnvm/pblk-write.c8
4 files changed, 8 insertions, 12 deletions
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 6dd4866e579c..3d27d24baa0b 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -417,6 +417,11 @@ int pblk_submit_io(struct pblk *pblk, struct nvm_rq *rqd)
417 return nvm_submit_io(dev, rqd); 417 return nvm_submit_io(dev, rqd);
418} 418}
419 419
420static void pblk_bio_map_addr_endio(struct bio *bio)
421{
422 bio_put(bio);
423}
424
420struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data, 425struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data,
421 unsigned int nr_secs, unsigned int len, 426 unsigned int nr_secs, unsigned int len,
422 int alloc_type, gfp_t gfp_mask) 427 int alloc_type, gfp_t gfp_mask)
@@ -453,6 +458,8 @@ struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data,
453 458
454 kaddr += PAGE_SIZE; 459 kaddr += PAGE_SIZE;
455 } 460 }
461
462 bio->bi_end_io = pblk_bio_map_addr_endio;
456out: 463out:
457 return bio; 464 return bio;
458} 465}
@@ -671,9 +678,6 @@ next_rq:
671 atomic_dec(&pblk->inflight_io); 678 atomic_dec(&pblk->inflight_io);
672 reinit_completion(&wait); 679 reinit_completion(&wait);
673 680
674 if (likely(pblk->l_mg.emeta_alloc_type == PBLK_VMALLOC_META))
675 bio_put(bio);
676
677 if (rqd.error) { 681 if (rqd.error) {
678 if (dir == WRITE) 682 if (dir == WRITE)
679 pblk_log_write_err(pblk, &rqd); 683 pblk_log_write_err(pblk, &rqd);
diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c
index c28d6509312e..e7141b1aaded 100644
--- a/drivers/lightnvm/pblk-read.c
+++ b/drivers/lightnvm/pblk-read.c
@@ -531,7 +531,6 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
531 atomic_long_sub(gc_rq->secs_to_gc, &pblk->inflight_reads); 531 atomic_long_sub(gc_rq->secs_to_gc, &pblk->inflight_reads);
532#endif 532#endif
533 533
534 bio_put(bio);
535out: 534out:
536 nvm_dev_dma_free(dev->parent, rqd.meta_list, rqd.dma_meta_list); 535 nvm_dev_dma_free(dev->parent, rqd.meta_list, rqd.dma_meta_list);
537 return ret; 536 return ret;
diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c
index 6b6b4183b41e..e59270e60b58 100644
--- a/drivers/lightnvm/pblk-recovery.c
+++ b/drivers/lightnvm/pblk-recovery.c
@@ -333,7 +333,6 @@ static void pblk_end_io_recov(struct nvm_rq *rqd)
333 333
334 pblk_up_page(pblk, rqd->ppa_list, rqd->nr_ppas); 334 pblk_up_page(pblk, rqd->ppa_list, rqd->nr_ppas);
335 335
336 bio_put(rqd->bio);
337 nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list); 336 nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list);
338 pblk_free_rqd(pblk, rqd, WRITE); 337 pblk_free_rqd(pblk, rqd, WRITE);
339 338
diff --git a/drivers/lightnvm/pblk-write.c b/drivers/lightnvm/pblk-write.c
index 0fb8f26a6311..0c0481cf9f5d 100644
--- a/drivers/lightnvm/pblk-write.c
+++ b/drivers/lightnvm/pblk-write.c
@@ -188,17 +188,12 @@ static void pblk_end_io_write_meta(struct nvm_rq *rqd)
188 pblk_log_write_err(pblk, rqd); 188 pblk_log_write_err(pblk, rqd);
189 pr_err("pblk: metadata I/O failed. Line %d\n", line->id); 189 pr_err("pblk: metadata I/O failed. Line %d\n", line->id);
190 } 190 }
191#ifdef CONFIG_NVM_DEBUG
192 else
193 WARN_ONCE(rqd->bio->bi_status, "pblk: corrupted write error\n");
194#endif
195 191
196 sync = atomic_add_return(rqd->nr_ppas, &emeta->sync); 192 sync = atomic_add_return(rqd->nr_ppas, &emeta->sync);
197 if (sync == emeta->nr_entries) 193 if (sync == emeta->nr_entries)
198 pblk_gen_run_ws(pblk, line, NULL, pblk_line_close_ws, 194 pblk_gen_run_ws(pblk, line, NULL, pblk_line_close_ws,
199 GFP_ATOMIC, pblk->close_wq); 195 GFP_ATOMIC, pblk->close_wq);
200 196
201 bio_put(rqd->bio);
202 nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list); 197 nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list);
203 pblk_free_rqd(pblk, rqd, READ); 198 pblk_free_rqd(pblk, rqd, READ);
204 199
@@ -427,8 +422,7 @@ fail_rollback:
427 422
428 nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list); 423 nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list);
429fail_free_bio: 424fail_free_bio:
430 if (likely(l_mg->emeta_alloc_type == PBLK_VMALLOC_META)) 425 bio_put(bio);
431 bio_put(bio);
432fail_free_rqd: 426fail_free_rqd:
433 pblk_free_rqd(pblk, rqd, READ); 427 pblk_free_rqd(pblk, rqd, READ);
434 return ret; 428 return ret;