Lines Matching defs:zrc
59 static int dmz_reclaim_align_wp(struct dmz_reclaim *zrc, struct dm_zone *zone,
62 struct dmz_metadata *zmd = zrc->metadata;
102 struct dmz_reclaim *zrc = context;
105 zrc->kc_err = -EIO;
107 zrc->kc_err = 0;
109 clear_bit_unlock(DMZ_RECLAIM_KCOPY, &zrc->flags);
111 wake_up_bit(&zrc->flags, DMZ_RECLAIM_KCOPY);
117 static int dmz_reclaim_copy(struct dmz_reclaim *zrc,
120 struct dmz_metadata *zmd = zrc->metadata;
160 ret = dmz_reclaim_align_wp(zrc, dst_zone, block);
174 set_bit(DMZ_RECLAIM_KCOPY, &zrc->flags);
175 dm_kcopyd_copy(zrc->kc, &src, 1, &dst, flags,
176 dmz_reclaim_kcopy_end, zrc);
179 wait_on_bit_io(&zrc->flags, DMZ_RECLAIM_KCOPY,
181 if (zrc->kc_err)
182 return zrc->kc_err;
196 static int dmz_reclaim_buf(struct dmz_reclaim *zrc, struct dm_zone *dzone)
200 struct dmz_metadata *zmd = zrc->metadata;
204 dmz_metadata_label(zmd), zrc->dev_idx,
209 ret = dmz_reclaim_copy(zrc, bzone, dzone);
235 static int dmz_reclaim_seq_data(struct dmz_reclaim *zrc, struct dm_zone *dzone)
239 struct dmz_metadata *zmd = zrc->metadata;
243 dmz_metadata_label(zmd), zrc->dev_idx,
248 ret = dmz_reclaim_copy(zrc, dzone, bzone);
280 static int dmz_reclaim_rnd_data(struct dmz_reclaim *zrc, struct dm_zone *dzone)
284 struct dmz_metadata *zmd = zrc->metadata;
291 szone = dmz_alloc_zone(zmd, zrc->dev_idx,
302 dmz_metadata_label(zmd), zrc->dev_idx, chunk,
308 ret = dmz_reclaim_copy(zrc, dzone, szone);
340 static void dmz_reclaim_empty(struct dmz_reclaim *zrc, struct dm_zone *dzone)
342 struct dmz_metadata *zmd = zrc->metadata;
356 static inline int dmz_target_idle(struct dmz_reclaim *zrc)
358 return time_is_before_jiffies(zrc->atime + DMZ_IDLE_PERIOD);
364 static int dmz_do_reclaim(struct dmz_reclaim *zrc)
366 struct dmz_metadata *zmd = zrc->metadata;
373 dzone = dmz_get_zone_for_reclaim(zmd, zrc->dev_idx,
374 dmz_target_idle(zrc));
377 dmz_metadata_label(zmd), zrc->dev_idx);
386 dmz_reclaim_empty(zrc, dzone);
393 ret = dmz_reclaim_rnd_data(zrc, dzone);
408 ret = dmz_reclaim_buf(zrc, dzone);
416 ret = dmz_reclaim_seq_data(zrc, dzone);
423 dmz_metadata_label(zmd), zrc->dev_idx,
427 dmz_metadata_label(zmd), zrc->dev_idx,
433 ret = dmz_flush_metadata(zrc->metadata);
436 dmz_metadata_label(zmd), zrc->dev_idx, rzone->id, ret);
441 dmz_metadata_label(zmd), zrc->dev_idx,
446 static unsigned int dmz_reclaim_percentage(struct dmz_reclaim *zrc)
448 struct dmz_metadata *zmd = zrc->metadata;
456 nr_zones = dmz_nr_rnd_zones(zmd, zrc->dev_idx);
457 nr_unmap = dmz_nr_unmap_rnd_zones(zmd, zrc->dev_idx);
467 static bool dmz_should_reclaim(struct dmz_reclaim *zrc, unsigned int p_unmap)
471 nr_reclaim = dmz_nr_rnd_zones(zrc->metadata, zrc->dev_idx);
473 if (dmz_nr_cache_zones(zrc->metadata)) {
479 if (zrc->dev_idx == 0)
481 nr_reclaim += dmz_nr_cache_zones(zrc->metadata);
485 if (dmz_target_idle(zrc) && nr_reclaim)
504 struct dmz_reclaim *zrc = container_of(work, struct dmz_reclaim, work.work);
505 struct dmz_metadata *zmd = zrc->metadata;
512 p_unmap = dmz_reclaim_percentage(zrc);
513 if (!dmz_should_reclaim(zrc, p_unmap)) {
514 mod_delayed_work(zrc->wq, &zrc->work, DMZ_IDLE_PERIOD);
524 if (dmz_target_idle(zrc) || p_unmap < DMZ_RECLAIM_LOW_UNMAP_ZONES / 2) {
526 zrc->kc_throttle.throttle = 100;
529 zrc->kc_throttle.throttle = min(75U, 100U - p_unmap / 2);
533 dmz_metadata_label(zmd), zrc->dev_idx,
534 zrc->kc_throttle.throttle,
535 (dmz_target_idle(zrc) ? "Idle" : "Busy"),
538 dmz_nr_unmap_rnd_zones(zmd, zrc->dev_idx),
539 dmz_nr_rnd_zones(zmd, zrc->dev_idx));
541 ret = dmz_do_reclaim(zrc);
547 dmz_schedule_reclaim(zrc);
556 struct dmz_reclaim *zrc;
559 zrc = kzalloc(sizeof(struct dmz_reclaim), GFP_KERNEL);
560 if (!zrc)
563 zrc->metadata = zmd;
564 zrc->atime = jiffies;
565 zrc->dev_idx = idx;
568 zrc->kc = dm_kcopyd_client_create(&zrc->kc_throttle);
569 if (IS_ERR(zrc->kc)) {
570 ret = PTR_ERR(zrc->kc);
571 zrc->kc = NULL;
576 INIT_DELAYED_WORK(&zrc->work, dmz_reclaim_work);
577 zrc->wq = alloc_ordered_workqueue("dmz_rwq_%s_%d", WQ_MEM_RECLAIM,
579 if (!zrc->wq) {
584 *reclaim = zrc;
585 queue_delayed_work(zrc->wq, &zrc->work, 0);
589 if (zrc->kc)
590 dm_kcopyd_client_destroy(zrc->kc);
591 kfree(zrc);
599 void dmz_dtr_reclaim(struct dmz_reclaim *zrc)
601 cancel_delayed_work_sync(&zrc->work);
602 destroy_workqueue(zrc->wq);
603 dm_kcopyd_client_destroy(zrc->kc);
604 kfree(zrc);
610 void dmz_suspend_reclaim(struct dmz_reclaim *zrc)
612 cancel_delayed_work_sync(&zrc->work);
618 void dmz_resume_reclaim(struct dmz_reclaim *zrc)
620 queue_delayed_work(zrc->wq, &zrc->work, DMZ_IDLE_PERIOD);
626 void dmz_reclaim_bio_acc(struct dmz_reclaim *zrc)
628 zrc->atime = jiffies;
634 void dmz_schedule_reclaim(struct dmz_reclaim *zrc)
636 unsigned int p_unmap = dmz_reclaim_percentage(zrc);
638 if (dmz_should_reclaim(zrc, p_unmap))
639 mod_delayed_work(zrc->wq, &zrc->work, 0);