lightnvm: convert to bioset_init()/mempool_init()
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 20 May 2018 22:25:50 +0000 (18:25 -0400)
committerJens Axboe <axboe@kernel.dk>
Wed, 30 May 2018 21:33:32 +0000 (15:33 -0600)
Convert lightnvm to embedded bio sets.

Reviewed-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/lightnvm/pblk-core.c
drivers/lightnvm/pblk-init.c
drivers/lightnvm/pblk-read.c
drivers/lightnvm/pblk-recovery.c
drivers/lightnvm/pblk-write.c
drivers/lightnvm/pblk.h

index 94d5d97c9d8aabb77540bedc6cb5590f0a9665a0..934341b10493cefd05a09739e9f402b67de63b0e 100644 (file)
@@ -40,7 +40,7 @@ static void pblk_line_mark_bb(struct work_struct *work)
        }
 
        kfree(ppa);
-       mempool_free(line_ws, pblk->gen_ws_pool);
+       mempool_free(line_ws, &pblk->gen_ws_pool);
 }
 
 static void pblk_mark_bb(struct pblk *pblk, struct pblk_line *line,
@@ -102,7 +102,7 @@ static void pblk_end_io_erase(struct nvm_rq *rqd)
        struct pblk *pblk = rqd->private;
 
        __pblk_end_io_erase(pblk, rqd);
-       mempool_free(rqd, pblk->e_rq_pool);
+       mempool_free(rqd, &pblk->e_rq_pool);
 }
 
 /*
@@ -237,15 +237,15 @@ struct nvm_rq *pblk_alloc_rqd(struct pblk *pblk, int type)
        switch (type) {
        case PBLK_WRITE:
        case PBLK_WRITE_INT:
-               pool = pblk->w_rq_pool;
+               pool = &pblk->w_rq_pool;
                rq_size = pblk_w_rq_size;
                break;
        case PBLK_READ:
-               pool = pblk->r_rq_pool;
+               pool = &pblk->r_rq_pool;
                rq_size = pblk_g_rq_size;
                break;
        default:
-               pool = pblk->e_rq_pool;
+               pool = &pblk->e_rq_pool;
                rq_size = pblk_g_rq_size;
        }
 
@@ -265,13 +265,13 @@ void pblk_free_rqd(struct pblk *pblk, struct nvm_rq *rqd, int type)
        case PBLK_WRITE:
                kfree(((struct pblk_c_ctx *)nvm_rq_to_pdu(rqd))->lun_bitmap);
        case PBLK_WRITE_INT:
-               pool = pblk->w_rq_pool;
+               pool = &pblk->w_rq_pool;
                break;
        case PBLK_READ:
-               pool = pblk->r_rq_pool;
+               pool = &pblk->r_rq_pool;
                break;
        case PBLK_ERASE:
-               pool = pblk->e_rq_pool;
+               pool = &pblk->e_rq_pool;
                break;
        default:
                pr_err("pblk: trying to free unknown rqd type\n");
@@ -292,7 +292,7 @@ void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off,
 
        for (i = off; i < nr_pages + off; i++) {
                bv = bio->bi_io_vec[i];
-               mempool_free(bv.bv_page, pblk->page_bio_pool);
+               mempool_free(bv.bv_page, &pblk->page_bio_pool);
        }
 }
 
@@ -304,12 +304,12 @@ int pblk_bio_add_pages(struct pblk *pblk, struct bio *bio, gfp_t flags,
        int i, ret;
 
        for (i = 0; i < nr_pages; i++) {
-               page = mempool_alloc(pblk->page_bio_pool, flags);
+               page = mempool_alloc(&pblk->page_bio_pool, flags);
 
                ret = bio_add_pc_page(q, bio, page, PBLK_EXPOSED_PAGE_SIZE, 0);
                if (ret != PBLK_EXPOSED_PAGE_SIZE) {
                        pr_err("pblk: could not add page to bio\n");
-                       mempool_free(page, pblk->page_bio_pool);
+                       mempool_free(page, &pblk->page_bio_pool);
                        goto err;
                }
        }
@@ -1593,7 +1593,7 @@ static void pblk_line_put_ws(struct work_struct *work)
        struct pblk_line *line = line_put_ws->line;
 
        __pblk_line_put(pblk, line);
-       mempool_free(line_put_ws, pblk->gen_ws_pool);
+       mempool_free(line_put_ws, &pblk->gen_ws_pool);
 }
 
 void pblk_line_put(struct kref *ref)
@@ -1610,7 +1610,7 @@ void pblk_line_put_wq(struct kref *ref)
        struct pblk *pblk = line->pblk;
        struct pblk_line_ws *line_put_ws;
 
-       line_put_ws = mempool_alloc(pblk->gen_ws_pool, GFP_ATOMIC);
+       line_put_ws = mempool_alloc(&pblk->gen_ws_pool, GFP_ATOMIC);
        if (!line_put_ws)
                return;
 
@@ -1752,7 +1752,7 @@ void pblk_line_close_ws(struct work_struct *work)
        struct pblk_line *line = line_ws->line;
 
        pblk_line_close(pblk, line);
-       mempool_free(line_ws, pblk->gen_ws_pool);
+       mempool_free(line_ws, &pblk->gen_ws_pool);
 }
 
 void pblk_gen_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv,
@@ -1761,7 +1761,7 @@ void pblk_gen_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv,
 {
        struct pblk_line_ws *line_ws;
 
-       line_ws = mempool_alloc(pblk->gen_ws_pool, gfp_mask);
+       line_ws = mempool_alloc(&pblk->gen_ws_pool, gfp_mask);
 
        line_ws->pblk = pblk;
        line_ws->line = line;
index 91a5bc2556a3abfd35ddfca5a48e4b2526058776..9a984abd3dfe419071ad13896292aa9f1e574963 100644 (file)
@@ -23,7 +23,7 @@
 static struct kmem_cache *pblk_ws_cache, *pblk_rec_cache, *pblk_g_rq_cache,
                                *pblk_w_rq_cache;
 static DECLARE_RWSEM(pblk_lock);
-struct bio_set *pblk_bio_set;
+struct bio_set pblk_bio_set;
 
 static int pblk_rw_io(struct request_queue *q, struct pblk *pblk,
                          struct bio *bio)
@@ -341,7 +341,7 @@ static int pblk_core_init(struct pblk *pblk)
 {
        struct nvm_tgt_dev *dev = pblk->dev;
        struct nvm_geo *geo = &dev->geo;
-       int max_write_ppas;
+       int ret, max_write_ppas;
 
        atomic64_set(&pblk->user_wa, 0);
        atomic64_set(&pblk->pad_wa, 0);
@@ -375,33 +375,33 @@ static int pblk_core_init(struct pblk *pblk)
                goto fail_free_pad_dist;
 
        /* Internal bios can be at most the sectors signaled by the device. */
-       pblk->page_bio_pool = mempool_create_page_pool(NVM_MAX_VLBA, 0);
-       if (!pblk->page_bio_pool)
+       ret = mempool_init_page_pool(&pblk->page_bio_pool, NVM_MAX_VLBA, 0);
+       if (ret)
                goto free_global_caches;
 
-       pblk->gen_ws_pool = mempool_create_slab_pool(PBLK_GEN_WS_POOL_SIZE,
-                                                       pblk_ws_cache);
-       if (!pblk->gen_ws_pool)
+       ret = mempool_init_slab_pool(&pblk->gen_ws_pool, PBLK_GEN_WS_POOL_SIZE,
+                                    pblk_ws_cache);
+       if (ret)
                goto free_page_bio_pool;
 
-       pblk->rec_pool = mempool_create_slab_pool(geo->all_luns,
-                                                       pblk_rec_cache);
-       if (!pblk->rec_pool)
+       ret = mempool_init_slab_pool(&pblk->rec_pool, geo->all_luns,
+                                    pblk_rec_cache);
+       if (ret)
                goto free_gen_ws_pool;
 
-       pblk->r_rq_pool = mempool_create_slab_pool(geo->all_luns,
-                                                       pblk_g_rq_cache);
-       if (!pblk->r_rq_pool)
+       ret = mempool_init_slab_pool(&pblk->r_rq_pool, geo->all_luns,
+                                    pblk_g_rq_cache);
+       if (ret)
                goto free_rec_pool;
 
-       pblk->e_rq_pool = mempool_create_slab_pool(geo->all_luns,
-                                                       pblk_g_rq_cache);
-       if (!pblk->e_rq_pool)
+       ret = mempool_init_slab_pool(&pblk->e_rq_pool, geo->all_luns,
+                                    pblk_g_rq_cache);
+       if (ret)
                goto free_r_rq_pool;
 
-       pblk->w_rq_pool = mempool_create_slab_pool(geo->all_luns,
-                                                       pblk_w_rq_cache);
-       if (!pblk->w_rq_pool)
+       ret = mempool_init_slab_pool(&pblk->w_rq_pool, geo->all_luns,
+                                    pblk_w_rq_cache);
+       if (ret)
                goto free_e_rq_pool;
 
        pblk->close_wq = alloc_workqueue("pblk-close-wq",
@@ -433,17 +433,17 @@ free_bb_wq:
 free_close_wq:
        destroy_workqueue(pblk->close_wq);
 free_w_rq_pool:
-       mempool_destroy(pblk->w_rq_pool);
+       mempool_exit(&pblk->w_rq_pool);
 free_e_rq_pool:
-       mempool_destroy(pblk->e_rq_pool);
+       mempool_exit(&pblk->e_rq_pool);
 free_r_rq_pool:
-       mempool_destroy(pblk->r_rq_pool);
+       mempool_exit(&pblk->r_rq_pool);
 free_rec_pool:
-       mempool_destroy(pblk->rec_pool);
+       mempool_exit(&pblk->rec_pool);
 free_gen_ws_pool:
-       mempool_destroy(pblk->gen_ws_pool);
+       mempool_exit(&pblk->gen_ws_pool);
 free_page_bio_pool:
-       mempool_destroy(pblk->page_bio_pool);
+       mempool_exit(&pblk->page_bio_pool);
 free_global_caches:
        pblk_free_global_caches(pblk);
 fail_free_pad_dist:
@@ -462,12 +462,12 @@ static void pblk_core_free(struct pblk *pblk)
        if (pblk->bb_wq)
                destroy_workqueue(pblk->bb_wq);
 
-       mempool_destroy(pblk->page_bio_pool);
-       mempool_destroy(pblk->gen_ws_pool);
-       mempool_destroy(pblk->rec_pool);
-       mempool_destroy(pblk->r_rq_pool);
-       mempool_destroy(pblk->e_rq_pool);
-       mempool_destroy(pblk->w_rq_pool);
+       mempool_exit(&pblk->page_bio_pool);
+       mempool_exit(&pblk->gen_ws_pool);
+       mempool_exit(&pblk->rec_pool);
+       mempool_exit(&pblk->r_rq_pool);
+       mempool_exit(&pblk->e_rq_pool);
+       mempool_exit(&pblk->w_rq_pool);
 
        pblk_free_global_caches(pblk);
        kfree(pblk->pad_dist);
@@ -1297,18 +1297,18 @@ static int __init pblk_module_init(void)
 {
        int ret;
 
-       pblk_bio_set = bioset_create(BIO_POOL_SIZE, 0, 0);
-       if (!pblk_bio_set)
-               return -ENOMEM;
+       ret = bioset_init(&pblk_bio_set, BIO_POOL_SIZE, 0, 0);
+       if (ret)
+               return ret;
        ret = nvm_register_tgt_type(&tt_pblk);
        if (ret)
-               bioset_free(pblk_bio_set);
+               bioset_exit(&pblk_bio_set);
        return ret;
 }
 
 static void pblk_module_exit(void)
 {
-       bioset_free(pblk_bio_set);
+       bioset_exit(&pblk_bio_set);
        nvm_unregister_tgt_type(&tt_pblk);
 }
 
index 9eee10f69df0300632833f421b0ac4b0fa295b40..c844ffb6aead4861b68696b8cf5972cdd3b6db9b 100644 (file)
@@ -294,7 +294,7 @@ static int pblk_partial_read_bio(struct pblk *pblk, struct nvm_rq *rqd,
                kunmap_atomic(src_p);
                kunmap_atomic(dst_p);
 
-               mempool_free(src_bv.bv_page, pblk->page_bio_pool);
+               mempool_free(src_bv.bv_page, &pblk->page_bio_pool);
 
                hole = find_next_zero_bit(read_bitmap, nr_secs, hole + 1);
        } while (hole < nr_secs);
@@ -429,7 +429,7 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
                struct bio *int_bio = NULL;
 
                /* Clone read bio to deal with read errors internally */
-               int_bio = bio_clone_fast(bio, GFP_KERNEL, pblk_bio_set);
+               int_bio = bio_clone_fast(bio, GFP_KERNEL, &pblk_bio_set);
                if (!int_bio) {
                        pr_err("pblk: could not clone read bio\n");
                        goto fail_end_io;
index 3e079c2afa6e7e8919d316aabb66a1a496487789..364ad52a5bfb88edd07ad1409ed9b51ff9febc04 100644 (file)
@@ -60,7 +60,7 @@ void pblk_submit_rec(struct work_struct *work)
                goto err;
        }
 
-       mempool_free(recovery, pblk->rec_pool);
+       mempool_free(recovery, &pblk->rec_pool);
        return;
 
 err:
index 3e6f1ebd743a97792c377eb22b4e7163c09c12d4..aef7fa2d401de798e2caf90c75dc4add7a5331b3 100644 (file)
@@ -122,7 +122,7 @@ static void pblk_end_w_fail(struct pblk *pblk, struct nvm_rq *rqd)
        if (unlikely(nr_ppas == 1))
                ppa_list = &rqd->ppa_addr;
 
-       recovery = mempool_alloc(pblk->rec_pool, GFP_ATOMIC);
+       recovery = mempool_alloc(&pblk->rec_pool, GFP_ATOMIC);
 
        INIT_LIST_HEAD(&recovery->failed);
 
@@ -134,7 +134,7 @@ static void pblk_end_w_fail(struct pblk *pblk, struct nvm_rq *rqd)
                /* Logic error */
                if (bit > c_ctx->nr_valid) {
                        WARN_ONCE(1, "pblk: corrupted write request\n");
-                       mempool_free(recovery, pblk->rec_pool);
+                       mempool_free(recovery, &pblk->rec_pool);
                        goto out;
                }
 
@@ -142,7 +142,7 @@ static void pblk_end_w_fail(struct pblk *pblk, struct nvm_rq *rqd)
                entry = pblk_rb_sync_scan_entry(&pblk->rwb, &ppa);
                if (!entry) {
                        pr_err("pblk: could not scan entry on write failure\n");
-                       mempool_free(recovery, pblk->rec_pool);
+                       mempool_free(recovery, &pblk->rec_pool);
                        goto out;
                }
 
@@ -156,7 +156,7 @@ static void pblk_end_w_fail(struct pblk *pblk, struct nvm_rq *rqd)
        ret = pblk_recov_setup_rq(pblk, c_ctx, recovery, comp_bits, c_entries);
        if (ret) {
                pr_err("pblk: could not recover from write failure\n");
-               mempool_free(recovery, pblk->rec_pool);
+               mempool_free(recovery, &pblk->rec_pool);
                goto out;
        }
 
index 9c682acfc5d13ec59d2465c46aeea57a6a33afc4..feafa4de264dcc93fe69519e649d114ffb103cf5 100644 (file)
@@ -664,12 +664,12 @@ struct pblk {
 
        struct list_head compl_list;
 
-       mempool_t *page_bio_pool;
-       mempool_t *gen_ws_pool;
-       mempool_t *rec_pool;
-       mempool_t *r_rq_pool;
-       mempool_t *w_rq_pool;
-       mempool_t *e_rq_pool;
+       mempool_t page_bio_pool;
+       mempool_t gen_ws_pool;
+       mempool_t rec_pool;
+       mempool_t r_rq_pool;
+       mempool_t w_rq_pool;
+       mempool_t e_rq_pool;
 
        struct workqueue_struct *close_wq;
        struct workqueue_struct *bb_wq;
@@ -841,7 +841,7 @@ void pblk_write_should_kick(struct pblk *pblk);
 /*
  * pblk read path
  */
-extern struct bio_set *pblk_bio_set;
+extern struct bio_set pblk_bio_set;
 int pblk_submit_read(struct pblk *pblk, struct bio *bio);
 int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq);
 /*