lightnvm: pblk: set conservative threshold for user writes
In a worst-case scenario (random writes), OP% of sectors in each line will be invalid, and we will then need to move data out of 100/OP% lines to free a single line. So, to prevent the possibility of running out of lines, temporarily block user writes when there is less than 100/OP% free lines. Also ensure that pblk creation does not produce instances with insufficient over provisioning. Insufficient over-provising is not a problem on real hardware, but often an issue when running QEMU simulations (with few lines). 100 lines is enough to create a sane instance with the standard (11%) over provisioning. Signed-off-by: Hans Holmberg <hans.holmberg@cnexlabs.com> Reviewed-by: Javier González <javier@javigon.com> Signed-off-by: Matias Bjørling <mb@lightnvm.io> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:

committed by
Jens Axboe

parent
525f7bb2c9
commit
3bcebc5bac
@@ -214,11 +214,10 @@ void pblk_rl_init(struct pblk_rl *rl, int budget)
|
||||
struct nvm_geo *geo = &dev->geo;
|
||||
struct pblk_line_mgmt *l_mg = &pblk->l_mg;
|
||||
struct pblk_line_meta *lm = &pblk->lm;
|
||||
int min_blocks = lm->blk_per_line * PBLK_GC_RSV_LINE;
|
||||
int sec_meta, blk_meta;
|
||||
|
||||
unsigned int rb_windows;
|
||||
|
||||
|
||||
/* Consider sectors used for metadata */
|
||||
sec_meta = (lm->smeta_sec + lm->emeta_sec[0]) * l_mg->nr_free_lines;
|
||||
blk_meta = DIV_ROUND_UP(sec_meta, geo->clba);
|
||||
@@ -226,7 +225,7 @@ void pblk_rl_init(struct pblk_rl *rl, int budget)
|
||||
rl->high = pblk->op_blks - blk_meta - lm->blk_per_line;
|
||||
rl->high_pw = get_count_order(rl->high);
|
||||
|
||||
rl->rsv_blocks = min_blocks;
|
||||
rl->rsv_blocks = pblk_get_min_chks(pblk);
|
||||
|
||||
/* This will always be a power-of-2 */
|
||||
rb_windows = budget / NVM_MAX_VLBA;
|
||||
|
Reference in New Issue
Block a user