summaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk-rl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/lightnvm/pblk-rl.c')
-rw-r--r--drivers/lightnvm/pblk-rl.c43
1 files changed, 12 insertions, 31 deletions
diff --git a/drivers/lightnvm/pblk-rl.c b/drivers/lightnvm/pblk-rl.c
index 2e6a5361baf0..abae31fd434e 100644
--- a/drivers/lightnvm/pblk-rl.c
+++ b/drivers/lightnvm/pblk-rl.c
@@ -96,9 +96,11 @@ unsigned long pblk_rl_nr_free_blks(struct pblk_rl *rl)
96 * 96 *
97 * Only the total number of free blocks is used to configure the rate limiter. 97 * Only the total number of free blocks is used to configure the rate limiter.
98 */ 98 */
99static int pblk_rl_update_rates(struct pblk_rl *rl, unsigned long max) 99void pblk_rl_update_rates(struct pblk_rl *rl)
100{ 100{
101 struct pblk *pblk = container_of(rl, struct pblk, rl);
101 unsigned long free_blocks = pblk_rl_nr_free_blks(rl); 102 unsigned long free_blocks = pblk_rl_nr_free_blks(rl);
103 int max = rl->rb_budget;
102 104
103 if (free_blocks >= rl->high) { 105 if (free_blocks >= rl->high) {
104 rl->rb_user_max = max; 106 rl->rb_user_max = max;
@@ -124,23 +126,18 @@ static int pblk_rl_update_rates(struct pblk_rl *rl, unsigned long max)
124 rl->rb_state = PBLK_RL_LOW; 126 rl->rb_state = PBLK_RL_LOW;
125 } 127 }
126 128
127 return rl->rb_state; 129 if (rl->rb_state == (PBLK_RL_MID | PBLK_RL_LOW))
130 pblk_gc_should_start(pblk);
131 else
132 pblk_gc_should_stop(pblk);
128} 133}
129 134
130void pblk_rl_free_lines_inc(struct pblk_rl *rl, struct pblk_line *line) 135void pblk_rl_free_lines_inc(struct pblk_rl *rl, struct pblk_line *line)
131{ 136{
132 struct pblk *pblk = container_of(rl, struct pblk, rl);
133 int blk_in_line = atomic_read(&line->blk_in_line); 137 int blk_in_line = atomic_read(&line->blk_in_line);
134 int ret;
135 138
136 atomic_add(blk_in_line, &rl->free_blocks); 139 atomic_add(blk_in_line, &rl->free_blocks);
137 /* Rates will not change that often - no need to lock update */ 140 pblk_rl_update_rates(rl);
138 ret = pblk_rl_update_rates(rl, rl->rb_budget);
139
140 if (ret == (PBLK_RL_MID | PBLK_RL_LOW))
141 pblk_gc_should_start(pblk);
142 else
143 pblk_gc_should_stop(pblk);
144} 141}
145 142
146void pblk_rl_free_lines_dec(struct pblk_rl *rl, struct pblk_line *line) 143void pblk_rl_free_lines_dec(struct pblk_rl *rl, struct pblk_line *line)
@@ -148,19 +145,7 @@ void pblk_rl_free_lines_dec(struct pblk_rl *rl, struct pblk_line *line)
148 int blk_in_line = atomic_read(&line->blk_in_line); 145 int blk_in_line = atomic_read(&line->blk_in_line);
149 146
150 atomic_sub(blk_in_line, &rl->free_blocks); 147 atomic_sub(blk_in_line, &rl->free_blocks);
151} 148 pblk_rl_update_rates(rl);
152
153void pblk_gc_should_kick(struct pblk *pblk)
154{
155 struct pblk_rl *rl = &pblk->rl;
156 int ret;
157
158 /* Rates will not change that often - no need to lock update */
159 ret = pblk_rl_update_rates(rl, rl->rb_budget);
160 if (ret == (PBLK_RL_MID | PBLK_RL_LOW))
161 pblk_gc_should_start(pblk);
162 else
163 pblk_gc_should_stop(pblk);
164} 149}
165 150
166int pblk_rl_high_thrs(struct pblk_rl *rl) 151int pblk_rl_high_thrs(struct pblk_rl *rl)
@@ -168,14 +153,9 @@ int pblk_rl_high_thrs(struct pblk_rl *rl)
168 return rl->high; 153 return rl->high;
169} 154}
170 155
171int pblk_rl_low_thrs(struct pblk_rl *rl) 156int pblk_rl_max_io(struct pblk_rl *rl)
172{
173 return rl->low;
174}
175
176int pblk_rl_sysfs_rate_show(struct pblk_rl *rl)
177{ 157{
178 return rl->rb_user_max; 158 return rl->rb_max_io;
179} 159}
180 160
181static void pblk_rl_u_timer(unsigned long data) 161static void pblk_rl_u_timer(unsigned long data)
@@ -214,6 +194,7 @@ void pblk_rl_init(struct pblk_rl *rl, int budget)
214 /* To start with, all buffer is available to user I/O writers */ 194 /* To start with, all buffer is available to user I/O writers */
215 rl->rb_budget = budget; 195 rl->rb_budget = budget;
216 rl->rb_user_max = budget; 196 rl->rb_user_max = budget;
197 rl->rb_max_io = budget >> 1;
217 rl->rb_gc_max = 0; 198 rl->rb_gc_max = 0;
218 rl->rb_state = PBLK_RL_HIGH; 199 rl->rb_state = PBLK_RL_HIGH;
219 200