Lines Matching defs:discard_ctl

71 static struct list_head *get_discard_list(struct btrfs_discard_ctl *discard_ctl,
74 return &discard_ctl->discard_list[block_group->discard_index];
77 static void __add_to_discard_list(struct btrfs_discard_ctl *discard_ctl,
80 if (!btrfs_run_discard_work(discard_ctl))
93 get_discard_list(discard_ctl, block_group));
96 static void add_to_discard_list(struct btrfs_discard_ctl *discard_ctl,
102 spin_lock(&discard_ctl->lock);
103 __add_to_discard_list(discard_ctl, block_group);
104 spin_unlock(&discard_ctl->lock);
107 static void add_to_discard_unused_list(struct btrfs_discard_ctl *discard_ctl,
110 spin_lock(&discard_ctl->lock);
112 if (!btrfs_run_discard_work(discard_ctl)) {
113 spin_unlock(&discard_ctl->lock);
124 &discard_ctl->discard_list[BTRFS_DISCARD_INDEX_UNUSED]);
126 spin_unlock(&discard_ctl->lock);
129 static bool remove_from_discard_list(struct btrfs_discard_ctl *discard_ctl,
134 spin_lock(&discard_ctl->lock);
136 if (block_group == discard_ctl->block_group) {
138 discard_ctl->block_group = NULL;
144 spin_unlock(&discard_ctl->lock);
151 * @discard_ctl: discard control
158 struct btrfs_discard_ctl *discard_ctl,
165 struct list_head *discard_list = &discard_ctl->discard_list[i];
189 * @discard_ctl: discard control
200 struct btrfs_discard_ctl *discard_ctl,
206 spin_lock(&discard_ctl->lock);
208 block_group = find_next_block_group(discard_ctl, now);
214 __add_to_discard_list(discard_ctl, block_group);
223 discard_ctl->block_group = block_group;
229 spin_unlock(&discard_ctl->lock);
247 struct btrfs_discard_ctl *discard_ctl;
253 discard_ctl = &block_group->fs_info->discard_ctl;
259 remove_from_discard_list(discard_ctl, block_group);
265 add_to_discard_list(discard_ctl, block_group);
274 * @discard_ctl: discard control
280 static void btrfs_update_discard_index(struct btrfs_discard_ctl *discard_ctl,
289 add_to_discard_list(discard_ctl, block_group);
294 * @discard_ctl: discard control
300 void btrfs_discard_cancel_work(struct btrfs_discard_ctl *discard_ctl,
303 if (remove_from_discard_list(discard_ctl, block_group)) {
304 cancel_delayed_work_sync(&discard_ctl->work);
305 btrfs_discard_schedule_work(discard_ctl, true);
311 * @discard_ctl: discard control
316 void btrfs_discard_queue_work(struct btrfs_discard_ctl *discard_ctl,
323 add_to_discard_unused_list(discard_ctl, block_group);
325 add_to_discard_list(discard_ctl, block_group);
327 if (!delayed_work_pending(&discard_ctl->work))
328 btrfs_discard_schedule_work(discard_ctl, false);
331 static void __btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl,
336 if (!btrfs_run_discard_work(discard_ctl))
338 if (!override && delayed_work_pending(&discard_ctl->work))
341 block_group = find_next_block_group(discard_ctl, now);
343 unsigned long delay = discard_ctl->delay;
344 u32 kbps_limit = READ_ONCE(discard_ctl->kbps_limit);
351 if (kbps_limit && discard_ctl->prev_discard) {
353 u64 bps_delay = div64_u64(discard_ctl->prev_discard *
369 mod_delayed_work(discard_ctl->discard_workers,
370 &discard_ctl->work, delay);
376 * @discard_ctl: discard control
383 void btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl,
388 spin_lock(&discard_ctl->lock);
389 __btrfs_discard_schedule_work(discard_ctl, now, override);
390 spin_unlock(&discard_ctl->lock);
395 * @discard_ctl: discard control
403 static void btrfs_finish_discard_pass(struct btrfs_discard_ctl *discard_ctl,
406 remove_from_discard_list(discard_ctl, block_group);
412 add_to_discard_unused_list(discard_ctl, block_group);
414 btrfs_update_discard_index(discard_ctl, block_group);
428 struct btrfs_discard_ctl *discard_ctl;
436 discard_ctl = container_of(work, struct btrfs_discard_ctl, work.work);
438 block_group = peek_discard_list(discard_ctl, &discard_state,
440 if (!block_group || !btrfs_run_discard_work(discard_ctl))
443 btrfs_discard_schedule_work(discard_ctl, false);
466 discard_ctl->discard_bitmap_bytes += trimmed;
472 discard_ctl->discard_extent_bytes += trimmed;
475 discard_ctl->prev_discard = trimmed;
480 btrfs_finish_discard_pass(discard_ctl, block_group);
483 spin_lock(&discard_ctl->lock);
488 spin_unlock(&discard_ctl->lock);
492 spin_lock(&discard_ctl->lock);
493 discard_ctl->block_group = NULL;
494 __btrfs_discard_schedule_work(discard_ctl, now, false);
495 spin_unlock(&discard_ctl->lock);
500 * @discard_ctl: discard control
504 bool btrfs_run_discard_work(struct btrfs_discard_ctl *discard_ctl)
506 struct btrfs_fs_info *fs_info = container_of(discard_ctl,
508 discard_ctl);
516 * @discard_ctl: discard control
522 void btrfs_discard_calc_delay(struct btrfs_discard_ctl *discard_ctl)
530 discardable_extents = atomic_read(&discard_ctl->discardable_extents);
534 spin_lock(&discard_ctl->lock);
545 &discard_ctl->discardable_extents);
547 discardable_bytes = atomic64_read(&discard_ctl->discardable_bytes);
550 &discard_ctl->discardable_bytes);
553 spin_unlock(&discard_ctl->lock);
557 iops_limit = READ_ONCE(discard_ctl->iops_limit);
564 discard_ctl->delay = msecs_to_jiffies(delay);
566 spin_unlock(&discard_ctl->lock);
574 * This propagates deltas of counters up to the discard_ctl. It maintains a
581 struct btrfs_discard_ctl *discard_ctl;
590 discard_ctl = &block_group->fs_info->discard_ctl;
595 atomic_add(extents_delta, &discard_ctl->discardable_extents);
603 atomic64_add(bytes_delta, &discard_ctl->discardable_bytes);
629 btrfs_discard_queue_work(&fs_info->discard_ctl, block_group);
636 * @discard_ctl: discard control
644 static void btrfs_discard_purge_list(struct btrfs_discard_ctl *discard_ctl)
649 spin_lock(&discard_ctl->lock);
652 &discard_ctl->discard_list[i],
655 spin_unlock(&discard_ctl->lock);
658 spin_lock(&discard_ctl->lock);
661 spin_unlock(&discard_ctl->lock);
683 struct btrfs_discard_ctl *discard_ctl = &fs_info->discard_ctl;
686 spin_lock_init(&discard_ctl->lock);
687 INIT_DELAYED_WORK(&discard_ctl->work, btrfs_discard_workfn);
690 INIT_LIST_HEAD(&discard_ctl->discard_list[i]);
692 discard_ctl->prev_discard = 0;
693 atomic_set(&discard_ctl->discardable_extents, 0);
694 atomic64_set(&discard_ctl->discardable_bytes, 0);
695 discard_ctl->max_discard_size = BTRFS_ASYNC_DISCARD_DEFAULT_MAX_SIZE;
696 discard_ctl->delay = BTRFS_DISCARD_MAX_DELAY_MSEC;
697 discard_ctl->iops_limit = BTRFS_DISCARD_MAX_IOPS;
698 discard_ctl->kbps_limit = 0;
699 discard_ctl->discard_extent_bytes = 0;
700 discard_ctl->discard_bitmap_bytes = 0;
701 atomic64_set(&discard_ctl->discard_bytes_saved, 0);
707 cancel_delayed_work_sync(&fs_info->discard_ctl.work);
708 btrfs_discard_purge_list(&fs_info->discard_ctl);