aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/lightnvm/pblk-core.c2
-rw-r--r--drivers/lightnvm/pblk-rl.c33
-rw-r--r--drivers/lightnvm/pblk.h1
3 files changed, 9 insertions, 27 deletions
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 8536d38ef97e..a68c6ae536e5 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -1591,8 +1591,6 @@ void pblk_line_close(struct pblk *pblk, struct pblk_line *line)
1591 1591
1592 spin_unlock(&line->lock); 1592 spin_unlock(&line->lock);
1593 spin_unlock(&l_mg->gc_lock); 1593 spin_unlock(&l_mg->gc_lock);
1594
1595 pblk_gc_should_kick(pblk);
1596} 1594}
1597 1595
1598void pblk_line_close_meta(struct pblk *pblk, struct pblk_line *line) 1596void pblk_line_close_meta(struct pblk *pblk, struct pblk_line *line)
diff --git a/drivers/lightnvm/pblk-rl.c b/drivers/lightnvm/pblk-rl.c
index 2e6a5361baf0..9565c3bc4d0b 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) 99static void 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)
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h
index 9ece409993fe..3a07c5b61a0c 100644
--- a/drivers/lightnvm/pblk.h
+++ b/drivers/lightnvm/pblk.h
@@ -824,7 +824,6 @@ int pblk_gc_init(struct pblk *pblk);
824void pblk_gc_exit(struct pblk *pblk); 824void pblk_gc_exit(struct pblk *pblk);
825void pblk_gc_should_start(struct pblk *pblk); 825void pblk_gc_should_start(struct pblk *pblk);
826void pblk_gc_should_stop(struct pblk *pblk); 826void pblk_gc_should_stop(struct pblk *pblk);
827void pblk_gc_should_kick(struct pblk *pblk);
828void pblk_gc_kick(struct pblk *pblk); 827void pblk_gc_kick(struct pblk *pblk);
829void pblk_gc_sysfs_state_show(struct pblk *pblk, int *gc_enabled, 828void pblk_gc_sysfs_state_show(struct pblk *pblk, int *gc_enabled,
830 int *gc_active); 829 int *gc_active);