Skip to content

Commit

Permalink
lightnvm: pblk: use kvmalloc for metadata
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Hans Holmberg authored and Jens Axboe committed Aug 6, 2019
1 parent 48e5da7 commit ff8f352
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 64 deletions.
3 changes: 1 addition & 2 deletions drivers/lightnvm/pblk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
19 changes: 8 additions & 11 deletions drivers/lightnvm/pblk-gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,22 +132,20 @@ 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;

ret = pblk_line_emeta_read(pblk, line, emeta_buf);
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;
}

Expand All @@ -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;
}
Expand All @@ -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;
Expand Down Expand Up @@ -272,7 +269,7 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work)
goto next_rq;

out:
pblk_mfree(lba_list, l_mg->emeta_alloc_type);
kvfree(lba_list);
kfree(line_ws);
kfree(invalid_bitmap);

Expand All @@ -286,7 +283,7 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work)
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:
Expand Down
38 changes: 10 additions & 28 deletions drivers/lightnvm/pblk-init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
}

Expand All @@ -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);
}

Expand Down Expand Up @@ -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++)
Expand All @@ -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]);
}

Expand Down
23 changes: 0 additions & 23 deletions drivers/lightnvm/pblk.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit ff8f352

Please sign in to comment.