btrfs: refactor the ticket wakeup code
Now that btrfs_space_info_add_old_bytes simply checks if we can make the reservation and updates bytes_may_use, there's no reason to have both helpers in place. Factor out the ticket wakeup logic into it's own helper, make btrfs_space_info_add_old_bytes() update bytes_may_use and then call the wakeup helper, and replace all calls to btrfs_space_info_add_new_bytes() with the wakeup helper. Reviewed-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
9118264507
commit
18fa2284aa
|
@ -2866,8 +2866,8 @@ static int unpin_extent_range(struct btrfs_fs_info *fs_info,
|
|||
spin_unlock(&global_rsv->lock);
|
||||
/* Add to any tickets we may have */
|
||||
if (len)
|
||||
btrfs_space_info_add_new_bytes(fs_info,
|
||||
space_info, len);
|
||||
btrfs_try_granting_tickets(fs_info,
|
||||
space_info);
|
||||
}
|
||||
spin_unlock(&space_info->lock);
|
||||
}
|
||||
|
|
|
@ -131,9 +131,7 @@ void btrfs_update_space_info(struct btrfs_fs_info *info, u64 flags,
|
|||
found->bytes_readonly += bytes_readonly;
|
||||
if (total_bytes > 0)
|
||||
found->full = 0;
|
||||
btrfs_space_info_add_new_bytes(info, found,
|
||||
total_bytes - bytes_used -
|
||||
bytes_readonly);
|
||||
btrfs_try_granting_tickets(info, found);
|
||||
spin_unlock(&found->lock);
|
||||
*space_info = found;
|
||||
}
|
||||
|
@ -229,17 +227,15 @@ static int can_overcommit(struct btrfs_fs_info *fs_info,
|
|||
* This is for space we already have accounted in space_info->bytes_may_use, so
|
||||
* basically when we're returning space from block_rsv's.
|
||||
*/
|
||||
void btrfs_space_info_add_old_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes)
|
||||
void btrfs_try_granting_tickets(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info)
|
||||
{
|
||||
struct list_head *head;
|
||||
enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_NO_FLUSH;
|
||||
|
||||
spin_lock(&space_info->lock);
|
||||
head = &space_info->priority_tickets;
|
||||
btrfs_space_info_update_bytes_may_use(fs_info, space_info, -num_bytes);
|
||||
lockdep_assert_held(&space_info->lock);
|
||||
|
||||
head = &space_info->priority_tickets;
|
||||
again:
|
||||
while (!list_empty(head)) {
|
||||
struct reserve_ticket *ticket;
|
||||
|
@ -268,47 +264,6 @@ void btrfs_space_info_add_old_bytes(struct btrfs_fs_info *fs_info,
|
|||
flush = BTRFS_RESERVE_FLUSH_ALL;
|
||||
goto again;
|
||||
}
|
||||
spin_unlock(&space_info->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is for newly allocated space that isn't accounted in
|
||||
* space_info->bytes_may_use yet. So if we allocate a chunk or unpin an extent
|
||||
* we use this helper.
|
||||
*/
|
||||
void btrfs_space_info_add_new_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes)
|
||||
{
|
||||
struct reserve_ticket *ticket;
|
||||
struct list_head *head = &space_info->priority_tickets;
|
||||
|
||||
again:
|
||||
while (!list_empty(head) && num_bytes) {
|
||||
ticket = list_first_entry(head, struct reserve_ticket,
|
||||
list);
|
||||
if (num_bytes >= ticket->bytes) {
|
||||
list_del_init(&ticket->list);
|
||||
num_bytes -= ticket->bytes;
|
||||
btrfs_space_info_update_bytes_may_use(fs_info,
|
||||
space_info,
|
||||
ticket->bytes);
|
||||
ticket->bytes = 0;
|
||||
space_info->tickets_id++;
|
||||
wake_up(&ticket->wait);
|
||||
} else {
|
||||
btrfs_space_info_update_bytes_may_use(fs_info,
|
||||
space_info,
|
||||
num_bytes);
|
||||
ticket->bytes -= num_bytes;
|
||||
num_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_bytes && head == &space_info->priority_tickets) {
|
||||
head = &space_info->tickets;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
|
||||
#define DUMP_BLOCK_RSV(fs_info, rsv_name) \
|
||||
|
|
|
@ -110,12 +110,6 @@ btrfs_space_info_update_##name(struct btrfs_fs_info *fs_info, \
|
|||
DECLARE_SPACE_INFO_UPDATE(bytes_may_use, "space_info");
|
||||
DECLARE_SPACE_INFO_UPDATE(bytes_pinned, "pinned");
|
||||
|
||||
void btrfs_space_info_add_new_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes);
|
||||
void btrfs_space_info_add_old_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes);
|
||||
int btrfs_init_space_info(struct btrfs_fs_info *fs_info);
|
||||
void btrfs_update_space_info(struct btrfs_fs_info *info, u64 flags,
|
||||
u64 total_bytes, u64 bytes_used,
|
||||
|
@ -133,5 +127,18 @@ int btrfs_reserve_metadata_bytes(struct btrfs_root *root,
|
|||
struct btrfs_block_rsv *block_rsv,
|
||||
u64 orig_bytes,
|
||||
enum btrfs_reserve_flush_enum flush);
|
||||
void btrfs_try_granting_tickets(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info);
|
||||
|
||||
static inline void btrfs_space_info_add_old_bytes(
|
||||
struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes)
|
||||
{
|
||||
spin_lock(&space_info->lock);
|
||||
btrfs_space_info_update_bytes_may_use(fs_info, space_info, -num_bytes);
|
||||
btrfs_try_granting_tickets(fs_info, space_info);
|
||||
spin_unlock(&space_info->lock);
|
||||
}
|
||||
|
||||
#endif /* BTRFS_SPACE_INFO_H */
|
||||
|
|
Loading…
Reference in New Issue