pblk: fix max_io calculation
authorJavier González <javier@javigon.com>
Thu, 7 Mar 2019 12:18:53 +0000 (13:18 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 7 Mar 2019 15:59:26 +0000 (08:59 -0700)
When calculating the maximun I/O size allowed into the buffer, consider
the write size (ws_opt) used by the write thread in order to cover the
case in which, due to flushes, the mem and subm pointers are disaligned
by (ws_opt - 1). This case currently translates into a stall when
an I/O of the largest possible size is submitted.

Fixes: f9f9d1ae2c66 ("lightnvm: pblk: prevent stall due to wb threshold")

Signed-off-by: Javier González <javier@javigon.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/lightnvm/pblk-rl.c

index b014957dde0bae609b99ab932e50f0a76ed797f0..a5f8bc2defbcde1656acfa972301050267e3f77b 100644 (file)
@@ -233,10 +233,15 @@ void pblk_rl_init(struct pblk_rl *rl, int budget, int threshold)
        /* To start with, all buffer is available to user I/O writers */
        rl->rb_budget = budget;
        rl->rb_user_max = budget;
-       rl->rb_max_io = threshold ? (budget - threshold) : (budget - 1);
        rl->rb_gc_max = 0;
        rl->rb_state = PBLK_RL_HIGH;
 
+       /* Maximize I/O size and ansure that back threshold is respected */
+       if (threshold)
+               rl->rb_max_io = budget - pblk->min_write_pgs_data - threshold;
+       else
+               rl->rb_max_io = budget - pblk->min_write_pgs_data - 1;
+
        atomic_set(&rl->rb_user_cnt, 0);
        atomic_set(&rl->rb_gc_cnt, 0);
        atomic_set(&rl->rb_space, -1);