aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm
diff options
context:
space:
mode:
authorJavier González <javier@javigon.com>2018-10-09 07:12:04 -0400
committerJens Axboe <axboe@kernel.dk>2018-10-09 10:25:08 -0400
commit253babc3f677461a9f73b707bbbd56d2962e48c0 (patch)
tree684be2219a6e69ebcad5b90779e66cd283f74eb9 /drivers/lightnvm
parentaf3fac1664b978f70a838571f3f35298ce1786da (diff)
lightnvm: pblk: take write semaphore on metadata
pblk guarantees write ordering at a chunk level through a per open chunk semaphore. At this point, since we only have an open I/O stream for both user and GC data, the semaphore is per parallel unit. For the metadata I/O that is synchronous, the semaphore is not needed as ordering is guaranteed. However, if the metadata scheme changes or multiple streams are open, this guarantee might not be preserved. This patch makes sure that all writes go through the semaphore, even for synchronous I/O. This is consistent with pblk's write I/O model. It also simplifies maintenance since changes in the metadata scheme could cause ordering issues. Signed-off-by: Javier González <javier@cnexlabs.com> Signed-off-by: Matias Bjørling <mb@lightnvm.io> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/lightnvm')
-rw-r--r--drivers/lightnvm/pblk-core.c16
-rw-r--r--drivers/lightnvm/pblk.h1
2 files changed, 16 insertions, 1 deletions
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 49cef93e328e..a3ce4a36dd33 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -557,6 +557,20 @@ int pblk_submit_io_sync(struct pblk *pblk, struct nvm_rq *rqd)
557 return ret; 557 return ret;
558} 558}
559 559
560int pblk_submit_io_sync_sem(struct pblk *pblk, struct nvm_rq *rqd)
561{
562 struct ppa_addr *ppa_list;
563 int ret;
564
565 ppa_list = (rqd->nr_ppas > 1) ? rqd->ppa_list : &rqd->ppa_addr;
566
567 pblk_down_chunk(pblk, ppa_list[0]);
568 ret = pblk_submit_io_sync(pblk, rqd);
569 pblk_up_chunk(pblk, ppa_list[0]);
570
571 return ret;
572}
573
560static void pblk_bio_map_addr_endio(struct bio *bio) 574static void pblk_bio_map_addr_endio(struct bio *bio)
561{ 575{
562 bio_put(bio); 576 bio_put(bio);
@@ -787,7 +801,7 @@ static int pblk_line_smeta_write(struct pblk *pblk, struct pblk_line *line,
787 meta_list[i].lba = lba_list[paddr] = addr_empty; 801 meta_list[i].lba = lba_list[paddr] = addr_empty;
788 } 802 }
789 803
790 ret = pblk_submit_io_sync(pblk, &rqd); 804 ret = pblk_submit_io_sync_sem(pblk, &rqd);
791 if (ret) { 805 if (ret) {
792 pblk_err(pblk, "smeta I/O submission failed: %d\n", ret); 806 pblk_err(pblk, "smeta I/O submission failed: %d\n", ret);
793 bio_put(bio); 807 bio_put(bio);
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h
index 02e2c02b0cf4..4c015c457197 100644
--- a/drivers/lightnvm/pblk.h
+++ b/drivers/lightnvm/pblk.h
@@ -792,6 +792,7 @@ void pblk_log_write_err(struct pblk *pblk, struct nvm_rq *rqd);
792void pblk_log_read_err(struct pblk *pblk, struct nvm_rq *rqd); 792void pblk_log_read_err(struct pblk *pblk, struct nvm_rq *rqd);
793int pblk_submit_io(struct pblk *pblk, struct nvm_rq *rqd); 793int pblk_submit_io(struct pblk *pblk, struct nvm_rq *rqd);
794int pblk_submit_io_sync(struct pblk *pblk, struct nvm_rq *rqd); 794int pblk_submit_io_sync(struct pblk *pblk, struct nvm_rq *rqd);
795int pblk_submit_io_sync_sem(struct pblk *pblk, struct nvm_rq *rqd);
795int pblk_submit_meta_io(struct pblk *pblk, struct pblk_line *meta_line); 796int pblk_submit_meta_io(struct pblk *pblk, struct pblk_line *meta_line);
796void pblk_check_chunk_state_update(struct pblk *pblk, struct nvm_rq *rqd); 797void pblk_check_chunk_state_update(struct pblk *pblk, struct nvm_rq *rqd);
797struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data, 798struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data,