Commit ffc03fb7 authored by Marcin Dziegielewski's avatar Marcin Dziegielewski Committed by Jens Axboe

lightnvm: pblk: handle case when mw_cunits equals to 0

Some devices can expose mw_cunits equal to 0, it can cause the
creation of too small write buffer and cause performance to drop
on write workloads.

Additionally, write buffer size must cover write data requirements,
such as WS_MIN and MW_CUNITS - it must be greater than or equal to
the larger one multiplied by the number of PUs. However, for
performance reasons, use the WS_OPT value to calculation instead of
WS_MIN.

Because the place where buffer size is calculated was changed, this
patch also removes pgs_in_buffer filed in pblk structure.
Signed-off-by: default avatarMarcin Dziegielewski <marcin.dziegielewski@intel.com>
Signed-off-by: default avatarIgor Konopko <igor.j.konopko@intel.com>
Reviewed-by: default avatarJavier González <javier@cnexlabs.com>
Signed-off-by: default avatarMatias Bjørling <mb@lightnvm.io>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 05814a10
...@@ -179,11 +179,14 @@ static int pblk_rwb_init(struct pblk *pblk) ...@@ -179,11 +179,14 @@ static int pblk_rwb_init(struct pblk *pblk)
struct pblk_rb_entry *entries; struct pblk_rb_entry *entries;
unsigned long nr_entries, buffer_size; unsigned long nr_entries, buffer_size;
unsigned int power_size, power_seg_sz; unsigned int power_size, power_seg_sz;
int pgs_in_buffer;
if (write_buffer_size && (write_buffer_size > pblk->pgs_in_buffer)) pgs_in_buffer = max(geo->mw_cunits, geo->ws_opt) * geo->all_luns;
if (write_buffer_size && (write_buffer_size > pgs_in_buffer))
buffer_size = write_buffer_size; buffer_size = write_buffer_size;
else else
buffer_size = pblk->pgs_in_buffer; buffer_size = pgs_in_buffer;
nr_entries = pblk_rb_calculate_size(buffer_size); nr_entries = pblk_rb_calculate_size(buffer_size);
...@@ -366,8 +369,6 @@ static int pblk_core_init(struct pblk *pblk) ...@@ -366,8 +369,6 @@ static int pblk_core_init(struct pblk *pblk)
atomic64_set(&pblk->nr_flush, 0); atomic64_set(&pblk->nr_flush, 0);
pblk->nr_flush_rst = 0; pblk->nr_flush_rst = 0;
pblk->pgs_in_buffer = geo->mw_cunits * geo->all_luns;
pblk->min_write_pgs = geo->ws_opt * (geo->csecs / PAGE_SIZE); pblk->min_write_pgs = geo->ws_opt * (geo->csecs / PAGE_SIZE);
max_write_ppas = pblk->min_write_pgs * geo->all_luns; max_write_ppas = pblk->min_write_pgs * geo->all_luns;
pblk->max_write_pgs = min_t(int, max_write_ppas, NVM_MAX_VLBA); pblk->max_write_pgs = min_t(int, max_write_ppas, NVM_MAX_VLBA);
......
...@@ -608,9 +608,6 @@ struct pblk { ...@@ -608,9 +608,6 @@ struct pblk {
int min_write_pgs; /* Minimum amount of pages required by controller */ int min_write_pgs; /* Minimum amount of pages required by controller */
int max_write_pgs; /* Maximum amount of pages supported by controller */ int max_write_pgs; /* Maximum amount of pages supported by controller */
int pgs_in_buffer; /* Number of pages that need to be held in buffer to
* guarantee successful reads.
*/
sector_t capacity; /* Device capacity when bad blocks are subtracted */ sector_t capacity; /* Device capacity when bad blocks are subtracted */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment