lightnvm: pblk: use kvmalloc for metadata
authorHans Holmberg <hans@owltronix.com>
Wed, 31 Jul 2019 09:41:35 +0000 (11:41 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 6 Aug 2019 14:20:10 +0000 (08:20 -0600)
There is no reason now not to use kvmalloc, so replace the internal
metadata allocation scheme.

Reviewed-by: Javier González <javier@javigon.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Hans Holmberg <hans@owltronix.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/lightnvm/pblk-core.c
drivers/lightnvm/pblk-gc.c
drivers/lightnvm/pblk-init.c
drivers/lightnvm/pblk.h

index a58d3c84a3f2b3ccfeb189e5c67d7406e38fda2a..b413bafe93fddd97a9ee85ba29b1007490ad8b49 100644 (file)
@@ -1839,8 +1839,7 @@ static void pblk_save_lba_list(struct pblk *pblk, struct pblk_line *line)
        struct pblk_w_err_gc *w_err_gc = line->w_err_gc;
        struct pblk_emeta *emeta = line->emeta;
 
-       w_err_gc->lba_list = pblk_malloc(lba_list_size,
-                                        l_mg->emeta_alloc_type, GFP_KERNEL);
+       w_err_gc->lba_list = kvmalloc(lba_list_size, GFP_KERNEL);
        memcpy(w_err_gc->lba_list, emeta_to_lbas(pblk, emeta->buf),
                                lba_list_size);
 }
index 63ee205b41c477f9ebc70374f6cf208915e6c4f1..2581eebcfc41d5d4363a62ba457fae15152d3090 100644 (file)
@@ -132,14 +132,12 @@ static __le64 *get_lba_list_from_emeta(struct pblk *pblk,
                                       struct pblk_line *line)
 {
        struct line_emeta *emeta_buf;
-       struct pblk_line_mgmt *l_mg = &pblk->l_mg;
        struct pblk_line_meta *lm = &pblk->lm;
        unsigned int lba_list_size = lm->emeta_len[2];
        __le64 *lba_list;
        int ret;
 
-       emeta_buf = pblk_malloc(lm->emeta_len[0],
-                               l_mg->emeta_alloc_type, GFP_KERNEL);
+       emeta_buf = kvmalloc(lm->emeta_len[0], GFP_KERNEL);
        if (!emeta_buf)
                return NULL;
 
@@ -147,7 +145,7 @@ static __le64 *get_lba_list_from_emeta(struct pblk *pblk,
        if (ret) {
                pblk_err(pblk, "line %d read emeta failed (%d)\n",
                                line->id, ret);
-               pblk_mfree(emeta_buf, l_mg->emeta_alloc_type);
+               kvfree(emeta_buf);
                return NULL;
        }
 
@@ -161,16 +159,16 @@ static __le64 *get_lba_list_from_emeta(struct pblk *pblk,
        if (ret) {
                pblk_err(pblk, "inconsistent emeta (line %d)\n",
                                line->id);
-               pblk_mfree(emeta_buf, l_mg->emeta_alloc_type);
+               kvfree(emeta_buf);
                return NULL;
        }
 
-       lba_list = pblk_malloc(lba_list_size,
-                              l_mg->emeta_alloc_type, GFP_KERNEL);
+       lba_list = kvmalloc(lba_list_size, GFP_KERNEL);
+
        if (lba_list)
                memcpy(lba_list, emeta_to_lbas(pblk, emeta_buf), lba_list_size);
 
-       pblk_mfree(emeta_buf, l_mg->emeta_alloc_type);
+       kvfree(emeta_buf);
 
        return lba_list;
 }
@@ -181,7 +179,6 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work)
                                                                        ws);
        struct pblk *pblk = line_ws->pblk;
        struct pblk_line *line = line_ws->line;
-       struct pblk_line_mgmt *l_mg = &pblk->l_mg;
        struct pblk_line_meta *lm = &pblk->lm;
        struct nvm_tgt_dev *dev = pblk->dev;
        struct nvm_geo *geo = &dev->geo;
@@ -272,7 +269,7 @@ next_rq:
                goto next_rq;
 
 out:
-       pblk_mfree(lba_list, l_mg->emeta_alloc_type);
+       kvfree(lba_list);
        kfree(line_ws);
        kfree(invalid_bitmap);
 
@@ -286,7 +283,7 @@ fail_free_gc_data:
 fail_free_gc_rq:
        kfree(gc_rq);
 fail_free_lba_list:
-       pblk_mfree(lba_list, l_mg->emeta_alloc_type);
+       kvfree(lba_list);
 fail_free_invalid_bitmap:
        kfree(invalid_bitmap);
 fail_free_ws:
index b351c7f002de0509b7bca75a0f64a616eec7ee32..9a967a2e83dd72711db1ab538c650f126cafb97d 100644 (file)
@@ -543,7 +543,7 @@ static void pblk_line_mg_free(struct pblk *pblk)
 
        for (i = 0; i < PBLK_DATA_LINES; i++) {
                kfree(l_mg->sline_meta[i]);
-               pblk_mfree(l_mg->eline_meta[i]->buf, l_mg->emeta_alloc_type);
+               kvfree(l_mg->eline_meta[i]->buf);
                kfree(l_mg->eline_meta[i]);
        }
 
@@ -560,7 +560,7 @@ static void pblk_line_meta_free(struct pblk_line_mgmt *l_mg,
        kfree(line->erase_bitmap);
        kfree(line->chks);
 
-       pblk_mfree(w_err_gc->lba_list, l_mg->emeta_alloc_type);
+       kvfree(w_err_gc->lba_list);
        kfree(w_err_gc);
 }
 
@@ -890,29 +890,14 @@ static int pblk_line_mg_init(struct pblk *pblk)
                if (!emeta)
                        goto fail_free_emeta;
 
-               if (lm->emeta_len[0] > KMALLOC_MAX_CACHE_SIZE) {
-                       l_mg->emeta_alloc_type = PBLK_VMALLOC_META;
-
-                       emeta->buf = vmalloc(lm->emeta_len[0]);
-                       if (!emeta->buf) {
-                               kfree(emeta);
-                               goto fail_free_emeta;
-                       }
-
-                       emeta->nr_entries = lm->emeta_sec[0];
-                       l_mg->eline_meta[i] = emeta;
-               } else {
-                       l_mg->emeta_alloc_type = PBLK_KMALLOC_META;
-
-                       emeta->buf = kmalloc(lm->emeta_len[0], GFP_KERNEL);
-                       if (!emeta->buf) {
-                               kfree(emeta);
-                               goto fail_free_emeta;
-                       }
-
-                       emeta->nr_entries = lm->emeta_sec[0];
-                       l_mg->eline_meta[i] = emeta;
+               emeta->buf = kvmalloc(lm->emeta_len[0], GFP_KERNEL);
+               if (!emeta->buf) {
+                       kfree(emeta);
+                       goto fail_free_emeta;
                }
+
+               emeta->nr_entries = lm->emeta_sec[0];
+               l_mg->eline_meta[i] = emeta;
        }
 
        for (i = 0; i < l_mg->nr_lines; i++)
@@ -926,10 +911,7 @@ static int pblk_line_mg_init(struct pblk *pblk)
 
 fail_free_emeta:
        while (--i >= 0) {
-               if (l_mg->emeta_alloc_type == PBLK_VMALLOC_META)
-                       vfree(l_mg->eline_meta[i]->buf);
-               else
-                       kfree(l_mg->eline_meta[i]->buf);
+               kvfree(l_mg->eline_meta[i]->buf);
                kfree(l_mg->eline_meta[i]);
        }
 
index d515d3409a74fb29dc26850f75ebe373cbc1c109..86ffa875bfe16c0b2d2bf95bf4939535b173d1c2 100644 (file)
@@ -481,11 +481,6 @@ struct pblk_line {
 
 #define PBLK_DATA_LINES 4
 
-enum {
-       PBLK_KMALLOC_META = 1,
-       PBLK_VMALLOC_META = 2,
-};
-
 enum {
        PBLK_EMETA_TYPE_HEADER = 1,     /* struct line_emeta first sector */
        PBLK_EMETA_TYPE_LLBA = 2,       /* lba list - type: __le64 */
@@ -521,9 +516,6 @@ struct pblk_line_mgmt {
 
        __le32 *vsc_list;               /* Valid sector counts for all lines */
 
-       /* Metadata allocation type: VMALLOC | KMALLOC */
-       int emeta_alloc_type;
-
        /* Pre-allocated metadata for data lines */
        struct pblk_smeta *sline_meta[PBLK_DATA_LINES];
        struct pblk_emeta *eline_meta[PBLK_DATA_LINES];
@@ -934,21 +926,6 @@ void pblk_rl_werr_line_out(struct pblk_rl *rl);
 int pblk_sysfs_init(struct gendisk *tdisk);
 void pblk_sysfs_exit(struct gendisk *tdisk);
 
-static inline void *pblk_malloc(size_t size, int type, gfp_t flags)
-{
-       if (type == PBLK_KMALLOC_META)
-               return kmalloc(size, flags);
-       return vmalloc(size);
-}
-
-static inline void pblk_mfree(void *ptr, int type)
-{
-       if (type == PBLK_KMALLOC_META)
-               kfree(ptr);
-       else
-               vfree(ptr);
-}
-
 static inline struct nvm_rq *nvm_rq_from_c_ctx(void *c_ctx)
 {
        return c_ctx - sizeof(struct nvm_rq);