Lines Matching refs:pblk

16  * pblk-gc.c - pblk's garbage collector
19 #include "pblk.h"
20 #include "pblk-trace.h"
31 static int pblk_gc_write(struct pblk *pblk)
33 struct pblk_gc *gc = &pblk->gc;
48 pblk_write_gc_to_cache(pblk, gc_rq);
62 void pblk_put_line_back(struct pblk *pblk, struct pblk_line *line)
64 struct pblk_line_mgmt *l_mg = &pblk->l_mg;
71 trace_pblk_line_state(pblk_disk_name(pblk), line->id,
80 move_list = pblk_line_gc_list(pblk, line);
90 struct pblk *pblk = gc_rq_ws->pblk;
91 struct pblk_gc *gc = &pblk->gc;
99 ret = pblk_submit_read_gc(pblk, gc_rq);
112 pblk_gc_writer_kick(&pblk->gc);
120 pblk_gc_writer_kick(&pblk->gc);
131 static __le64 *get_lba_list_from_emeta(struct pblk *pblk,
135 struct pblk_line_meta *lm = &pblk->lm;
144 ret = pblk_line_emeta_read(pblk, line, emeta_buf);
146 pblk_err(pblk, "line %d read emeta failed (%d)\n",
158 ret = pblk_recov_check_emeta(pblk, emeta_buf);
160 pblk_err(pblk, "inconsistent emeta (line %d)\n",
169 memcpy(lba_list, emeta_to_lbas(pblk, emeta_buf), lba_list_size);
180 struct pblk *pblk = line_ws->pblk;
182 struct pblk_line_meta *lm = &pblk->lm;
183 struct nvm_tgt_dev *dev = pblk->dev;
185 struct pblk_gc *gc = &pblk->gc;
200 lba_list = get_lba_list_from_emeta(pblk, line);
202 pblk_err(pblk, "could not interpret emeta (line %d)\n",
214 pblk_err(pblk, "corrupted GC line (%d)\n", line->id);
233 } while (nr_secs < pblk->max_write_pgs);
251 gc_rq_ws->pblk = pblk;
296 pblk_put_line_back(pblk, line);
299 pblk_err(pblk, "failed to GC line %d\n", line->id);
302 static int pblk_gc_line(struct pblk *pblk, struct pblk_line *line)
304 struct pblk_gc *gc = &pblk->gc;
307 pblk_debug(pblk, "line '%d' being reclaimed for GC\n", line->id);
313 line_ws->pblk = pblk;
328 static void pblk_gc_kick(struct pblk *pblk)
330 struct pblk_gc *gc = &pblk->gc;
343 static int pblk_gc_read(struct pblk *pblk)
345 struct pblk_gc *gc = &pblk->gc;
358 pblk_gc_kick(pblk);
360 if (pblk_gc_line(pblk, line)) {
361 pblk_err(pblk, "failed to GC line %d\n", line->id);
371 static struct pblk_line *pblk_gc_get_victim_line(struct pblk *pblk,
407 void pblk_gc_free_full_lines(struct pblk *pblk)
409 struct pblk_line_mgmt *l_mg = &pblk->l_mg;
410 struct pblk_gc *gc = &pblk->gc;
426 trace_pblk_line_state(pblk_disk_name(pblk), line->id,
444 static void pblk_gc_run(struct pblk *pblk)
446 struct pblk_line_mgmt *l_mg = &pblk->l_mg;
447 struct pblk_gc *gc = &pblk->gc;
453 pblk_gc_free_full_lines(pblk);
455 run_gc = pblk_gc_should_run(&pblk->gc, &pblk->rl);
465 line = pblk_gc_get_victim_line(pblk, group_list);
474 trace_pblk_line_state(pblk_disk_name(pblk), line->id,
491 run_gc = pblk_gc_should_run(&pblk->gc, &pblk->rl);
496 if (!prev_group && pblk->rl.rb_state > gc_group &&
503 struct pblk *pblk = from_timer(pblk, t, gc.gc_timer);
505 pblk_gc_kick(pblk);
510 struct pblk *pblk = data;
513 pblk_gc_run(pblk);
523 struct pblk *pblk = data;
526 if (!pblk_gc_write(pblk))
537 struct pblk *pblk = data;
538 struct pblk_gc *gc = &pblk->gc;
541 if (!pblk_gc_read(pblk))
548 pblk_info(pblk, "flushing gc pipeline, %d lines left\n",
562 static void pblk_gc_start(struct pblk *pblk)
564 pblk->gc.gc_active = 1;
565 pblk_debug(pblk, "gc start\n");
568 void pblk_gc_should_start(struct pblk *pblk)
570 struct pblk_gc *gc = &pblk->gc;
573 pblk_gc_start(pblk);
574 pblk_gc_kick(pblk);
578 void pblk_gc_should_stop(struct pblk *pblk)
580 struct pblk_gc *gc = &pblk->gc;
586 void pblk_gc_should_kick(struct pblk *pblk)
588 pblk_rl_update_rates(&pblk->rl);
591 void pblk_gc_sysfs_state_show(struct pblk *pblk, int *gc_enabled,
594 struct pblk_gc *gc = &pblk->gc;
602 int pblk_gc_sysfs_force(struct pblk *pblk, int force)
604 struct pblk_gc *gc = &pblk->gc;
618 pblk_gc_should_start(pblk);
623 int pblk_gc_init(struct pblk *pblk)
625 struct pblk_gc *gc = &pblk->gc;
628 gc->gc_ts = kthread_create(pblk_gc_ts, pblk, "pblk-gc-ts");
630 pblk_err(pblk, "could not allocate GC main kthread\n");
634 gc->gc_writer_ts = kthread_create(pblk_gc_writer_ts, pblk,
635 "pblk-gc-writer-ts");
637 pblk_err(pblk, "could not allocate GC writer kthread\n");
642 gc->gc_reader_ts = kthread_create(pblk_gc_reader_ts, pblk,
643 "pblk-gc-reader-ts");
645 pblk_err(pblk, "could not allocate GC reader kthread\n");
663 gc->gc_line_reader_wq = alloc_workqueue("pblk-gc-line-reader-wq",
666 pblk_err(pblk, "could not allocate GC line reader workqueue\n");
672 gc->gc_reader_wq = alloc_workqueue("pblk-gc-line_wq",
675 pblk_err(pblk, "could not allocate GC reader workqueue\n");
703 void pblk_gc_exit(struct pblk *pblk, bool graceful)
705 struct pblk_gc *gc = &pblk->gc;