/*
  * pblk_rb_calculate_size -- calculate the size of the write buffer
  */
-static unsigned int pblk_rb_calculate_size(unsigned int nr_entries)
+static unsigned int pblk_rb_calculate_size(unsigned int nr_entries,
+                                          unsigned int threshold)
 {
-       /* Alloc a write buffer that can at least fit 128 entries */
-       return (1 << max(get_count_order(nr_entries), 7));
+       unsigned int thr_sz = 1 << (get_count_order(threshold + NVM_MAX_VLBA));
+       unsigned int max_sz = max(thr_sz, nr_entries);
+       unsigned int max_io;
+
+       /* Alloc a write buffer that can (i) fit at least two split bios
+        * (considering max I/O size NVM_MAX_VLBA, and (ii) guarantee that the
+        * threshold will be respected
+        */
+       max_io = (1 << max((int)(get_count_order(max_sz)),
+                               (int)(get_count_order(NVM_MAX_VLBA << 1))));
+       if ((threshold + NVM_MAX_VLBA) >= max_io)
+               max_io <<= 1;
+
+       return max_io;
 }
 
 /*
        unsigned int alloc_order, order, iter;
        unsigned int nr_entries;
 
-       nr_entries = pblk_rb_calculate_size(size);
+       nr_entries = pblk_rb_calculate_size(size, threshold);
        entries = vzalloc(array_size(nr_entries, sizeof(struct pblk_rb_entry)));
        if (!entries)
                return -ENOMEM;
 
-       power_size = get_count_order(size);
+       power_size = get_count_order(nr_entries);
        power_seg_sz = get_count_order(seg_size);
 
        down_write(&pblk_rb_lock);
         * Initialize rate-limiter, which controls access to the write buffer
         * by user and GC I/O
         */
-       pblk_rl_init(&pblk->rl, rb->nr_entries);
+       pblk_rl_init(&pblk->rl, rb->nr_entries, threshold);
 
        return 0;
 }
 
        del_timer(&rl->u_timer);
 }
 
-void pblk_rl_init(struct pblk_rl *rl, int budget)
+void pblk_rl_init(struct pblk_rl *rl, int budget, int threshold)
 {
        struct pblk *pblk = container_of(rl, struct pblk, rl);
        struct nvm_tgt_dev *dev = pblk->dev;
        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);
        /* 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 = budget >> 1;
+       rl->rb_max_io = threshold ? (budget - threshold) : (budget - 1);
        rl->rb_gc_max = 0;
        rl->rb_state = PBLK_RL_HIGH;
 
 
 /*
  * pblk rate limiter
  */
-void pblk_rl_init(struct pblk_rl *rl, int budget);
+void pblk_rl_init(struct pblk_rl *rl, int budget, int threshold);
 void pblk_rl_free(struct pblk_rl *rl);
 void pblk_rl_update_rates(struct pblk_rl *rl);
 int pblk_rl_high_thrs(struct pblk_rl *rl);