linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Nikolay Borisov <nborisov@suse.com>
To: Josef Bacik <josef@toxicpanda.com>,
	linux-btrfs@vger.kernel.org, kernel-team@fb.com
Subject: Re: [PATCH 6/6] btrfs: fix truncate throttling
Date: Mon, 26 Nov 2018 11:44:30 +0200	[thread overview]
Message-ID: <c37d25d1-bdfd-3c76-ff04-f90126e1c53e@suse.com> (raw)
In-Reply-To: <20181121185912.24288-7-josef@toxicpanda.com>



On 21.11.18 г. 20:59 ч., Josef Bacik wrote:
> We have a bunch of magic to make sure we're throttling delayed refs when
> truncating a file.  Now that we have a delayed refs rsv and a mechanism
> for refilling that reserve simply use that instead of all of this magic.
> 
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>

Reviewed-by: Nikolay Borisov <nborisov@suse.com>

> ---
>  fs/btrfs/inode.c | 79 ++++++++++++--------------------------------------------
>  1 file changed, 17 insertions(+), 62 deletions(-)
> 
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 8532a2eb56d1..cae30f6c095f 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -4437,31 +4437,6 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
>  	return err;
>  }
>  
> -static int truncate_space_check(struct btrfs_trans_handle *trans,
> -				struct btrfs_root *root,
> -				u64 bytes_deleted)
> -{
> -	struct btrfs_fs_info *fs_info = root->fs_info;
> -	int ret;
> -
> -	/*
> -	 * This is only used to apply pressure to the enospc system, we don't
> -	 * intend to use this reservation at all.
> -	 */
> -	bytes_deleted = btrfs_csum_bytes_to_leaves(fs_info, bytes_deleted);
> -	bytes_deleted *= fs_info->nodesize;
> -	ret = btrfs_block_rsv_add(root, &fs_info->trans_block_rsv,
> -				  bytes_deleted, BTRFS_RESERVE_NO_FLUSH);
> -	if (!ret) {
> -		trace_btrfs_space_reservation(fs_info, "transaction",
> -					      trans->transid,
> -					      bytes_deleted, 1);
> -		trans->bytes_reserved += bytes_deleted;
> -	}
> -	return ret;
> -
> -}
> -
>  /*
>   * Return this if we need to call truncate_block for the last bit of the
>   * truncate.
> @@ -4506,7 +4481,6 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
>  	u64 bytes_deleted = 0;
>  	bool be_nice = false;
>  	bool should_throttle = false;
> -	bool should_end = false;
>  
>  	BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY);
>  
> @@ -4719,15 +4693,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
>  				btrfs_abort_transaction(trans, ret);
>  				break;
>  			}
> -			if (btrfs_should_throttle_delayed_refs(trans))
> -				btrfs_async_run_delayed_refs(fs_info,
> -					trans->delayed_ref_updates * 2,
> -					trans->transid, 0);
>  			if (be_nice) {
> -				if (truncate_space_check(trans, root,
> -							 extent_num_bytes)) {
> -					should_end = true;
> -				}
>  				if (btrfs_should_throttle_delayed_refs(trans))
>  					should_throttle = true;
>  			}
> @@ -4738,7 +4704,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
>  
>  		if (path->slots[0] == 0 ||
>  		    path->slots[0] != pending_del_slot ||
> -		    should_throttle || should_end) {
> +		    should_throttle) {
>  			if (pending_del_nr) {
>  				ret = btrfs_del_items(trans, root, path,
>  						pending_del_slot,
> @@ -4750,23 +4716,24 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
>  				pending_del_nr = 0;
>  			}
>  			btrfs_release_path(path);
> -			if (should_throttle) {
> -				unsigned long updates = trans->delayed_ref_updates;
> -				if (updates) {
> -					trans->delayed_ref_updates = 0;
> -					ret = btrfs_run_delayed_refs(trans,
> -								   updates * 2);
> -					if (ret)
> -						break;
> -				}
> -			}
> +
>  			/*
> -			 * if we failed to refill our space rsv, bail out
> -			 * and let the transaction restart
> +			 * We can generate a lot of delayed refs, so we need to
> +			 * throttle every once and a while and make sure we're
> +			 * adding enough space to keep up with the work we are
> +			 * generating.  Since we hold a transaction here we
> +			 * can't flush, and we don't want to FLUSH_LIMIT because
> +			 * we could have generated too many delayed refs to
> +			 * actually allocate, so just bail if we're short and
> +			 * let the normal reservation dance happen higher up.
>  			 */
> -			if (should_end) {
> -				ret = -EAGAIN;
> -				break;
> +			if (should_throttle) {
> +				ret = btrfs_throttle_delayed_refs(fs_info,
> +							BTRFS_RESERVE_NO_FLUSH);
> +				if (ret) {
> +					ret = -EAGAIN;
> +					break;
> +				}
>  			}
>  			goto search_again;
>  		} else {
> @@ -4792,18 +4759,6 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
>  	}
>  
>  	btrfs_free_path(path);
> -
> -	if (be_nice && bytes_deleted > SZ_32M && (ret >= 0 || ret == -EAGAIN)) {
> -		unsigned long updates = trans->delayed_ref_updates;
> -		int err;
> -
> -		if (updates) {
> -			trans->delayed_ref_updates = 0;
> -			err = btrfs_run_delayed_refs(trans, updates * 2);
> -			if (err)
> -				ret = err;
> -		}
> -	}
>  	return ret;
>  }
>  
> 

  reply	other threads:[~2018-11-26  9:44 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-21 18:59 [PATCH 0/6] Delayed refs rsv Josef Bacik
2018-11-21 18:59 ` [PATCH 1/6] btrfs: add btrfs_delete_ref_head helper Josef Bacik
2018-11-22  9:12   ` Nikolay Borisov
2018-11-22  9:42     ` Nikolay Borisov
2018-11-23 13:45       ` David Sterba
2018-11-23 13:50         ` Nikolay Borisov
2018-11-21 18:59 ` [PATCH 2/6] btrfs: add cleanup_ref_head_accounting helper Josef Bacik
2018-11-22  1:06   ` Qu Wenruo
2018-11-23 13:51     ` David Sterba
2018-11-21 18:59 ` [PATCH 3/6] btrfs: cleanup extent_op handling Josef Bacik
2018-11-22  8:56   ` Lu Fengqi
2018-11-22 10:09   ` Nikolay Borisov
2018-11-27 15:39     ` Josef Bacik
2018-11-23 15:05   ` David Sterba
2018-11-21 18:59 ` [PATCH 4/6] btrfs: only track ref_heads in delayed_ref_updates Josef Bacik
2018-11-22 10:19   ` Nikolay Borisov
2018-11-21 18:59 ` [PATCH 5/6] btrfs: introduce delayed_refs_rsv Josef Bacik
2018-11-26  9:14   ` Nikolay Borisov
2018-11-27 15:38     ` David Sterba
2018-11-27 19:11     ` Josef Bacik
2018-11-21 18:59 ` [PATCH 6/6] btrfs: fix truncate throttling Josef Bacik
2018-11-26  9:44   ` Nikolay Borisov [this message]
2018-11-23 15:55 ` [PATCH 0/6] Delayed refs rsv David Sterba

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=c37d25d1-bdfd-3c76-ff04-f90126e1c53e@suse.com \
    --to=nborisov@suse.com \
    --cc=josef@toxicpanda.com \
    --cc=kernel-team@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).