]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/lightnvm/pblk-read.c
lightnvm: pblk: add SPDX license tag
[linux.git] / drivers / lightnvm / pblk-read.c
index 5a46d7f9302fa7b2ff04e6f91b1939987885e15f..9fba614adeeb22393aed40778209701a5641c1c8 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (C) 2016 CNEX Labs
  * Initial release: Javier Gonzalez <javier@cnexlabs.com>
@@ -43,7 +44,7 @@ static void pblk_read_ppalist_rq(struct pblk *pblk, struct nvm_rq *rqd,
                                 unsigned long *read_bitmap)
 {
        struct pblk_sec_meta *meta_list = rqd->meta_list;
-       struct ppa_addr ppas[PBLK_MAX_REQ_ADDRS];
+       struct ppa_addr ppas[NVM_MAX_VLBA];
        int nr_secs = rqd->nr_ppas;
        bool advanced_bio = false;
        int i, j = 0;
@@ -93,9 +94,7 @@ static void pblk_read_ppalist_rq(struct pblk *pblk, struct nvm_rq *rqd,
        }
 
        if (pblk_io_aligned(pblk, nr_secs))
-               rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_SEQUENTIAL);
-       else
-               rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_RANDOM);
+               rqd->is_seq = 1;
 
 #ifdef CONFIG_NVM_PBLK_DEBUG
        atomic_long_add(nr_secs, &pblk->inflight_reads);
@@ -118,10 +117,9 @@ static void pblk_read_check_seq(struct pblk *pblk, struct nvm_rq *rqd,
 
                if (lba != blba + i) {
 #ifdef CONFIG_NVM_PBLK_DEBUG
-                       struct ppa_addr *p;
+                       struct ppa_addr *ppa_list = nvm_rq_to_ppa_list(rqd);
 
-                       p = (nr_lbas == 1) ? &rqd->ppa_list[i] : &rqd->ppa_addr;
-                       print_ppa(pblk, p, "seq", i);
+                       print_ppa(pblk, &ppa_list[i], "seq", i);
 #endif
                        pblk_err(pblk, "corrupted read LBA (%llu/%llu)\n",
                                                        lba, (u64)blba + i);
@@ -150,14 +148,12 @@ static void pblk_read_check_rand(struct pblk *pblk, struct nvm_rq *rqd,
 
                if (lba != meta_lba) {
 #ifdef CONFIG_NVM_PBLK_DEBUG
-                       struct ppa_addr *p;
-                       int nr_ppas = rqd->nr_ppas;
+                       struct ppa_addr *ppa_list = nvm_rq_to_ppa_list(rqd);
 
-                       p = (nr_ppas == 1) ? &rqd->ppa_list[j] : &rqd->ppa_addr;
-                       print_ppa(pblk, p, "seq", j);
+                       print_ppa(pblk, &ppa_list[j], "rnd", j);
 #endif
                        pblk_err(pblk, "corrupted read LBA (%llu/%llu)\n",
-                                                               lba, meta_lba);
+                                                       meta_lba, lba);
                        WARN_ON(1);
                }
 
@@ -167,22 +163,6 @@ static void pblk_read_check_rand(struct pblk *pblk, struct nvm_rq *rqd,
        WARN_ONCE(j != rqd->nr_ppas, "pblk: corrupted random request\n");
 }
 
-static void pblk_read_put_rqd_kref(struct pblk *pblk, struct nvm_rq *rqd)
-{
-       struct ppa_addr *ppa_list;
-       int i;
-
-       ppa_list = (rqd->nr_ppas > 1) ? rqd->ppa_list : &rqd->ppa_addr;
-
-       for (i = 0; i < rqd->nr_ppas; i++) {
-               struct ppa_addr ppa = ppa_list[i];
-               struct pblk_line *line;
-
-               line = &pblk->lines[pblk_ppa_to_line(ppa)];
-               kref_put(&line->ref, pblk_line_put_wq);
-       }
-}
-
 static void pblk_end_user_read(struct bio *bio)
 {
 #ifdef CONFIG_NVM_PBLK_DEBUG
@@ -210,7 +190,7 @@ static void __pblk_end_io_read(struct pblk *pblk, struct nvm_rq *rqd,
                bio_put(int_bio);
 
        if (put_line)
-               pblk_read_put_rqd_kref(pblk, rqd);
+               pblk_rq_to_line_put(pblk, rqd);
 
 #ifdef CONFIG_NVM_PBLK_DEBUG
        atomic_long_add(rqd->nr_ppas, &pblk->sync_reads);
@@ -270,9 +250,9 @@ static void pblk_end_partial_read(struct nvm_rq *rqd)
        i = 0;
        hole = find_first_zero_bit(read_bitmap, nr_secs);
        do {
-               int line_id = pblk_ppa_to_line(rqd->ppa_list[i]);
-               struct pblk_line *line = &pblk->lines[line_id];
+               struct pblk_line *line;
 
+               line = pblk_ppa_to_line(pblk, rqd->ppa_list[i]);
                kref_put(&line->ref, pblk_line_put);
 
                meta_list[hole].lba = lba_list_media[i];
@@ -344,7 +324,6 @@ static int pblk_setup_partial_read(struct pblk *pblk, struct nvm_rq *rqd,
 
        rqd->bio = new_bio;
        rqd->nr_ppas = nr_holes;
-       rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_RANDOM);
 
        pr_ctx->ppa_ptr = NULL;
        pr_ctx->orig_bio = bio;
@@ -438,8 +417,6 @@ static void pblk_read_rq(struct pblk *pblk, struct nvm_rq *rqd, struct bio *bio,
        } else {
                rqd->ppa_addr = ppa;
        }
-
-       rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_RANDOM);
 }
 
 int pblk_submit_read(struct pblk *pblk, struct bio *bio)
@@ -454,13 +431,6 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
        DECLARE_BITMAP(read_bitmap, NVM_MAX_VLBA);
        int ret = NVM_IO_ERR;
 
-       /* logic error: lba out-of-bounds. Ignore read request */
-       if (blba >= pblk->rl.nr_secs || nr_secs > PBLK_MAX_REQ_ADDRS) {
-               WARN(1, "pblk: read lba out of bounds (lba:%llu, nr:%d)\n",
-                                       (unsigned long long)blba, nr_secs);
-               return NVM_IO_ERR;
-       }
-
        generic_start_io_acct(q, REQ_OP_READ, bio_sectors(bio),
                              &pblk->disk->part0);
 
@@ -484,21 +454,13 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
         */
        bio_init_idx = pblk_get_bi_idx(bio);
 
-       rqd->meta_list = nvm_dev_dma_alloc(dev->parent, GFP_KERNEL,
-                                                       &rqd->dma_meta_list);
-       if (!rqd->meta_list) {
-               pblk_err(pblk, "not able to allocate ppa list\n");
+       if (pblk_alloc_rqd_meta(pblk, rqd))
                goto fail_rqd_free;
-       }
-
-       if (nr_secs > 1) {
-               rqd->ppa_list = rqd->meta_list + pblk_dma_meta_size;
-               rqd->dma_ppa_list = rqd->dma_meta_list + pblk_dma_meta_size;
 
+       if (nr_secs > 1)
                pblk_read_ppalist_rq(pblk, rqd, bio, blba, read_bitmap);
-       } else {
+       else
                pblk_read_rq(pblk, rqd, bio, blba, read_bitmap);
-       }
 
        if (bitmap_full(read_bitmap, nr_secs)) {
                atomic_inc(&pblk->inflight_io);
@@ -552,7 +514,7 @@ static int read_ppalist_rq_gc(struct pblk *pblk, struct nvm_rq *rqd,
                              struct pblk_line *line, u64 *lba_list,
                              u64 *paddr_list_gc, unsigned int nr_secs)
 {
-       struct ppa_addr ppa_list_l2p[PBLK_MAX_REQ_ADDRS];
+       struct ppa_addr ppa_list_l2p[NVM_MAX_VLBA];
        struct ppa_addr ppa_gc;
        int valid_secs = 0;
        int i;
@@ -625,15 +587,11 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
 
        memset(&rqd, 0, sizeof(struct nvm_rq));
 
-       rqd.meta_list = nvm_dev_dma_alloc(dev->parent, GFP_KERNEL,
-                                                       &rqd.dma_meta_list);
-       if (!rqd.meta_list)
-               return -ENOMEM;
+       ret = pblk_alloc_rqd_meta(pblk, &rqd);
+       if (ret)
+               return ret;
 
        if (gc_rq->nr_secs > 1) {
-               rqd.ppa_list = rqd.meta_list + pblk_dma_meta_size;
-               rqd.dma_ppa_list = rqd.dma_meta_list + pblk_dma_meta_size;
-
                gc_rq->secs_to_gc = read_ppalist_rq_gc(pblk, &rqd, gc_rq->line,
                                                        gc_rq->lba_list,
                                                        gc_rq->paddr_list,
@@ -654,7 +612,8 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
                                                PBLK_VMALLOC_META, GFP_KERNEL);
        if (IS_ERR(bio)) {
                pblk_err(pblk, "could not allocate GC bio (%lu)\n",
-                               PTR_ERR(bio));
+                                                               PTR_ERR(bio));
+               ret = PTR_ERR(bio);
                goto err_free_dma;
        }
 
@@ -663,7 +622,6 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
 
        rqd.opcode = NVM_OP_PREAD;
        rqd.nr_ppas = gc_rq->secs_to_gc;
-       rqd.flags = pblk_set_read_mode(pblk, PBLK_READ_RANDOM);
        rqd.bio = bio;
 
        if (pblk_submit_io_sync(pblk, &rqd)) {
@@ -690,12 +648,12 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
 #endif
 
 out:
-       nvm_dev_dma_free(dev->parent, rqd.meta_list, rqd.dma_meta_list);
+       pblk_free_rqd_meta(pblk, &rqd);
        return ret;
 
 err_free_bio:
        bio_put(bio);
 err_free_dma:
-       nvm_dev_dma_free(dev->parent, rqd.meta_list, rqd.dma_meta_list);
+       pblk_free_rqd_meta(pblk, &rqd);
        return ret;
 }