From patchwork Wed Nov 20 21:51:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dennis Zhou X-Patchwork-Id: 11254883 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 801CB14E5 for ; Wed, 20 Nov 2019 21:51:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 60FD020708 for ; Wed, 20 Nov 2019 21:51:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1574286708; bh=+/owAUZ3KSRN/N9Z0Czaal/MGrh1k5OxKKU/gpY0QjM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:In-Reply-To: References:List-ID:From; b=Q/5M960WDjT1GpY+Y5NJ0IdF+iykdeNW2afBxuqIv76AlJoT7zaaYCM7JKJrS1xiA DztXk1VagChIZzDwTxRfAW7I5erm9k//ixdn20hwU43JwTsvvnqJ+grlZrI2z8p6mo n47gdzQ+adEcmoKPlQtc6V3+vUA5pStcRzq9fSO4= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726975AbfKTVvr (ORCPT ); Wed, 20 Nov 2019 16:51:47 -0500 Received: from mail-qk1-f196.google.com ([209.85.222.196]:42941 "EHLO mail-qk1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726937AbfKTVvq (ORCPT ); Wed, 20 Nov 2019 16:51:46 -0500 Received: by mail-qk1-f196.google.com with SMTP id i3so1238574qkk.9 for ; Wed, 20 Nov 2019 13:51:45 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=cCt7sL3cX2rQb0LwNU+t/vL/JYv268/Nl2cF/kRlpWg=; b=X/qTPeGMIqM1qlFihGqmIYi8DR8TEXd0EK0neu4wBc9v7GLR6JoPfn/69vW1w1bl0z VosarSFjBDplHBBnlryGwfoUBtRHfM5cVL01lOmjTGnU0mVL/8DiATxgVE3Qdf6Kh8kA /FTv18FF2c4KrvuQZewHqqe8yO2WOYlf7T1raWSC2rGW/nkp/Zcw9aLmVnKRkfgdvlTo vrFGleo/AismI7TMHbRSjOBLW9fbRj4Y3kWrHEl0EuB/E3tSrc4149ix9eQcax4n4fAm tqN+7evObPf8FgAP/6qxS9mO7s5e95hkOPMqifyjPKiitZHLMGE3og6C4RAHv73TL9Mo 3gyg== X-Gm-Message-State: APjAAAWNfnSnM2vmMPIJbbicdz+I88H7H471d7z71LkmG7xPV8izfJdu /BEWghHkx0+s6a8Ig08BLZhSNUmk X-Google-Smtp-Source: APXvYqy1rg81B1AL9mCH+5J4tJjfLLRtbqMbixddgbrskST1H3RQePwnk+rtQYe/pp5BAgyCfTCNHQ== X-Received: by 2002:a05:620a:16bb:: with SMTP id s27mr4660857qkj.501.1574286705399; Wed, 20 Nov 2019 13:51:45 -0800 (PST) Received: from dennisz-mbp.thefacebook.com ([163.114.130.128]) by smtp.gmail.com with ESMTPSA id t16sm303820qkm.73.2019.11.20.13.51.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 20 Nov 2019 13:51:44 -0800 (PST) From: Dennis Zhou To: David Sterba , Chris Mason , Josef Bacik , Omar Sandoval Cc: kernel-team@fb.com, linux-btrfs@vger.kernel.org, Dennis Zhou Subject: [PATCH 15/22] btrfs: limit max discard size for async discard Date: Wed, 20 Nov 2019 16:51:14 -0500 Message-Id: X-Mailer: git-send-email 2.13.5 In-Reply-To: References: In-Reply-To: References: Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Throttle the maximum size of a discard so that we can provide an upper bound for the rate of async discard. While the block layer is able to split discards into the appropriate sized discards, we want to be able to account more accurately the rate at which we are consuming ncq slots as well as limit the upper bound of work for a discard. Signed-off-by: Dennis Zhou Reviewed-by: Josef Bacik --- fs/btrfs/discard.h | 5 ++++ fs/btrfs/free-space-cache.c | 48 +++++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/fs/btrfs/discard.h b/fs/btrfs/discard.h index 88f1363aa4e4..e1819f319901 100644 --- a/fs/btrfs/discard.h +++ b/fs/btrfs/discard.h @@ -3,10 +3,15 @@ #ifndef BTRFS_DISCARD_H #define BTRFS_DISCARD_H +#include + struct btrfs_fs_info; struct btrfs_discard_ctl; struct btrfs_block_group; +/* Discard size limits. */ +#define BTRFS_ASYNC_DISCARD_MAX_SIZE (SZ_64M) + /* List operations. */ void btrfs_add_to_discard_list(struct btrfs_discard_ctl *discard_ctl, struct btrfs_block_group *block_group); diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index c0a08c8df3dd..b03216c550e6 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -3442,19 +3442,40 @@ static int trim_no_bitmap(struct btrfs_block_group *block_group, if (entry->offset >= end) goto out_unlock; - extent_start = entry->offset; - extent_bytes = entry->bytes; - extent_trim_state = entry->trim_state; - start = max(start, extent_start); - bytes = min(extent_start + extent_bytes, end) - start; - if (bytes < minlen) { - spin_unlock(&ctl->tree_lock); - mutex_unlock(&ctl->cache_writeout_mutex); - goto next; - } + if (async) { + start = extent_start = entry->offset; + bytes = extent_bytes = entry->bytes; + extent_trim_state = entry->trim_state; + if (bytes < minlen) { + spin_unlock(&ctl->tree_lock); + mutex_unlock(&ctl->cache_writeout_mutex); + goto next; + } + unlink_free_space(ctl, entry); + if (bytes > BTRFS_ASYNC_DISCARD_MAX_SIZE) { + bytes = extent_bytes = + BTRFS_ASYNC_DISCARD_MAX_SIZE; + entry->offset += BTRFS_ASYNC_DISCARD_MAX_SIZE; + entry->bytes -= BTRFS_ASYNC_DISCARD_MAX_SIZE; + link_free_space(ctl, entry); + } else { + kmem_cache_free(btrfs_free_space_cachep, entry); + } + } else { + extent_start = entry->offset; + extent_bytes = entry->bytes; + extent_trim_state = entry->trim_state; + start = max(start, extent_start); + bytes = min(extent_start + extent_bytes, end) - start; + if (bytes < minlen) { + spin_unlock(&ctl->tree_lock); + mutex_unlock(&ctl->cache_writeout_mutex); + goto next; + } - unlink_free_space(ctl, entry); - kmem_cache_free(btrfs_free_space_cachep, entry); + unlink_free_space(ctl, entry); + kmem_cache_free(btrfs_free_space_cachep, entry); + } spin_unlock(&ctl->tree_lock); trim_entry.start = extent_start; @@ -3619,6 +3640,9 @@ static int trim_bitmaps(struct btrfs_block_group *block_group, goto next; } + if (async && bytes > BTRFS_ASYNC_DISCARD_MAX_SIZE) + bytes = BTRFS_ASYNC_DISCARD_MAX_SIZE; + bitmap_clear_bits(ctl, entry, start, bytes); if (entry->bytes == 0) free_bitmap(ctl, entry);