hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/lightnvm/pblk-rl.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Copyright (C) 2016 CNEX Labs
34 * Initial release: Javier Gonzalez <javier@cnexlabs.com>
....@@ -127,7 +128,7 @@
127128 } else if (free_blocks < rl->high) {
128129 int shift = rl->high_pw - rl->rb_windows_pw;
129130 int user_windows = free_blocks >> shift;
130
- int user_max = user_windows << PBLK_MAX_REQ_ADDRS_PW;
131
+ int user_max = user_windows << ilog2(NVM_MAX_VLBA);
131132
132133 rl->rb_user_max = user_max;
133134 rl->rb_gc_max = max - user_max;
....@@ -206,16 +207,14 @@
206207 del_timer(&rl->u_timer);
207208 }
208209
209
-void pblk_rl_init(struct pblk_rl *rl, int budget)
210
+void pblk_rl_init(struct pblk_rl *rl, int budget, int threshold)
210211 {
211212 struct pblk *pblk = container_of(rl, struct pblk, rl);
212213 struct nvm_tgt_dev *dev = pblk->dev;
213214 struct nvm_geo *geo = &dev->geo;
214215 struct pblk_line_mgmt *l_mg = &pblk->l_mg;
215216 struct pblk_line_meta *lm = &pblk->lm;
216
- int min_blocks = lm->blk_per_line * PBLK_GC_RSV_LINE;
217217 int sec_meta, blk_meta;
218
-
219218 unsigned int rb_windows;
220219
221220 /* Consider sectors used for metadata */
....@@ -225,19 +224,24 @@
225224 rl->high = pblk->op_blks - blk_meta - lm->blk_per_line;
226225 rl->high_pw = get_count_order(rl->high);
227226
228
- rl->rsv_blocks = min_blocks;
227
+ rl->rsv_blocks = pblk_get_min_chks(pblk);
229228
230229 /* This will always be a power-of-2 */
231
- rb_windows = budget / PBLK_MAX_REQ_ADDRS;
230
+ rb_windows = budget / NVM_MAX_VLBA;
232231 rl->rb_windows_pw = get_count_order(rb_windows);
233232
234233 /* To start with, all buffer is available to user I/O writers */
235234 rl->rb_budget = budget;
236235 rl->rb_user_max = budget;
237
- rl->rb_max_io = budget >> 1;
238236 rl->rb_gc_max = 0;
239237 rl->rb_state = PBLK_RL_HIGH;
240238
239
+ /* Maximize I/O size and ansure that back threshold is respected */
240
+ if (threshold)
241
+ rl->rb_max_io = budget - pblk->min_write_pgs_data - threshold;
242
+ else
243
+ rl->rb_max_io = budget - pblk->min_write_pgs_data - 1;
244
+
241245 atomic_set(&rl->rb_user_cnt, 0);
242246 atomic_set(&rl->rb_gc_cnt, 0);
243247 atomic_set(&rl->rb_space, -1);