From: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
To: Josef Bacik <jbacik@fb.com>, <linux-btrfs@vger.kernel.org>
Cc: <dsterba@suse.cz>
Subject: Re: [PATCH 1/2] btrfs: try to satisfy metadata requests when every flush_space() returns
Date: Mon, 10 Oct 2016 16:58:13 +0800 [thread overview]
Message-ID: <57FB5825.6010407@cn.fujitsu.com> (raw)
In-Reply-To: <64702aa8-206f-d167-a4c7-0303864a1e23@fb.com>
hi,
On 10/07/2016 09:16 PM, Josef Bacik wrote:
> On 09/21/2016 02:59 AM, Wang Xiaoguang wrote:
>> In flush_space()->shrink_delalloc(), if can_overcommit() returns true,
>> though no bytes added to space_info, we still may satisfy some requests.
>>
>> Signed-off-by: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
>> ---
>> fs/btrfs/extent-tree.c | 39 +++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 39 insertions(+)
>>
>> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
>> index 38c2df8..fdfc97f 100644
>> --- a/fs/btrfs/extent-tree.c
>> +++ b/fs/btrfs/extent-tree.c
>> @@ -4960,6 +4960,43 @@ static void wake_all_tickets(struct list_head
>> *head)
>> }
>>
>> /*
>> + * This function must be protected by btrfs_space_info's lock.
>> + */
>> +static void try_to_wake_tickets(struct btrfs_root *root,
>> + struct btrfs_space_info *space_info)
>> +{
>> + struct reserve_ticket *ticket;
>> + struct list_head *head = &space_info->priority_tickets;
>> + enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_NO_FLUSH;
>> + u64 used;
>> +
>> +again:
>> + while (!list_empty(head)) {
>> + ticket = list_first_entry(head, struct reserve_ticket,
>> + list);
>> + used = space_info->bytes_used +
>> + space_info->bytes_reserved + space_info->bytes_pinned +
>> + space_info->bytes_readonly + space_info->bytes_may_use;
>> +
>> + if (used + ticket->bytes <= space_info->total_bytes ||
>> + can_overcommit(root, space_info, ticket->bytes, flush)) {
>> + space_info->bytes_may_use += ticket->bytes;
>> + list_del_init(&ticket->list);
>> + ticket->bytes = 0;
>> + space_info->tickets_id++;
>> + wake_up(&ticket->wait);
>> + } else
>> + return;
>> + }
>> +
>> + if (head == &space_info->priority_tickets) {
>> + head = &space_info->tickets;
>> + flush = BTRFS_RESERVE_FLUSH_ALL;
>> + goto again;
>> + }
>> +}
>> +
>> +/*
>> * This is for normal flushers, we can wait all goddamned day if we
>> want to. We
>> * will loop and continuously try to flush as long as we are making
>> progress.
>> * We count progress as clearing off tickets each time we have to loop.
>> @@ -4995,6 +5032,8 @@ static void
>> btrfs_async_reclaim_metadata_space(struct work_struct *work)
>> ret = flush_space(fs_info->fs_root, space_info, to_reclaim,
>> to_reclaim, flush_state);
>> spin_lock(&space_info->lock);
>> + if (!ret)
>> + try_to_wake_tickets(fs_info->fs_root, space_info);
>> if (list_empty(&space_info->tickets)) {
>> space_info->flush = 0;
>> spin_unlock(&space_info->lock);
>>
>
> So first off I have no problems with this patch, it seems reasonable
> to me.
>
> However I'm curious to see where it helped. The only time
> can_overcommit() would suddenly start returning true where it wouldn't
> have before without actually adding space to the space_info would be
> when we've dropped an empty block group (or added a new drive) and
> suddenly fs_info->free_chunk_space is larger than it was. Is that
> what you were observing? Thanks,
Indeed, I'm not sure :)
I just found can_overcommit() sometimes can help, I'll run some tests
and inform you what's happening later.
Regards,
Xiaoguang Wang
>
> Josef
>
>
next prev parent reply other threads:[~2016-10-10 9:04 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-21 6:59 [PATCH 1/2] btrfs: try to satisfy metadata requests when every flush_space() returns Wang Xiaoguang
2016-09-21 6:59 ` [PATCH 2/2] btrfs: try to write enough delalloc bytes when reclaiming metadata space Wang Xiaoguang
2016-09-22 9:25 ` [RFC 3/3] btrfs: make shrink_delalloc() try harder to reclaim " Wang Xiaoguang
2016-10-07 6:27 ` Wang Xiaoguang
2016-10-07 13:24 ` Josef Bacik
2016-10-10 8:54 ` Wang Xiaoguang
2016-10-07 13:17 ` [PATCH 2/2] btrfs: try to write enough delalloc bytes when reclaiming " Josef Bacik
2016-10-07 13:16 ` [PATCH 1/2] btrfs: try to satisfy metadata requests when every flush_space() returns Josef Bacik
2016-10-10 8:58 ` Wang Xiaoguang [this message]
2016-10-12 7:27 ` Wang Xiaoguang
2016-10-12 17:08 ` Josef Bacik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=57FB5825.6010407@cn.fujitsu.com \
--to=wangxg.fnst@cn.fujitsu.com \
--cc=dsterba@suse.cz \
--cc=jbacik@fb.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.