lightnvm: pblk: improve line helpers
authorJavier González <javier@javigon.com>
Tue, 9 Oct 2018 11:11:42 +0000 (13:11 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 9 Oct 2018 14:25:06 +0000 (08:25 -0600)
The current helper to obtain a line from a ppa returns the line id,
which requires its users to explicitly retrieve the pointer to the line
with the id.

Make 2 different helpers: one returning the line id and one returning
the line directly.

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>
drivers/lightnvm/pblk-core.c
drivers/lightnvm/pblk-rb.c
drivers/lightnvm/pblk-read.c
drivers/lightnvm/pblk-write.c
drivers/lightnvm/pblk.h

index 5f99cf396072c971108314f884958f5b7e2eaecd..36ac9eff8ebd4993018039bf2c293c4a1f3296f3 100644 (file)
@@ -32,7 +32,7 @@ static void pblk_line_mark_bb(struct work_struct *work)
                struct pblk_line *line;
                int pos;
 
-               line = &pblk->lines[pblk_ppa_to_line(*ppa)];
+               line = pblk_ppa_to_line(pblk, *ppa);
                pos = pblk_ppa_to_pos(&dev->geo, *ppa);
 
                pblk_err(pblk, "failed to mark bb, line:%d, pos:%d\n",
@@ -80,7 +80,7 @@ static void __pblk_end_io_erase(struct pblk *pblk, struct nvm_rq *rqd)
        struct pblk_line *line;
        int pos;
 
-       line = &pblk->lines[pblk_ppa_to_line(rqd->ppa_addr)];
+       line = pblk_ppa_to_line(pblk, rqd->ppa_addr);
        pos = pblk_ppa_to_pos(geo, rqd->ppa_addr);
        chunk = &line->chks[pos];
 
@@ -192,7 +192,6 @@ void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa)
 {
        struct pblk_line *line;
        u64 paddr;
-       int line_id;
 
 #ifdef CONFIG_NVM_PBLK_DEBUG
        /* Callers must ensure that the ppa points to a device address */
@@ -200,8 +199,7 @@ void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa)
        BUG_ON(pblk_ppa_empty(ppa));
 #endif
 
-       line_id = pblk_ppa_to_line(ppa);
-       line = &pblk->lines[line_id];
+       line = pblk_ppa_to_line(pblk, ppa);
        paddr = pblk_dev_ppa_to_line_addr(pblk, ppa);
 
        __pblk_map_invalidate(pblk, line, paddr);
@@ -1430,7 +1428,7 @@ void pblk_ppa_to_line_put(struct pblk *pblk, struct ppa_addr ppa)
 {
        struct pblk_line *line;
 
-       line = &pblk->lines[pblk_ppa_to_line(ppa)];
+       line = pblk_ppa_to_line(pblk, ppa);
        kref_put(&line->ref, pblk_line_put_wq);
 }
 
@@ -1688,7 +1686,7 @@ int pblk_blk_erase_async(struct pblk *pblk, struct ppa_addr ppa)
                struct nvm_geo *geo = &dev->geo;
 
                pblk_err(pblk, "could not async erase line:%d,blk:%d\n",
-                                       pblk_ppa_to_line(ppa),
+                                       pblk_ppa_to_line_id(ppa),
                                        pblk_ppa_to_pos(geo, ppa));
        }
 
@@ -2059,8 +2057,7 @@ void pblk_lookup_l2p_seq(struct pblk *pblk, struct ppa_addr *ppas,
 
                /* If the L2P entry maps to a line, the reference is valid */
                if (!pblk_ppa_empty(ppa) && !pblk_addr_in_cache(ppa)) {
-                       int line_id = pblk_ppa_to_line(ppa);
-                       struct pblk_line *line = &pblk->lines[line_id];
+                       struct pblk_line *line = pblk_ppa_to_line(pblk, ppa);
 
                        kref_get(&line->ref);
                }
index f6eec0212dfcf07fe5e2af1fa32530f593b1a14c..a7648e12f54f158bf54e52e09b533470fa656aa8 100644 (file)
@@ -225,7 +225,7 @@ static int __pblk_rb_update_l2p(struct pblk_rb *rb, unsigned int to_update)
                pblk_update_map_dev(pblk, w_ctx->lba, w_ctx->ppa,
                                                        entry->cacheline);
 
-               line = &pblk->lines[pblk_ppa_to_line(w_ctx->ppa)];
+               line = pblk_ppa_to_line(pblk, w_ctx->ppa);
                kref_put(&line->ref, pblk_line_put);
                clean_wctx(w_ctx);
                rb->l2p_update = (rb->l2p_update + 1) & (rb->nr_entries - 1);
index ad1d7713bbdacbfd9317399543156fce950ebc93..49744caaa30083a0cff851992244bf10731b919d 100644 (file)
@@ -252,9 +252,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];
index df99c45778d4a5a8190f096bde043fd90563236e..c23b65aaa27bfdb1fd192bac143593f9e349218b 100644 (file)
@@ -113,7 +113,7 @@ static void pblk_map_remaining(struct pblk *pblk, struct ppa_addr *ppa)
        u64 paddr;
        int done = 0;
 
-       line = &pblk->lines[pblk_ppa_to_line(*ppa)];
+       line = pblk_ppa_to_line(pblk, *ppa);
        spin_lock(&line->lock);
 
        while (!done)  {
@@ -171,7 +171,7 @@ static void pblk_prepare_resubmit(struct pblk *pblk, unsigned int sentry,
                /* Decrese the reference count to the line as we will
                 * re-map these entries
                 */
-               line = &pblk->lines[pblk_ppa_to_line(w_ctx->ppa)];
+               line = pblk_ppa_to_line(pblk, w_ctx->ppa);
                kref_put(&line->ref, pblk_line_put);
 
                pos = (pos + 1) & (rb->nr_entries - 1);
index f95fe75fef6eaac408bbf9801a88a760c265eee7..af9477b7e8032e899f6dfbf221ae2322d678870d 100644 (file)
@@ -984,11 +984,17 @@ static inline int pblk_pad_distance(struct pblk *pblk)
        return geo->mw_cunits * geo->all_luns * geo->ws_opt;
 }
 
-static inline int pblk_ppa_to_line(struct ppa_addr p)
+static inline int pblk_ppa_to_line_id(struct ppa_addr p)
 {
        return p.a.blk;
 }
 
+static inline struct pblk_line *pblk_ppa_to_line(struct pblk *pblk,
+                                                struct ppa_addr p)
+{
+       return &pblk->lines[pblk_ppa_to_line_id(p)];
+}
+
 static inline int pblk_ppa_to_pos(struct nvm_geo *geo, struct ppa_addr p)
 {
        return p.a.lun * geo->num_ch + p.a.ch;
@@ -1039,7 +1045,7 @@ static inline struct nvm_chk_meta *pblk_dev_ppa_to_chunk(struct pblk *pblk,
 {
        struct nvm_tgt_dev *dev = pblk->dev;
        struct nvm_geo *geo = &dev->geo;
-       struct pblk_line *line = &pblk->lines[pblk_ppa_to_line(p)];
+       struct pblk_line *line = pblk_ppa_to_line(pblk, p);
        int pos = pblk_ppa_to_pos(geo, p);
 
        return &line->chks[pos];
@@ -1371,8 +1377,7 @@ static inline int pblk_check_io(struct pblk *pblk, struct nvm_rq *rqd)
                int i;
 
                for (i = 0; i < rqd->nr_ppas; i++) {
-                       ppa = ppa_list[i];
-                       line = &pblk->lines[pblk_ppa_to_line(ppa)];
+                       line = pblk_ppa_to_line(pblk, ppa_list[i]);
 
                        spin_lock(&line->lock);
                        if (line->state != PBLK_LINESTATE_OPEN) {