Lines Matching refs:ffe_ctl
3466 struct find_free_extent_ctl *ffe_ctl, in find_free_extent_clustered() argument
3470 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr; in find_free_extent_clustered()
3475 cluster_bg = btrfs_lock_cluster(bg, last_ptr, ffe_ctl->delalloc); in find_free_extent_clustered()
3479 !block_group_bits(cluster_bg, ffe_ctl->flags))) in find_free_extent_clustered()
3483 ffe_ctl->num_bytes, cluster_bg->start, in find_free_extent_clustered()
3484 &ffe_ctl->max_extent_size); in find_free_extent_clustered()
3488 trace_btrfs_reserve_extent_cluster(cluster_bg, ffe_ctl); in find_free_extent_clustered()
3490 ffe_ctl->found_offset = offset; in find_free_extent_clustered()
3507 if (ffe_ctl->loop >= LOOP_NO_EMPTY_SIZE && cluster_bg != bg) { in find_free_extent_clustered()
3509 btrfs_release_block_group(cluster_bg, ffe_ctl->delalloc); in find_free_extent_clustered()
3517 btrfs_release_block_group(cluster_bg, ffe_ctl->delalloc); in find_free_extent_clustered()
3520 if (ffe_ctl->loop >= LOOP_NO_EMPTY_SIZE) { in find_free_extent_clustered()
3526 ffe_ctl->empty_cluster + ffe_ctl->empty_size, in find_free_extent_clustered()
3528 ret = btrfs_find_space_cluster(bg, last_ptr, ffe_ctl->search_start, in find_free_extent_clustered()
3529 ffe_ctl->num_bytes, aligned_cluster); in find_free_extent_clustered()
3533 ffe_ctl->num_bytes, ffe_ctl->search_start, in find_free_extent_clustered()
3534 &ffe_ctl->max_extent_size); in find_free_extent_clustered()
3538 ffe_ctl->found_offset = offset; in find_free_extent_clustered()
3539 trace_btrfs_reserve_extent_cluster(bg, ffe_ctl); in find_free_extent_clustered()
3542 } else if (!ffe_ctl->cached && ffe_ctl->loop > LOOP_CACHING_NOWAIT && in find_free_extent_clustered()
3543 !ffe_ctl->retry_clustered) { in find_free_extent_clustered()
3546 ffe_ctl->retry_clustered = true; in find_free_extent_clustered()
3547 btrfs_wait_block_group_cache_progress(bg, ffe_ctl->num_bytes + in find_free_extent_clustered()
3548 ffe_ctl->empty_cluster + ffe_ctl->empty_size); in find_free_extent_clustered()
3567 struct find_free_extent_ctl *ffe_ctl) in find_free_extent_unclustered() argument
3569 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr; in find_free_extent_unclustered()
3582 if (ffe_ctl->cached) { in find_free_extent_unclustered()
3588 ffe_ctl->num_bytes + ffe_ctl->empty_cluster + in find_free_extent_unclustered()
3589 ffe_ctl->empty_size) { in find_free_extent_unclustered()
3590 ffe_ctl->total_free_space = max_t(u64, in find_free_extent_unclustered()
3591 ffe_ctl->total_free_space, in find_free_extent_unclustered()
3599 offset = btrfs_find_space_for_alloc(bg, ffe_ctl->search_start, in find_free_extent_unclustered()
3600 ffe_ctl->num_bytes, ffe_ctl->empty_size, in find_free_extent_unclustered()
3601 &ffe_ctl->max_extent_size); in find_free_extent_unclustered()
3612 if (!offset && !ffe_ctl->retry_unclustered && !ffe_ctl->cached && in find_free_extent_unclustered()
3613 ffe_ctl->loop > LOOP_CACHING_NOWAIT) { in find_free_extent_unclustered()
3614 btrfs_wait_block_group_cache_progress(bg, ffe_ctl->num_bytes + in find_free_extent_unclustered()
3615 ffe_ctl->empty_size); in find_free_extent_unclustered()
3616 ffe_ctl->retry_unclustered = true; in find_free_extent_unclustered()
3621 ffe_ctl->found_offset = offset; in find_free_extent_unclustered()
3626 struct find_free_extent_ctl *ffe_ctl, in do_allocation_clustered() argument
3632 if (ffe_ctl->last_ptr && ffe_ctl->use_cluster) { in do_allocation_clustered()
3633 ret = find_free_extent_clustered(block_group, ffe_ctl, bg_ret); in do_allocation_clustered()
3639 return find_free_extent_unclustered(block_group, ffe_ctl); in do_allocation_clustered()
3664 struct find_free_extent_ctl *ffe_ctl, in do_allocation_zoned() argument
3671 u64 num_bytes = ffe_ctl->num_bytes; in do_allocation_zoned()
3687 if (log_bytenr && ((ffe_ctl->for_treelog && bytenr != log_bytenr) || in do_allocation_zoned()
3688 (!ffe_ctl->for_treelog && bytenr == log_bytenr))) in do_allocation_zoned()
3701 ((ffe_ctl->for_data_reloc && bytenr != data_reloc_bytenr) || in do_allocation_zoned()
3702 (!ffe_ctl->for_data_reloc && bytenr == data_reloc_bytenr))) in do_allocation_zoned()
3735 ASSERT(!ffe_ctl->for_treelog || in do_allocation_zoned()
3738 ASSERT(!ffe_ctl->for_data_reloc || in do_allocation_zoned()
3752 if (ffe_ctl->for_treelog && !fs_info->treelog_bg && in do_allocation_zoned()
3762 if (ffe_ctl->for_data_reloc && !fs_info->data_reloc_bg && in do_allocation_zoned()
3771 if (ffe_ctl->max_extent_size < avail) { in do_allocation_zoned()
3776 ffe_ctl->max_extent_size = avail; in do_allocation_zoned()
3777 ffe_ctl->total_free_space = avail; in do_allocation_zoned()
3783 if (ffe_ctl->for_treelog && !fs_info->treelog_bg) in do_allocation_zoned()
3786 if (ffe_ctl->for_data_reloc && !fs_info->data_reloc_bg) in do_allocation_zoned()
3789 ffe_ctl->found_offset = start + block_group->alloc_offset; in do_allocation_zoned()
3800 ffe_ctl->search_start = ffe_ctl->found_offset; in do_allocation_zoned()
3803 if (ret && ffe_ctl->for_treelog) in do_allocation_zoned()
3805 if (ret && ffe_ctl->for_data_reloc && in do_allocation_zoned()
3831 struct find_free_extent_ctl *ffe_ctl, in do_allocation() argument
3834 switch (ffe_ctl->policy) { in do_allocation()
3836 return do_allocation_clustered(block_group, ffe_ctl, bg_ret); in do_allocation()
3838 return do_allocation_zoned(block_group, ffe_ctl, bg_ret); in do_allocation()
3845 struct find_free_extent_ctl *ffe_ctl, in release_block_group() argument
3848 switch (ffe_ctl->policy) { in release_block_group()
3850 ffe_ctl->retry_clustered = false; in release_block_group()
3851 ffe_ctl->retry_unclustered = false; in release_block_group()
3861 ffe_ctl->index); in release_block_group()
3865 static void found_extent_clustered(struct find_free_extent_ctl *ffe_ctl, in found_extent_clustered() argument
3868 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr; in found_extent_clustered()
3870 if (!ffe_ctl->use_cluster && last_ptr) { in found_extent_clustered()
3877 static void found_extent(struct find_free_extent_ctl *ffe_ctl, in found_extent() argument
3880 switch (ffe_ctl->policy) { in found_extent()
3882 found_extent_clustered(ffe_ctl, ins); in found_extent()
3893 struct find_free_extent_ctl *ffe_ctl) in can_allocate_chunk_zoned() argument
3896 if (btrfs_can_activate_zone(fs_info->fs_devices, ffe_ctl->flags)) in can_allocate_chunk_zoned()
3906 if (ffe_ctl->flags & BTRFS_BLOCK_GROUP_DATA) { in can_allocate_chunk_zoned()
3920 if (ffe_ctl->max_extent_size >= ffe_ctl->min_alloc_size) in can_allocate_chunk_zoned()
3930 if (ffe_ctl->flags & BTRFS_BLOCK_GROUP_DATA) in can_allocate_chunk_zoned()
3942 struct find_free_extent_ctl *ffe_ctl) in can_allocate_chunk() argument
3944 switch (ffe_ctl->policy) { in can_allocate_chunk()
3948 return can_allocate_chunk_zoned(fs_info, ffe_ctl); in can_allocate_chunk()
3961 struct find_free_extent_ctl *ffe_ctl, in find_free_extent_update_loop() argument
3967 if ((ffe_ctl->loop == LOOP_CACHING_NOWAIT) && in find_free_extent_update_loop()
3968 ffe_ctl->have_caching_bg && !ffe_ctl->orig_have_caching_bg) in find_free_extent_update_loop()
3969 ffe_ctl->orig_have_caching_bg = true; in find_free_extent_update_loop()
3972 found_extent(ffe_ctl, ins); in find_free_extent_update_loop()
3976 if (ffe_ctl->loop >= LOOP_CACHING_WAIT && ffe_ctl->have_caching_bg) in find_free_extent_update_loop()
3979 ffe_ctl->index++; in find_free_extent_update_loop()
3980 if (ffe_ctl->index < BTRFS_NR_RAID_TYPES) in find_free_extent_update_loop()
3992 if (ffe_ctl->loop < LOOP_NO_EMPTY_SIZE) { in find_free_extent_update_loop()
3993 ffe_ctl->index = 0; in find_free_extent_update_loop()
3999 if (ffe_ctl->loop == LOOP_CACHING_NOWAIT && in find_free_extent_update_loop()
4000 (!ffe_ctl->orig_have_caching_bg && full_search)) in find_free_extent_update_loop()
4001 ffe_ctl->loop++; in find_free_extent_update_loop()
4002 ffe_ctl->loop++; in find_free_extent_update_loop()
4004 if (ffe_ctl->loop == LOOP_ALLOC_CHUNK) { in find_free_extent_update_loop()
4009 ret = can_allocate_chunk(fs_info, ffe_ctl); in find_free_extent_update_loop()
4024 ret = btrfs_chunk_alloc(trans, ffe_ctl->flags, in find_free_extent_update_loop()
4030 ffe_ctl->loop++; in find_free_extent_update_loop()
4042 if (ffe_ctl->loop == LOOP_NO_EMPTY_SIZE) { in find_free_extent_update_loop()
4043 if (ffe_ctl->policy != BTRFS_EXTENT_ALLOC_CLUSTERED) in find_free_extent_update_loop()
4050 if (ffe_ctl->empty_size == 0 && in find_free_extent_update_loop()
4051 ffe_ctl->empty_cluster == 0) in find_free_extent_update_loop()
4053 ffe_ctl->empty_size = 0; in find_free_extent_update_loop()
4054 ffe_ctl->empty_cluster = 0; in find_free_extent_update_loop()
4061 static bool find_free_extent_check_size_class(struct find_free_extent_ctl *ffe_ctl, in find_free_extent_check_size_class() argument
4064 if (ffe_ctl->policy == BTRFS_EXTENT_ALLOC_ZONED) in find_free_extent_check_size_class()
4068 if (ffe_ctl->loop >= LOOP_WRONG_SIZE_CLASS) in find_free_extent_check_size_class()
4070 if (ffe_ctl->loop >= LOOP_UNSET_SIZE_CLASS && in find_free_extent_check_size_class()
4073 return ffe_ctl->size_class == bg->size_class; in find_free_extent_check_size_class()
4077 struct find_free_extent_ctl *ffe_ctl, in prepare_allocation_clustered() argument
4094 ffe_ctl->num_bytes > space_info->max_extent_size) { in prepare_allocation_clustered()
4099 ffe_ctl->use_cluster = false; in prepare_allocation_clustered()
4104 ffe_ctl->last_ptr = fetch_cluster_info(fs_info, space_info, in prepare_allocation_clustered()
4105 &ffe_ctl->empty_cluster); in prepare_allocation_clustered()
4106 if (ffe_ctl->last_ptr) { in prepare_allocation_clustered()
4107 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr; in prepare_allocation_clustered()
4111 ffe_ctl->hint_byte = last_ptr->window_start; in prepare_allocation_clustered()
4118 ffe_ctl->hint_byte = last_ptr->window_start; in prepare_allocation_clustered()
4119 ffe_ctl->use_cluster = false; in prepare_allocation_clustered()
4128 struct find_free_extent_ctl *ffe_ctl, in prepare_allocation() argument
4132 switch (ffe_ctl->policy) { in prepare_allocation()
4134 return prepare_allocation_clustered(fs_info, ffe_ctl, in prepare_allocation()
4137 if (ffe_ctl->for_treelog) { in prepare_allocation()
4140 ffe_ctl->hint_byte = fs_info->treelog_bg; in prepare_allocation()
4143 if (ffe_ctl->for_data_reloc) { in prepare_allocation()
4146 ffe_ctl->hint_byte = fs_info->data_reloc_bg; in prepare_allocation()
4182 struct find_free_extent_ctl *ffe_ctl) in find_free_extent() argument
4191 WARN_ON(ffe_ctl->num_bytes < fs_info->sectorsize); in find_free_extent()
4193 ffe_ctl->search_start = 0; in find_free_extent()
4195 ffe_ctl->empty_cluster = 0; in find_free_extent()
4196 ffe_ctl->last_ptr = NULL; in find_free_extent()
4197 ffe_ctl->use_cluster = true; in find_free_extent()
4198 ffe_ctl->have_caching_bg = false; in find_free_extent()
4199 ffe_ctl->orig_have_caching_bg = false; in find_free_extent()
4200 ffe_ctl->index = btrfs_bg_flags_to_raid_index(ffe_ctl->flags); in find_free_extent()
4201 ffe_ctl->loop = 0; in find_free_extent()
4203 ffe_ctl->retry_clustered = false; in find_free_extent()
4204 ffe_ctl->retry_unclustered = false; in find_free_extent()
4205 ffe_ctl->cached = 0; in find_free_extent()
4206 ffe_ctl->max_extent_size = 0; in find_free_extent()
4207 ffe_ctl->total_free_space = 0; in find_free_extent()
4208 ffe_ctl->found_offset = 0; in find_free_extent()
4209 ffe_ctl->policy = BTRFS_EXTENT_ALLOC_CLUSTERED; in find_free_extent()
4210 ffe_ctl->size_class = btrfs_calc_block_group_size_class(ffe_ctl->num_bytes); in find_free_extent()
4213 ffe_ctl->policy = BTRFS_EXTENT_ALLOC_ZONED; in find_free_extent()
4219 trace_find_free_extent(root, ffe_ctl); in find_free_extent()
4221 space_info = btrfs_find_space_info(fs_info, ffe_ctl->flags); in find_free_extent()
4223 btrfs_err(fs_info, "No space info for %llu", ffe_ctl->flags); in find_free_extent()
4227 ret = prepare_allocation(fs_info, ffe_ctl, space_info, ins); in find_free_extent()
4231 ffe_ctl->search_start = max(ffe_ctl->search_start, in find_free_extent()
4233 ffe_ctl->search_start = max(ffe_ctl->search_start, ffe_ctl->hint_byte); in find_free_extent()
4234 if (ffe_ctl->search_start == ffe_ctl->hint_byte) { in find_free_extent()
4236 ffe_ctl->search_start); in find_free_extent()
4244 if (block_group && block_group_bits(block_group, ffe_ctl->flags) && in find_free_extent()
4258 ffe_ctl->index = btrfs_bg_flags_to_raid_index( in find_free_extent()
4261 ffe_ctl->delalloc); in find_free_extent()
4262 ffe_ctl->hinted = true; in find_free_extent()
4270 trace_find_free_extent_search_loop(root, ffe_ctl); in find_free_extent()
4271 ffe_ctl->have_caching_bg = false; in find_free_extent()
4272 if (ffe_ctl->index == btrfs_bg_flags_to_raid_index(ffe_ctl->flags) || in find_free_extent()
4273 ffe_ctl->index == 0) in find_free_extent()
4277 &space_info->block_groups[ffe_ctl->index], list) { in find_free_extent()
4280 ffe_ctl->hinted = false; in find_free_extent()
4283 if (ffe_ctl->for_treelog) in find_free_extent()
4285 if (ffe_ctl->for_data_reloc) in find_free_extent()
4290 btrfs_grab_block_group(block_group, ffe_ctl->delalloc); in find_free_extent()
4291 ffe_ctl->search_start = block_group->start; in find_free_extent()
4298 if (!block_group_bits(block_group, ffe_ctl->flags)) { in find_free_extent()
4309 if ((ffe_ctl->flags & extra) && !(block_group->flags & extra)) in find_free_extent()
4317 btrfs_release_block_group(block_group, ffe_ctl->delalloc); in find_free_extent()
4322 trace_find_free_extent_have_block_group(root, ffe_ctl, block_group); in find_free_extent()
4323 ffe_ctl->cached = btrfs_block_group_done(block_group); in find_free_extent()
4324 if (unlikely(!ffe_ctl->cached)) { in find_free_extent()
4325 ffe_ctl->have_caching_bg = true; in find_free_extent()
4347 if (!find_free_extent_check_size_class(ffe_ctl, block_group)) in find_free_extent()
4351 ret = do_allocation(block_group, ffe_ctl, &bg_ret); in find_free_extent()
4355 ffe_ctl->delalloc); in find_free_extent()
4365 ffe_ctl->search_start = round_up(ffe_ctl->found_offset, in find_free_extent()
4369 if (ffe_ctl->search_start + ffe_ctl->num_bytes > in find_free_extent()
4372 ffe_ctl->found_offset, in find_free_extent()
4373 ffe_ctl->num_bytes); in find_free_extent()
4377 if (ffe_ctl->found_offset < ffe_ctl->search_start) in find_free_extent()
4379 ffe_ctl->found_offset, in find_free_extent()
4380 ffe_ctl->search_start - ffe_ctl->found_offset); in find_free_extent()
4382 ret = btrfs_add_reserved_bytes(block_group, ffe_ctl->ram_bytes, in find_free_extent()
4383 ffe_ctl->num_bytes, in find_free_extent()
4384 ffe_ctl->delalloc, in find_free_extent()
4385 ffe_ctl->loop >= LOOP_WRONG_SIZE_CLASS); in find_free_extent()
4388 ffe_ctl->found_offset, in find_free_extent()
4389 ffe_ctl->num_bytes); in find_free_extent()
4395 ins->objectid = ffe_ctl->search_start; in find_free_extent()
4396 ins->offset = ffe_ctl->num_bytes; in find_free_extent()
4398 trace_btrfs_reserve_extent(block_group, ffe_ctl); in find_free_extent()
4399 btrfs_release_block_group(block_group, ffe_ctl->delalloc); in find_free_extent()
4402 release_block_group(block_group, ffe_ctl, ffe_ctl->delalloc); in find_free_extent()
4407 ret = find_free_extent_update_loop(fs_info, ins, ffe_ctl, full_search); in find_free_extent()
4416 if (!ffe_ctl->max_extent_size) in find_free_extent()
4417 ffe_ctl->max_extent_size = ffe_ctl->total_free_space; in find_free_extent()
4419 space_info->max_extent_size = ffe_ctl->max_extent_size; in find_free_extent()
4421 ins->offset = ffe_ctl->max_extent_size; in find_free_extent()
4479 struct find_free_extent_ctl ffe_ctl = {}; in btrfs_reserve_extent() local
4490 ffe_ctl.ram_bytes = ram_bytes; in btrfs_reserve_extent()
4491 ffe_ctl.num_bytes = num_bytes; in btrfs_reserve_extent()
4492 ffe_ctl.min_alloc_size = min_alloc_size; in btrfs_reserve_extent()
4493 ffe_ctl.empty_size = empty_size; in btrfs_reserve_extent()
4494 ffe_ctl.flags = flags; in btrfs_reserve_extent()
4495 ffe_ctl.delalloc = delalloc; in btrfs_reserve_extent()
4496 ffe_ctl.hint_byte = hint_byte; in btrfs_reserve_extent()
4497 ffe_ctl.for_treelog = for_treelog; in btrfs_reserve_extent()
4498 ffe_ctl.for_data_reloc = for_data_reloc; in btrfs_reserve_extent()
4500 ret = find_free_extent(root, ins, &ffe_ctl); in btrfs_reserve_extent()