From patchwork Fri Mar 13 21:23:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437895 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 9AD661667 for ; Fri, 13 Mar 2020 21:23:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7B71F20752 for ; Fri, 13 Mar 2020 21:23:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="aFMn+xvK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727282AbgCMVXg (ORCPT ); Fri, 13 Mar 2020 17:23:36 -0400 Received: from mail-qk1-f194.google.com ([209.85.222.194]:45457 "EHLO mail-qk1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726534AbgCMVXg (ORCPT ); Fri, 13 Mar 2020 17:23:36 -0400 Received: by mail-qk1-f194.google.com with SMTP id c145so15138252qke.12 for ; Fri, 13 Mar 2020 14:23:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=QDMGhZnl37BOJRojF7Zy9aa81J1R9HIRdkxL7MvIeKA=; b=aFMn+xvKx/tVkRnnh2XF4wcpeagxa+q6adiVFuuAp816/z3IyNIwQdf3O2U45XJdKD pLd5L6oIHcqdd+DYqJP+aMRgzlGMSi0bMLPYRiDpllnFf0P591aHlswltD0yZ+40aA06 BcSx3MeuMDQf85e5SLaIZNdYq/u5aVeM+jNKc9sA9mCvwMGfqnR9Itu3ZZGrH8zQqkRS L40zJx8JiLcr8w84YiFdJm70RQGjbtgkWoICpNIFZ1FOyeiCuUlE9UNdxZuEEhHpH94c 9WZ/6e960HO50w4NjYS86dRXEErLbnSmBQDTVXpB/qtKHoGe/rklzRIu5va7F2UpEjGG Q88w== 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:mime-version:content-transfer-encoding; bh=QDMGhZnl37BOJRojF7Zy9aa81J1R9HIRdkxL7MvIeKA=; b=sYfgy9kVyQf+ZEn2cl8tFK7dKHauti7u5z6/AsXg/+Mm+V88FxDLbH//SGz9dALjuY xcYH+lsuJg/f4GYiUKqW0vLw74Gtn6RySaaRR+E9GEvmnul1Xs9XqwLF0pz7SMw1MkbK bS7wRavfFJPzh8NZH8s+CFyT/gW3XDRu+2nUCUkRIjPuj9Iro5eawAkZIbtZJ3Cdhx/f kzyzU1Zv/qg3MsuyEXWk7BJ51+yEsHogWnMIvbSw6+xyYhTLFz+oPPJ7OtVv6PeOKyO+ 8XKRkhj2vuElAIyNUz5uuCdxJA2rwiFwFW41GMAvDGdO7qtWhBKXllSQMpjGhtCT34uF doHA== X-Gm-Message-State: ANhLgQ38Q/DxERN8DV/V4mLGazFtXY9wIIT1nPkl+t5cnNgOE1IB4CNF 2LhVCBbJUwh/Zm+Fl+7jng2HqWJIRNO/OQ== X-Google-Smtp-Source: ADFU+vsFHIbi8JoRCbh1YJw2WjeOvxhDhm4gwqAjc8OG5AItZN/Wo2gYkLFAZw42ygc+rGxwNqEG0A== X-Received: by 2002:a37:a78e:: with SMTP id q136mr15157716qke.252.1584134614520; Fri, 13 Mar 2020 14:23:34 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id u26sm5523745qku.97.2020.03.13.14.23.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:33 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Cc: Zygo Blaxell Subject: [PATCH 01/13] btrfs: use a stable rolling avg for delayed refs avg Date: Fri, 13 Mar 2020 17:23:18 -0400 Message-Id: <20200313212330.149024-2-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org From: Zygo Blaxell The way we currently calculate the average of delayed refs is very jittery. We do a weighted average, weighing the new average at 3/4 of the previously calculated average. This jitteriness leads to pretty wild swings in latencies when we are generating a lot of delayed refs. Fix this by smoothing out the delayed ref average calculation with 1000 seconds of data, 1000 refs minimum, with a 0.75 decay rate. Signed-off-by: Zygo Blaxell Signed-off-by: Josef Bacik --- fs/btrfs/ctree.h | 7 +++++++ fs/btrfs/disk-io.c | 3 +++ fs/btrfs/extent-tree.c | 19 +++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 2ccb2a090782..992ce47977b8 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -620,7 +620,14 @@ struct btrfs_fs_info { u64 generation; u64 last_trans_committed; + + /* + * This is for keeping track of how long it takes to run delayed refs so + * that our delayed ref timing doesn't hurt us. + */ u64 avg_delayed_ref_runtime; + u64 delayed_ref_runtime; + u64 delayed_ref_nr_run; /* * this is updated to the current trans every time a full commit diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 772cf0fa7c55..b5846552666e 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2734,6 +2734,9 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info) fs_info->tree_mod_log = RB_ROOT; fs_info->commit_interval = BTRFS_DEFAULT_COMMIT_INTERVAL; fs_info->avg_delayed_ref_runtime = NSEC_PER_SEC >> 6; /* div by 64 */ + fs_info->delayed_ref_runtime = NSEC_PER_SEC; + fs_info->delayed_ref_nr_run = 64; + /* readahead state */ INIT_RADIX_TREE(&fs_info->reada_tree, GFP_NOFS & ~__GFP_DIRECT_RECLAIM); spin_lock_init(&fs_info->reada_lock); diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 2925b3ad77a1..645ae95f465e 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2082,8 +2082,23 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, * to avoid large swings in the average. */ spin_lock(&delayed_refs->lock); - avg = fs_info->avg_delayed_ref_runtime * 3 + runtime; - fs_info->avg_delayed_ref_runtime = avg >> 2; /* div by 4 */ + fs_info->delayed_ref_nr_run += actual_count; + fs_info->delayed_ref_runtime += runtime; + avg = div64_u64(fs_info->delayed_ref_runtime, + fs_info->delayed_ref_nr_run); + + /* + * Once we've built up a fair bit of data, start decaying + * everything by 3/4. + */ + if (fs_info->delayed_ref_runtime >= (NSEC_PER_SEC * 1000ULL) && + fs_info->delayed_ref_nr_run > 1000) { + fs_info->delayed_ref_runtime *= 3; + fs_info->delayed_ref_runtime >>= 2; + fs_info->delayed_ref_nr_run *= 3; + fs_info->delayed_ref_nr_run >>= 2; + } + fs_info->avg_delayed_ref_runtime = avg; spin_unlock(&delayed_refs->lock); } return 0; From patchwork Fri Mar 13 21:23:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437897 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 912AC913 for ; Fri, 13 Mar 2020 21:23:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 716062074A for ; Fri, 13 Mar 2020 21:23:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="eirBYdHv" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727352AbgCMVXi (ORCPT ); Fri, 13 Mar 2020 17:23:38 -0400 Received: from mail-qk1-f195.google.com ([209.85.222.195]:35784 "EHLO mail-qk1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726534AbgCMVXi (ORCPT ); Fri, 13 Mar 2020 17:23:38 -0400 Received: by mail-qk1-f195.google.com with SMTP id d8so15180184qka.2 for ; Fri, 13 Mar 2020 14:23:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=MjpBDu3DvLHdLQlEJsG9wOFmdfa5YlOMrWBrCYztOUY=; b=eirBYdHvQn20irLlyOmc/DvfGSxKLpkJRXuPwxZuZQX7zphL+vHjBUQkKqK7a4g2qP vaAITl94eLqCc9pMYeZggZWexWln427EMfJs8YOzA9wxQmrbLzUCjpcSrkgu56pPGBez Sirzb/3dM4Z1u5C1iiBlEblCZskpSn7Ai2GfUhD0ONSR3GIRSZDvjeyHuhVu1v4qu9JD aPkU9haXH9UrXW0q3WhBEa+MthQn1OLnPF4WghzHKF7Cpa9yNOv1oNHUemE4ttJdFQnL X8ayTF6/8TABQqVsbnh+5cgAGIKd55PRIvxvtprOMk6YfxEtzGVLr86NyTAjCVLso4Ug m1bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MjpBDu3DvLHdLQlEJsG9wOFmdfa5YlOMrWBrCYztOUY=; b=bh9I9JE9Euu9i6tqrDorAKA4LpN4Evrn/gohTqUNzT0kJsHMHFy3V8y4yPicjBM+87 2senZENB9CoufEsOcyyk7/fFwGoVzO3h5uZDQhqua7Yjgi5QvCC7TsTtKqE82zIgYAKp TgwW1ynRoJjuB8TDnxvEaCMgnWexX6RfZZOoIjTf7OVxuYhyxqjoQwvyN820aCPNLWwf vdYCmYaVgGDubTl+Jq8gWtM4xmsMmm0MgaZIDFV0JJwBynl7sMVLBxFGUvt1wuFNFL/G dk81Wf6DJU59aQrLU38ADD/GRV7UfRpmohr6z4cm7XdAZ0vXvIDUrLrELjbjoK3hhKSG b93A== X-Gm-Message-State: ANhLgQ1473Yj3OBngg6dHGNaQ8B2ThHwCUrrru1Z+JrXJ0NwjqwZdnFF 3gX4cMRzzXIWcqxV+cZdznXbUfzxqB3JLg== X-Google-Smtp-Source: ADFU+vuL9ZwrKqTtoaBwTIhT6ah+X8W2KCrgEbZ+wQOROBwVhk2nPMgderIfyqJANursj7OouGzeBw== X-Received: by 2002:a37:393:: with SMTP id 141mr15033819qkd.393.1584134616192; Fri, 13 Mar 2020 14:23:36 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id w134sm30254314qka.127.2020.03.13.14.23.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:35 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 02/13] btrfs: change btrfs_should_throttle_delayed_refs to a bool Date: Fri, 13 Mar 2020 17:23:19 -0400 Message-Id: <20200313212330.149024-3-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We don't actually check the specific value from btrfs_should_throttle_delayed_refs anywhere, just return a bool. Signed-off-by: Josef Bacik --- fs/btrfs/delayed-ref.c | 6 +++--- fs/btrfs/delayed-ref.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index dfdb7d4f8406..acad9978b927 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c @@ -50,7 +50,7 @@ bool btrfs_check_space_for_delayed_refs(struct btrfs_fs_info *fs_info) return ret; } -int btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans) +bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans) { u64 num_entries = atomic_read(&trans->transaction->delayed_refs.num_entries); @@ -61,9 +61,9 @@ int btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans) avg_runtime = trans->fs_info->avg_delayed_ref_runtime; val = num_entries * avg_runtime; if (val >= NSEC_PER_SEC) - return 1; + return true; if (val >= NSEC_PER_SEC / 2) - return 2; + return true; return btrfs_check_space_for_delayed_refs(trans->fs_info); } diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index 1c977e6d45dc..9a07480b497b 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h @@ -371,7 +371,7 @@ int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info, void btrfs_migrate_to_delayed_refs_rsv(struct btrfs_fs_info *fs_info, struct btrfs_block_rsv *src, u64 num_bytes); -int btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans); +bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans); bool btrfs_check_space_for_delayed_refs(struct btrfs_fs_info *fs_info); /* From patchwork Fri Mar 13 21:23:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437899 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 B2376913 for ; Fri, 13 Mar 2020 21:23:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9328720753 for ; Fri, 13 Mar 2020 21:23:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="jHLDtmT8" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727414AbgCMVXl (ORCPT ); Fri, 13 Mar 2020 17:23:41 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:37389 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726534AbgCMVXk (ORCPT ); Fri, 13 Mar 2020 17:23:40 -0400 Received: by mail-qt1-f196.google.com with SMTP id l20so8892501qtp.4 for ; Fri, 13 Mar 2020 14:23:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=OOBFyqkrQr+Dn4m5CWFrw5I8BTcUf0dy0sA0giKOzqA=; b=jHLDtmT8SKO9dYksEaPCXlqBgyxuHWTxxieUrkjTFC6VRbAdiO5iUt21YPlK4JiQPG VGhtNiIcIr/5rGa7AC656nzzo5ixVHT5/341wInDjgKiAjAgremyiZrvRCFV7fQ3jzrZ inGg7oMCBWdZ0CNZj9Ch8VTq70EbSlX7UmPvExBsaVBuzlDW0t/aKba2LJrix94jaAFV m1KLvzZT3uuKPI/NAk0dx4viZi4G0TtwvQmQiGG8sOOwn7mHnjpEUu48hXvMUFkVFulQ SG0Mf8N2OZxDGiGIjEYn7qHg2/whOvW3uXI8DJ+l9BY0vS1rtbUcJiGkCNR36HQr+8+B diHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OOBFyqkrQr+Dn4m5CWFrw5I8BTcUf0dy0sA0giKOzqA=; b=nme0lUS6BN4r4cdfGYWY2SpaVZHEidRJLbI1WRSWWapFrvgshmby8dDO0E7mqcj25f ptk6fAQnk2rnBJ7GJKw+oDf3wEbt6wvZ7X2N6vuRkCJBTke/tR5EwcehChe9Gy2FTTyq hnTahkulxWLzTl+R0CRMFzsF33mJuqJpxJkurTw6PAWBNd9YjkOTZCR0hsesdC+ZqS04 nmPt6hMZxfIz9Vo97I/ifUkT2whB6a8WOGOVoAvbR2F+SCCnGTJNG4eH6hpBXPOX8A1n 9vPTrQ3DSYiEtcUK1cQEwk2iH+fKVrIaTctvumOhXNShTKsUINLUq/bruRsu//N2eLmI RxvQ== X-Gm-Message-State: ANhLgQ380rP2gAnm6E93CLLxrwDWL80ExxkGZcxlAwi7FO3/oBacxCns w6c7XXSqQfOAofzFcK1eb76t/K5su0Q+ag== X-Google-Smtp-Source: ADFU+vtBECs1hi+6qXfpMlNoIIP+/Y1plg23wpdK8cTNfIbEaua8Alk3FdLzr3QUDiYEDDbTX4nkEQ== X-Received: by 2002:ac8:6704:: with SMTP id e4mr14519554qtp.311.1584134617923; Fri, 13 Mar 2020 14:23:37 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id d73sm12462911qkg.113.2020.03.13.14.23.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:37 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 03/13] btrfs: make btrfs_should_throttle_delayed_refs only check run time Date: Fri, 13 Mar 2020 17:23:20 -0400 Message-Id: <20200313212330.149024-4-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org btrfs_should_throttle_delayed_refs checks run time of the delayed refs and if there's enough space. However we want to use these two checks independently in the future, so make btrfs_should_throttle_delayed_refs only check the runtime. Then fix the only caller of btrfs_should_throttle_delayed_refs to check the space as well, because we want to throttle truncates on either space or time. Signed-off-by: Josef Bacik --- fs/btrfs/delayed-ref.c | 3 +-- fs/btrfs/inode.c | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index acad9978b927..e28565dc4288 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c @@ -64,8 +64,7 @@ bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans) return true; if (val >= NSEC_PER_SEC / 2) return true; - - return btrfs_check_space_for_delayed_refs(trans->fs_info); + return false; } /** diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index b8dabffac767..d3e75e04a0a0 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4349,7 +4349,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, break; } if (be_nice) { - if (btrfs_should_throttle_delayed_refs(trans)) + if (btrfs_should_throttle_delayed_refs(trans) || + btrfs_check_space_for_delayed_refs(fs_info)) should_throttle = true; } } From patchwork Fri Mar 13 21:23:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437901 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 5292B1667 for ; Fri, 13 Mar 2020 21:23:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 32DAA20752 for ; Fri, 13 Mar 2020 21:23:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="KNtCD+EO" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727388AbgCMVXk (ORCPT ); Fri, 13 Mar 2020 17:23:40 -0400 Received: from mail-qk1-f193.google.com ([209.85.222.193]:45478 "EHLO mail-qk1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727366AbgCMVXk (ORCPT ); Fri, 13 Mar 2020 17:23:40 -0400 Received: by mail-qk1-f193.google.com with SMTP id c145so15138656qke.12 for ; Fri, 13 Mar 2020 14:23:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=0aVl2xfW9prr+r2/k26fIV/VINWNFMS/X6e+PTEB8Ro=; b=KNtCD+EOieAnmUR84NBb3ThWSSv9jiOvpyK21RLWywKWLFekA/1jck8+MJmHPi9djS FubAXTTKlDd8q2FLMBZgBTKuLsKExTYvXYUrwdz6AXkn1u8w7CXSTFCg2Qs8e3HIo9NE KMAlUJaRrSG5iElGQ+pLPDty4cLgL/DsziTCWFoSIkrIvxnGU4amBxcVq10/bnK/P6WT FGUiNuGT1zDfWFpPxI1KzQulJDfe7fQWVHnK82YpgEWsHGMR9f5/Pg5s2kXn9NBy/KgO O9ZQj+OivC3GDKTsc/CR9DEJx7PNkD8YW+FMNJJ6k7Fsgr8hK+nncxzj/u0jZXqx3n1x rPFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0aVl2xfW9prr+r2/k26fIV/VINWNFMS/X6e+PTEB8Ro=; b=LB/zF+4k/y/YvMUxNflqe6izxWJW4OKMk3X+xXo9On4oBBTLXvO4TtG4kbbnBpi+r/ qddr/vn4WkHGGi5VdMzzVqmmYlfk2RG9vEnLdenw3Rfkt8FJnoT+Spffrw4oqcYypS51 XAwfNVSDqJmaGxF+oaoazixSHvvNZvHSaBg3+Bgf7+dpou89rpB6SwAWOcxN/iSeVTuq wnymQuM/5A2qOgygTiOrW5M6ClqslX1YD7/T7sdgcERZknrssmRLEl7X7WhLMhNbDV1l /5cEN3PueAUeXnYblUE00utbi2jfV3VlbylLOXQdXsFLOzlUK0rC/Rqgs07V5WUR9goB MP9A== X-Gm-Message-State: ANhLgQ0pIzBcX/yOgY/Oq3VeCqNDgafj6yhiIxKGHzIfvHmvy7nRYrbS 6PBMSU37AzyLPJkEcDZf8rL1ilJd4jYK1A== X-Google-Smtp-Source: ADFU+vt9hU8Obytqd6GiFG9yQjLzfXQYVjVEET/Xe2XpRuwfM9pNaWCEd/ChXoYxKlFXksiQvvvtEg== X-Received: by 2002:a37:8e45:: with SMTP id q66mr15408622qkd.129.1584134619640; Fri, 13 Mar 2020 14:23:39 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id d73sm12462954qkg.113.2020.03.13.14.23.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:39 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 04/13] btrfs: make should_end_transaction check time to run delayed refs Date: Fri, 13 Mar 2020 17:23:21 -0400 Message-Id: <20200313212330.149024-5-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Currently snapshot deletion checks to see if it needs to throttle itself before ending a transaction, however this only checks if there's enough space for delayed refs, not how much time it'll take to run those delayed refs. Fix this by checking btrfs_should_throttle_delayed_refs as well, which takes into account how much time it'll take to run delayed refs. Signed-off-by: Josef Bacik --- fs/btrfs/transaction.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 8d34d7e0adb6..309a2a60040f 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -859,7 +859,8 @@ static int should_end_transaction(struct btrfs_trans_handle *trans) { struct btrfs_fs_info *fs_info = trans->fs_info; - if (btrfs_check_space_for_delayed_refs(fs_info)) + if (btrfs_should_throttle_delayed_refs(trans) || + btrfs_check_space_for_delayed_refs(fs_info)) return 1; return !!btrfs_block_rsv_check(&fs_info->global_block_rsv, 5); From patchwork Fri Mar 13 21:23:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437903 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 5D96A913 for ; Fri, 13 Mar 2020 21:23:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3D9902074F for ; Fri, 13 Mar 2020 21:23:46 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="Yd9FuFC+" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727479AbgCMVXo (ORCPT ); Fri, 13 Mar 2020 17:23:44 -0400 Received: from mail-qv1-f67.google.com ([209.85.219.67]:43216 "EHLO mail-qv1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727432AbgCMVXo (ORCPT ); Fri, 13 Mar 2020 17:23:44 -0400 Received: by mail-qv1-f67.google.com with SMTP id c28so5431577qvb.10 for ; Fri, 13 Mar 2020 14:23:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=YBJkJuMpBGnG4PHi3yFYn+w8JBNwF9a/L5wN0S+C4BI=; b=Yd9FuFC+f9xjT1WRQgkGlkYA02u6Zx1vG09rlhhW3CpjA8qWjtcpmFSMQXQHRNFsWj rVEOxcWVml/oeeOUFVgWuNUr9B+kAbbRqlCvbTncFUHCD+rm3ohMEyvBD89xlV6PO88M g9/G4d3TA+RdEC6MTBptFIqZ6FXTm2DG5WtF7lodMmRqkR0RJyIdI2exfpbS28iHCipH nY9ATAXJV4IIknANBZJ7vksX+QYExzMI8Uuxluz1du67dVYehkWUB7jh2B7WFnD2t2Qu xmvuMXmQgbp0WLlgrKBRv96Dt6WBvnbAqZS5+xtN8pnI00i7yT/ZE278oIQHikGFR++o lxHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YBJkJuMpBGnG4PHi3yFYn+w8JBNwF9a/L5wN0S+C4BI=; b=jCVChb+ZTmVQT+Y/yTFuoWDoMwvgNQSfQ2PR5rKMDLjUFhqrfUEKHTe0byYwmBU471 ri3bc2+UkiyjImxSXM26x0HeFJkHYOAZ5gR3Y5XUsKs7Nkv640zfeIagCqJgdj7cSrul q7kRm24HdpYnd6Ut7IjYDROUcCpqBjqyKmR8kB2F7Mfn3Ypg1UWiuNpYqE84s0gMoO7W /l+RK7mKR3zMxmqcHrZguhJRrt2qr/rkKjdg4ZKpxcARmQWINg9I6d5ZvYXyB4zNv7hz CedikeFsQuxa9Qf/Tqt2HUbWvBkN2M0ENZUTMbKh9NO/FF/ShIJz7NsXTQKFmFv/b2R4 motw== X-Gm-Message-State: ANhLgQ07kFNRnbZoX2WQqXcPcrqDyeVtAEcFMYyQCk83HeVnrSpgCohM fdtKMn1MlcegL7I3SFgjzGKo/pA3tJpceg== X-Google-Smtp-Source: ADFU+vtcu6EZMI4iswnBrZth0zZdpneZPY+x4wnEbOm97sMUlbFA3+q/Q8ZD0JZSmf6w82gq8ZNYwg== X-Received: by 2002:ad4:514b:: with SMTP id g11mr14717482qvq.25.1584134621456; Fri, 13 Mar 2020 14:23:41 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id q7sm797361qti.58.2020.03.13.14.23.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:40 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 05/13] btrfs: squash should_end_transaction Date: Fri, 13 Mar 2020 17:23:22 -0400 Message-Id: <20200313212330.149024-6-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We used to call should_end_transaction() in __btrfs_end_transaction, but we no longer do that and it's a tiny function, so squash it into btrfs_should_end_transaction. Signed-off-by: Josef Bacik --- fs/btrfs/transaction.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 309a2a60040f..f6eecb402f5b 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -855,27 +855,21 @@ void btrfs_throttle(struct btrfs_fs_info *fs_info) wait_current_trans(fs_info); } -static int should_end_transaction(struct btrfs_trans_handle *trans) -{ - struct btrfs_fs_info *fs_info = trans->fs_info; - - if (btrfs_should_throttle_delayed_refs(trans) || - btrfs_check_space_for_delayed_refs(fs_info)) - return 1; - - return !!btrfs_block_rsv_check(&fs_info->global_block_rsv, 5); -} - int btrfs_should_end_transaction(struct btrfs_trans_handle *trans) { struct btrfs_transaction *cur_trans = trans->transaction; + struct btrfs_fs_info *fs_info = trans->fs_info; smp_mb(); if (cur_trans->state >= TRANS_STATE_COMMIT_START || cur_trans->delayed_refs.flushing) return 1; - return should_end_transaction(trans); + if (btrfs_should_throttle_delayed_refs(trans) || + btrfs_check_space_for_delayed_refs(fs_info)) + return 1; + + return !!btrfs_block_rsv_check(&fs_info->global_block_rsv, 5); } static void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans) From patchwork Fri Mar 13 21:23:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437905 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 61E68913 for ; Fri, 13 Mar 2020 21:23:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 42DE620754 for ; Fri, 13 Mar 2020 21:23:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="Hmk06ZL5" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727490AbgCMVXq (ORCPT ); Fri, 13 Mar 2020 17:23:46 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:34856 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727432AbgCMVXp (ORCPT ); Fri, 13 Mar 2020 17:23:45 -0400 Received: by mail-qt1-f196.google.com with SMTP id v15so8905665qto.2 for ; Fri, 13 Mar 2020 14:23:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=xUvBswjML/4+Dx341tUBSu6yL8oEwj7QbCZkK/CEvjg=; b=Hmk06ZL5NprUSqt+pQKc/zzuXRzh5qxUZWcceBeD2YXrMtH4nFuehdpIL/+cFgHMq+ 5lzIdb8DQH/bQprrMSFrUOoj6mNNTrzvwjBwjN7FP5wIIxA2FPpLEYHrb5Z2QnLOYTks g0CwadSrAofLxPVApUP4N0jj1zD+Yg2Xw0JXVdAOo/0fCFfNF14xMzyJdVRJ6TUHwUfe lWeSEP1F0tuGai99lmDPZevK/rlUTmru6Hm+2+jiynHLxtarCx1wREP/m0N/1LH8Q83k /br/XQ5aiITMR8vnI+DItpvDQVVrDFp9wcvqfqu7axkAU+wtp48RpSbFKIXQ+I6lYd59 BBgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xUvBswjML/4+Dx341tUBSu6yL8oEwj7QbCZkK/CEvjg=; b=N9d9KXYM+X0/0D2PLxB/KmPmDEoxrMgv6gm1iAwXyqzEW1qMsFsc5/k5L3SzM8i9Wq LOWzCENzeBuA9SMm2EKaPcMELcUFOOT38wGj6taS/3tRcJ+tCGiAzTxcWa6v2kRZ2QPD 8daWi1Rv6om4Omv5daXNIXILYRHe9uwTNZF1fL/rpBvD4NQOs+R62GIIUhFm7xWVmsfm zNmwnV7frYUyWf1ASSYGjcdeT9orebmYk+ygT0sHnKyLHp+y1+Cdpkrt6pUrmkBV4073 wBfsVseMQeKuNjiw/yecajC866I2jswl8dpSmKr3T/UQ0DFYKzx3vHiP/ff7K6s40EDa C2fw== X-Gm-Message-State: ANhLgQ1x9ISM+TQvkRcx0qY7V21kPOIqDSvKJt66ZZl150yXj/cvrjii L8++g4hK3lcuIT8/C6hpU6vthohAE+ffRA== X-Google-Smtp-Source: ADFU+vv+zBHU7w+8vhicxE3w0Q1uxXWkLQQ0pTBA6MVoNOCOUwMhZRYT6sfDByeG5llZ7TQyptNRfg== X-Received: by 2002:ac8:3694:: with SMTP id a20mr14676274qtc.362.1584134623146; Fri, 13 Mar 2020 14:23:43 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id r207sm8263145qke.136.2020.03.13.14.23.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:42 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 06/13] btrfs: add a mode for delayed ref time based throttling Date: Fri, 13 Mar 2020 17:23:23 -0400 Message-Id: <20200313212330.149024-7-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Currently we only use btrfs_should_throttle_delayed_refs in the case where we want to pre-emptively stop what we're doing and throttle delayed refs in some way. However we're going to use this function for all transaction ending, so add a flag so we can toggle between the maximum theoretical runtime and our "maybe we should start flushing" runtime. Signed-off-by: Josef Bacik --- fs/btrfs/delayed-ref.c | 9 +++++---- fs/btrfs/delayed-ref.h | 3 ++- fs/btrfs/inode.c | 3 ++- fs/btrfs/transaction.c | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index e28565dc4288..6e9fa03be87d 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c @@ -50,7 +50,8 @@ bool btrfs_check_space_for_delayed_refs(struct btrfs_fs_info *fs_info) return ret; } -bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans) +bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans, + bool for_throttle) { u64 num_entries = atomic_read(&trans->transaction->delayed_refs.num_entries); @@ -62,9 +63,9 @@ bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans) val = num_entries * avg_runtime; if (val >= NSEC_PER_SEC) return true; - if (val >= NSEC_PER_SEC / 2) - return true; - return false; + if (!for_throttle) + return false; + return (val >= NSEC_PER_SEC / 2); } /** diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index 9a07480b497b..c0ae440434af 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h @@ -371,7 +371,8 @@ int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info, void btrfs_migrate_to_delayed_refs_rsv(struct btrfs_fs_info *fs_info, struct btrfs_block_rsv *src, u64 num_bytes); -bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans); +bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans, + bool for_throttle); bool btrfs_check_space_for_delayed_refs(struct btrfs_fs_info *fs_info); /* diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d3e75e04a0a0..ad0f0961a711 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4349,7 +4349,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, break; } if (be_nice) { - if (btrfs_should_throttle_delayed_refs(trans) || + if (btrfs_should_throttle_delayed_refs(trans, + true) || btrfs_check_space_for_delayed_refs(fs_info)) should_throttle = true; } diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index f6eecb402f5b..b0d82e1a6a6e 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -865,7 +865,7 @@ int btrfs_should_end_transaction(struct btrfs_trans_handle *trans) cur_trans->delayed_refs.flushing) return 1; - if (btrfs_should_throttle_delayed_refs(trans) || + if (btrfs_should_throttle_delayed_refs(trans, true) || btrfs_check_space_for_delayed_refs(fs_info)) return 1; From patchwork Fri Mar 13 21:23:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437907 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 D5B9092A for ; Fri, 13 Mar 2020 21:23:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id ADDD720752 for ; Fri, 13 Mar 2020 21:23:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="uPHF1q5c" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727492AbgCMVXs (ORCPT ); Fri, 13 Mar 2020 17:23:48 -0400 Received: from mail-qv1-f67.google.com ([209.85.219.67]:47069 "EHLO mail-qv1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727052AbgCMVXr (ORCPT ); Fri, 13 Mar 2020 17:23:47 -0400 Received: by mail-qv1-f67.google.com with SMTP id m2so5427546qvu.13 for ; Fri, 13 Mar 2020 14:23:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=E9U+xgn5czXQyvzyURrX/5bDLXkRhM0W1GkFT8WXhPQ=; b=uPHF1q5ciyP4tEbik2i3C40TA5Z//J3bH1YFbWDZwBUnQBlg4nyqYNmtWRmMjCQOvM 1Bh81JO13eFGnGIvQBc1XIJFRDhkHq/jC7KPd/7OUg0nzys0p9XTYOWQHFd3nJCIbBOl GNLNHjRmoRTtSirz7uWZMFKESQcj2+bd3xeMFaszVHWqTQ8koAnfuSYLWcddX1/N1yE9 PlP5JUwmDvRLmWnXPeelh3Iex57mmAA9MRNQqKXqQjqpHmHMZY4DsISZP4AfLeE8q+yT 5EpE0CXlUQi08b48wOJSCjYTGVTgM4M4tmto8yPi/EYnYDXqzRoSq+ucd96k5OCJ6uG3 NgYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=E9U+xgn5czXQyvzyURrX/5bDLXkRhM0W1GkFT8WXhPQ=; b=JLOs9KgDxr2GkN8IhMOK7E53s0zJkgu3ohleoAasVPStcWOnbkcfT0ReCgy0EGOnDn 8OoaeIYDzuCgCKoNnM4QZg2R7dV2N2Brm6k/TQy+bCGGx3zgnKwWKiLpiD8wCPBGsQzu 9O1wGMuw63qJtXqvNdoLK6Q0revTznYLADfG82zYBz49qBBirf7NdQAM5jz+DCWbIKaO FrEKp3mQgnsuIoY05Vpvr9A700HVfeMaFgzMAAfevQfJat88TbW1dQFkGrFRbjdBIhck JfKaQvEZxQzifnWKbojN7FDBBcf8U9MLXeqGqgu3FBAvRVukAVtt/8pOYXpCgDfumt9M vRPQ== X-Gm-Message-State: ANhLgQ2NiclpN3F/6M6GqF6suo6hq7mjpl5urmxSdnc+apVsqkPaZ31d hsANX/VPJicHhNXTorqmBEdPTvcc1z7wAw== X-Google-Smtp-Source: ADFU+vs6B3ZikGXSv9VdDmR8kWPxQbRxhRhMzgBEVgP+JkkAHNtlrJewiYomZa7+iTqqoYVb86tb2Q== X-Received: by 2002:ad4:498c:: with SMTP id t12mr14605176qvx.27.1584134624931; Fri, 13 Mar 2020 14:23:44 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id h138sm1400031qke.86.2020.03.13.14.23.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:44 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 07/13] btrfs: kick off async delayed ref flushing if we are over time budget Date: Fri, 13 Mar 2020 17:23:24 -0400 Message-Id: <20200313212330.149024-8-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org For very large file systems we cannot rely on the space reservation system to provide enough pressure to flush delayed refs in a timely manner. We have the infrastructure in place to keep track of how much theoretical time it'll take to run our outstanding delayed refs, but unfortunately I ripped all of that out when I added the delayed refs rsv. This code originally was added to address the problem of too many delayed refs building up and thus causing transaction commits to take several minutes to finish. Fix this by adding back the ability to flush delayed refs based on the time budget for them. We want to limit to around 1 seconds worth of delayed refs to be pending at any given time. In order to keep up with demand we will start the async flusher once we are at the 500ms mark, and the async flusher will attempt to keep us in this ballpark. Signed-off-by: Josef Bacik --- fs/btrfs/ctree.h | 4 ++++ fs/btrfs/disk-io.c | 3 +++ fs/btrfs/extent-tree.c | 44 ++++++++++++++++++++++++++++++++++++++++++ fs/btrfs/transaction.c | 8 ++++++++ 4 files changed, 59 insertions(+) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 992ce47977b8..2a6b2938f9ea 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -494,6 +494,7 @@ enum btrfs_orphan_cleanup_state { }; void btrfs_init_async_reclaim_work(struct btrfs_fs_info *fs_info); +void btrfs_init_async_delayed_ref_work(struct btrfs_fs_info *fs_info); /* fs_info */ struct reloc_control; @@ -924,6 +925,9 @@ struct btrfs_fs_info { struct work_struct async_reclaim_work; struct work_struct async_data_reclaim_work; + /* Used to run delayed refs in the background. */ + struct work_struct async_delayed_ref_work; + spinlock_t unused_bgs_lock; struct list_head unused_bgs; struct mutex unused_bg_unpin_mutex; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b5846552666e..b1a9fe5a639a 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2754,6 +2754,7 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info) #endif btrfs_init_balance(fs_info); btrfs_init_async_reclaim_work(fs_info); + btrfs_init_async_delayed_ref_work(fs_info); spin_lock_init(&fs_info->block_group_cache_lock); fs_info->block_group_cache_tree = RB_ROOT; @@ -3997,6 +3998,8 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) */ kthread_park(fs_info->cleaner_kthread); + cancel_work_sync(&fs_info->async_delayed_ref_work); + /* wait for the qgroup rescan worker to stop */ btrfs_qgroup_wait_for_completion(fs_info, false); diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 645ae95f465e..0e81990b57e0 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2249,6 +2249,50 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, return 0; } +static void btrfs_async_run_delayed_refs(struct work_struct *work) +{ + struct btrfs_fs_info *fs_info; + struct btrfs_trans_handle *trans; + + fs_info = container_of(work, struct btrfs_fs_info, + async_delayed_ref_work); + + while (!btrfs_fs_closing(fs_info)) { + unsigned long count; + int ret; + + trans = btrfs_attach_transaction(fs_info->extent_root); + if (IS_ERR(trans)) + break; + + smp_rmb(); + if (trans->transaction->delayed_refs.flushing) { + btrfs_end_transaction(trans); + break; + } + + /* No longer over our threshold, lets bail. */ + if (!btrfs_should_throttle_delayed_refs(trans, true)) { + btrfs_end_transaction(trans); + break; + } + + count = atomic_read(&trans->transaction->delayed_refs.num_entries); + count >>= 2; + + ret = btrfs_run_delayed_refs(trans, count); + btrfs_end_transaction(trans); + if (ret < 0) + break; + } +} + +void btrfs_init_async_delayed_ref_work(struct btrfs_fs_info *fs_info) +{ + INIT_WORK(&fs_info->async_delayed_ref_work, + btrfs_async_run_delayed_refs); +} + int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, u64 bytenr, u64 num_bytes, u64 flags, int level, int is_data) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index b0d82e1a6a6e..7f994ab73b0b 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -899,6 +899,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, struct btrfs_fs_info *info = trans->fs_info; struct btrfs_transaction *cur_trans = trans->transaction; int err = 0; + bool run_async = false; if (refcount_read(&trans->use_count) > 1) { refcount_dec(&trans->use_count); @@ -906,6 +907,9 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, return 0; } + if (btrfs_should_throttle_delayed_refs(trans, true)) + run_async = true; + btrfs_trans_release_metadata(trans); trans->block_rsv = NULL; @@ -936,6 +940,10 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, err = -EIO; } + if (run_async && !work_busy(&info->async_delayed_ref_work)) + queue_work(system_unbound_wq, + &info->async_delayed_ref_work); + kmem_cache_free(btrfs_trans_handle_cachep, trans); return err; } From patchwork Fri Mar 13 21:23:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437909 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 84A0E92A for ; Fri, 13 Mar 2020 21:23:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6469120752 for ; Fri, 13 Mar 2020 21:23:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="BMoVIvEe" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727501AbgCMVXt (ORCPT ); Fri, 13 Mar 2020 17:23:49 -0400 Received: from mail-qt1-f195.google.com ([209.85.160.195]:36599 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727052AbgCMVXt (ORCPT ); Fri, 13 Mar 2020 17:23:49 -0400 Received: by mail-qt1-f195.google.com with SMTP id m33so8889890qtb.3 for ; Fri, 13 Mar 2020 14:23:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=3bzkhfqzWMmAJ4gZzV7IJCBqN4f9yRHKvpdAmjxOuo0=; b=BMoVIvEe0ocuIqilqDRxVSRlmD19zINsNZoYBfA+jFNGFiHp1cX/FaW0qb0k97e/at BISLeu+IONIy3KJ+4N8wpFmb8Y1xqoPvwIE/j1aVTUEGVWeZ8FE2LlQKaWEC91PKzgxR jLRiZPcxXgIxFwbcq4RnKZ7MM8eFPKwmzudbrwwN47nS+R+2dxkMfrbOCdN0CQSxZNM1 b5gmA2Eg4iHjsTMFwwe/mFiLWe21o5y8IbH4dxmlIG5/zZcvcEceRFgrs0c3Imw/4JdB FtIIQANa0GB/GXp6w3AngDou3L1Vfw4GCAlIqbdSQwLVo0+5/fq+SqnFONJ0Jd6/cK8F GBlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3bzkhfqzWMmAJ4gZzV7IJCBqN4f9yRHKvpdAmjxOuo0=; b=BoAeqy0UNTvn1oFI9lQQB52L/Gz7MD9KBoHxnGVoYBW2JKoZVN6X126tFXhNLUspcc SIGcawaGu3ZXpQeKOJD4qWwY1quLBL6Y+MDqD2Sde+WJ7YtIalEtjuaE3XLHhJIDVPgL YOGnKccB5852Ts9/7hS5dq18dJ7kUCDDZ15cyvU7ozrqcXd9bVapNY4iHaZ3Y7Az9/2T bDPv0E+6RBfPDsovABXpElSQ+UwdiJKyEAISNhWqlXliEHWt9JD1DrGX1tgA3w9PaCpt B39WXOGnoRJGIx8sZmzkQwRbAjgYW+VmcJqUcSPx9CMathv4Lj0xC1Jo9M2vklquOpGp Q46g== X-Gm-Message-State: ANhLgQ3wGJx9hv654CVSzbcfIWbv3IaQOauGOITLPsKHlcjx3bIV05r4 96uRIinq3Nvc8YZ8RI3szMZG0KTKWEUMKg== X-Google-Smtp-Source: ADFU+vtE/UfM/B/0fY5DsdJ+0dzpp0MezafE2mwh7Upj3qxcb3aTjXeWDhTRB0WpdIDmnqUcAFnZnw== X-Received: by 2002:aed:3ed0:: with SMTP id o16mr14566678qtf.3.1584134626561; Fri, 13 Mar 2020 14:23:46 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id l60sm9335970qtd.35.2020.03.13.14.23.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:45 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 08/13] btrfs: adjust the arguments for btrfs_should_throttle_delayed_refs Date: Fri, 13 Mar 2020 17:23:25 -0400 Message-Id: <20200313212330.149024-9-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We want to be able to call this without a trans handle being open, so adjust the arguments to be the fs_info and the delayed_ref_root instead of the trans handle. Signed-off-by: Josef Bacik --- fs/btrfs/delayed-ref.c | 8 ++++---- fs/btrfs/delayed-ref.h | 3 ++- fs/btrfs/extent-tree.c | 2 +- fs/btrfs/inode.c | 5 +++-- fs/btrfs/transaction.c | 5 +++-- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index 6e9fa03be87d..e709f051320a 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c @@ -50,16 +50,16 @@ bool btrfs_check_space_for_delayed_refs(struct btrfs_fs_info *fs_info) return ret; } -bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans, +bool btrfs_should_throttle_delayed_refs(struct btrfs_fs_info *fs_info, + struct btrfs_delayed_ref_root *delayed_refs, bool for_throttle) { - u64 num_entries = - atomic_read(&trans->transaction->delayed_refs.num_entries); + u64 num_entries = atomic_read(&delayed_refs->num_entries); u64 avg_runtime; u64 val; smp_mb(); - avg_runtime = trans->fs_info->avg_delayed_ref_runtime; + avg_runtime = fs_info->avg_delayed_ref_runtime; val = num_entries * avg_runtime; if (val >= NSEC_PER_SEC) return true; diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index c0ae440434af..3ea3a1627d26 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h @@ -371,7 +371,8 @@ int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info, void btrfs_migrate_to_delayed_refs_rsv(struct btrfs_fs_info *fs_info, struct btrfs_block_rsv *src, u64 num_bytes); -bool btrfs_should_throttle_delayed_refs(struct btrfs_trans_handle *trans, +bool btrfs_should_throttle_delayed_refs(struct btrfs_fs_info *fs_info, + struct btrfs_delayed_ref_root *delayed_refs, bool for_throttle); bool btrfs_check_space_for_delayed_refs(struct btrfs_fs_info *fs_info); diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 0e81990b57e0..b9b96e4db65f 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2272,7 +2272,7 @@ static void btrfs_async_run_delayed_refs(struct work_struct *work) } /* No longer over our threshold, lets bail. */ - if (!btrfs_should_throttle_delayed_refs(trans, true)) { + if (!btrfs_should_throttle_delayed_refs(fs_info, &trans->transaction->delayed_refs, true)) { btrfs_end_transaction(trans); break; } diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index ad0f0961a711..c9815ed03d21 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4349,8 +4349,9 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, break; } if (be_nice) { - if (btrfs_should_throttle_delayed_refs(trans, - true) || + if (btrfs_should_throttle_delayed_refs(fs_info, + &trans->transaction->delayed_refs, + true) || btrfs_check_space_for_delayed_refs(fs_info)) should_throttle = true; } diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 7f994ab73b0b..cf8fab22782f 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -865,7 +865,7 @@ int btrfs_should_end_transaction(struct btrfs_trans_handle *trans) cur_trans->delayed_refs.flushing) return 1; - if (btrfs_should_throttle_delayed_refs(trans, true) || + if (btrfs_should_throttle_delayed_refs(fs_info, &cur_trans->delayed_refs, true) || btrfs_check_space_for_delayed_refs(fs_info)) return 1; @@ -907,7 +907,8 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, return 0; } - if (btrfs_should_throttle_delayed_refs(trans, true)) + if (btrfs_should_throttle_delayed_refs(info, + &cur_trans->delayed_refs, true)) run_async = true; btrfs_trans_release_metadata(trans); From patchwork Fri Mar 13 21:23:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437921 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 C76B292A for ; Fri, 13 Mar 2020 21:24:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 947E52076C for ; Fri, 13 Mar 2020 21:24:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="F52SsnkA" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727561AbgCMVYD (ORCPT ); Fri, 13 Mar 2020 17:24:03 -0400 Received: from mail-qk1-f195.google.com ([209.85.222.195]:33502 "EHLO mail-qk1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727198AbgCMVXw (ORCPT ); Fri, 13 Mar 2020 17:23:52 -0400 Received: by mail-qk1-f195.google.com with SMTP id p62so15185193qkb.0 for ; Fri, 13 Mar 2020 14:23:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=8ElM2dajH4z4UD5RegL4lZbes7mgXqJzBjC81uhGlOc=; b=F52SsnkA0vMfqPGaEF7SzAWcH4geej5dks6K9sAptGH09B3LR6C4LCQU0o2O28kuio BmZdmmE0mwkybsg7mhgc74F8jmoT9bgsmx4cFo4eeHcBX+M5OhJfsZcNVzrJTNJIfCEm nkOtgiABfic+8QxHpTQelKcY0YjuwXh+dr7gUB+lIc34D9qO9hANvl6TOlOGJd1gRAXJ iCVAigiE8Yv6/0fnUrLR9Nfg62Rsy/Bt1LGYGvdraRqwoP73YsnY2ZbifcYmrKMYilMZ GOETHKrEDwlicIbXRzLzL8YP4N7ggQUANETAwPHPoSlJmH7OD2yi89tr2iCHmsGPCgus ZYDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8ElM2dajH4z4UD5RegL4lZbes7mgXqJzBjC81uhGlOc=; b=jUGTlpkFwP2f/8ZeSaOTUZaMG2boL+/AcqOqA9htBzuhqH63GZXT9xT3KEeUbyAZPj egtjltkggCF6vcetBjDmRvFeOiyVm4kLu5g2r86W3nmE9Dn1bKOzQHRmLIOgvPY1N7Ve v92hBj2uTFXMF9Fp9GvLHXWi0CPzpjs2bpqTGZC+3ktnpeXB0liwUwpqYCIxw4n+LWLb qyAY4WV1jMcUHlXZ8d0X5ftRVmCaVqo2U3soDAZ7hZsSI9XXfSirkscict1e+wdQkXxv FAmA8XMPVuSx2ttfXX3PaJvZkKePFFjU2GmsEK0TylWDKEa2PGpIw/HZChTUQMtP0+db yQhA== X-Gm-Message-State: ANhLgQ0Njr1kDFLO3EXazv9a6+LW/RdaMiU1VICH5MRpSTOlChs53cae b1KAze3pA4oQULPpYYOlRixS+YSRbuRsxQ== X-Google-Smtp-Source: ADFU+vtM9AGPpKAx3M1TeJQGJnVm6wO0gTQ2qYWjCD93FKRQsblq6MmjfKt0D/TbnG9kJOW2tIdKhg== X-Received: by 2002:a37:8e45:: with SMTP id q66mr15409154qkd.129.1584134628803; Fri, 13 Mar 2020 14:23:48 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id h47sm12200706qtb.75.2020.03.13.14.23.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:47 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 09/13] btrfs: throttle delayed refs based on time Date: Fri, 13 Mar 2020 17:23:26 -0400 Message-Id: <20200313212330.149024-10-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We need to make sure we don't generate so many delayed refs that the box gets overwhelmed at commit time. Keep a sequence number of the number of entries run, and if we need to be throttled based on our time constraints wait for the number of delayed refs we added to be run once we end our transaction. Signed-off-by: Josef Bacik --- fs/btrfs/delayed-ref.c | 6 ++++-- fs/btrfs/delayed-ref.h | 14 ++++++++++++ fs/btrfs/extent-tree.c | 4 +++- fs/btrfs/transaction.c | 49 +++++++++++++++++++++++++++++++++++++++--- fs/btrfs/transaction.h | 16 ++++++++++++++ 5 files changed, 83 insertions(+), 6 deletions(-) diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index e709f051320a..e2f40a449d85 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c @@ -424,7 +424,7 @@ static inline void drop_delayed_ref(struct btrfs_trans_handle *trans, list_del(&ref->add_list); ref->in_tree = 0; btrfs_put_delayed_ref(ref); - atomic_dec(&delayed_refs->num_entries); + btrfs_dec_delayed_ref_entries(delayed_refs); } static bool merge_ref(struct btrfs_trans_handle *trans, @@ -580,7 +580,7 @@ void btrfs_delete_ref_head(struct btrfs_delayed_ref_root *delayed_refs, rb_erase_cached(&head->href_node, &delayed_refs->href_root); RB_CLEAR_NODE(&head->href_node); - atomic_dec(&delayed_refs->num_entries); + btrfs_dec_delayed_ref_entries(delayed_refs); delayed_refs->num_heads--; if (head->processing == 0) delayed_refs->num_heads_ready--; @@ -639,6 +639,7 @@ static int insert_delayed_ref(struct btrfs_trans_handle *trans, if (ref->action == BTRFS_ADD_DELAYED_REF) list_add_tail(&ref->add_list, &href->ref_add_list); atomic_inc(&root->num_entries); + trans->total_delayed_refs++; spin_unlock(&href->lock); return ret; } @@ -843,6 +844,7 @@ add_delayed_ref_head(struct btrfs_trans_handle *trans, delayed_refs->num_heads_ready++; atomic_inc(&delayed_refs->num_entries); trans->delayed_ref_updates++; + trans->total_delayed_refs++; } if (qrecord_inserted_ret) *qrecord_inserted_ret = qrecord_inserted; diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index 3ea3a1627d26..16cf0af91464 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h @@ -150,6 +150,13 @@ struct btrfs_delayed_ref_root { */ atomic_t num_entries; + /* + * How many entries we've run, and a corresponding waitqueue so that we + * can throttle generators appropriately. + */ + atomic_t entries_run; + wait_queue_head_t wait; + /* total number of head nodes in tree */ unsigned long num_heads; @@ -391,4 +398,11 @@ btrfs_delayed_node_to_data_ref(struct btrfs_delayed_ref_node *node) return container_of(node, struct btrfs_delayed_data_ref, node); } +static inline void +btrfs_dec_delayed_ref_entries(struct btrfs_delayed_ref_root *delayed_refs) +{ + atomic_dec(&delayed_refs->num_entries); + atomic_inc(&delayed_refs->entries_run); + wake_up(&delayed_refs->wait); +} #endif diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index b9b96e4db65f..e490ce994d1d 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1958,7 +1958,6 @@ static int btrfs_run_delayed_refs_for_head(struct btrfs_trans_handle *trans, default: WARN_ON(1); } - atomic_dec(&delayed_refs->num_entries); /* * Record the must_insert_reserved flag before we drop the @@ -1974,6 +1973,9 @@ static int btrfs_run_delayed_refs_for_head(struct btrfs_trans_handle *trans, ret = run_one_delayed_ref(trans, ref, extent_op, must_insert_reserved); + /* Anybody who's been throttled may be woken up here. */ + btrfs_dec_delayed_ref_entries(delayed_refs); + btrfs_free_delayed_extent_op(extent_op); if (ret) { unselect_delayed_ref_head(delayed_refs, locked_ref); diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index cf8fab22782f..ac77a2b805fa 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -307,6 +307,8 @@ static noinline int join_transaction(struct btrfs_fs_info *fs_info, cur_trans->delayed_refs.href_root = RB_ROOT_CACHED; cur_trans->delayed_refs.dirty_extent_root = RB_ROOT; atomic_set(&cur_trans->delayed_refs.num_entries, 0); + atomic_set(&cur_trans->delayed_refs.entries_run, 0); + init_waitqueue_head(&cur_trans->delayed_refs.wait); /* * although the tree mod log is per file system and not per transaction, @@ -893,13 +895,29 @@ static void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans) trans->bytes_reserved = 0; } +static void noinline +btrfs_throttle_for_delayed_refs(struct btrfs_fs_info *fs_info, + struct btrfs_delayed_ref_root *delayed_refs, + unsigned long refs, bool throttle) +{ + unsigned long threshold = max(refs, 1UL) + + atomic_read(&delayed_refs->entries_run); + wait_event_interruptible(delayed_refs->wait, + (atomic_read(&delayed_refs->entries_run) >= threshold) || + !btrfs_should_throttle_delayed_refs(fs_info, delayed_refs, + throttle)); +} + static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, int throttle) { struct btrfs_fs_info *info = trans->fs_info; struct btrfs_transaction *cur_trans = trans->transaction; + unsigned long total_delayed_refs; + unsigned int trans_type = trans->type; int err = 0; bool run_async = false; + bool throttle_delayed_refs = false; if (refcount_read(&trans->use_count) > 1) { refcount_dec(&trans->use_count); @@ -907,9 +925,23 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, return 0; } + /* + * If we are over our threshold for our specified throttle then we need + * to throttle ourselves, because the async flusher is not keeping up. + * + * However if we're just over the async threshold simply kick the async + * flusher. + */ if (btrfs_should_throttle_delayed_refs(info, - &cur_trans->delayed_refs, true)) + &cur_trans->delayed_refs, + throttle)) { run_async = true; + throttle_delayed_refs = true; + } else if (btrfs_should_throttle_delayed_refs(info, + &cur_trans->delayed_refs, + true)) { + run_async = true; + } btrfs_trans_release_metadata(trans); trans->block_rsv = NULL; @@ -918,7 +950,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, btrfs_trans_release_chunk_metadata(trans); - if (trans->type & __TRANS_FREEZABLE) + if (trans_type & __TRANS_FREEZABLE) sb_end_intwrite(info->sb); WARN_ON(cur_trans != info->running_transaction); @@ -927,7 +959,6 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, extwriter_counter_dec(cur_trans, trans->type); cond_wake_up(&cur_trans->writer_wait); - btrfs_put_transaction(cur_trans); if (current->journal_info == trans) current->journal_info = NULL; @@ -935,6 +966,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, if (throttle) btrfs_run_delayed_iputs(info); + total_delayed_refs = trans->total_delayed_refs; if (TRANS_ABORTED(trans) || test_bit(BTRFS_FS_STATE_ERROR, &info->fs_state)) { wake_up_process(info->transaction_kthread); @@ -946,6 +978,17 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, &info->async_delayed_ref_work); kmem_cache_free(btrfs_trans_handle_cachep, trans); + + /* + * We only want to throttle generators, so btrfs_transaction_start + * callers. + */ + if (throttle_delayed_refs && total_delayed_refs && + (trans_type & __TRANS_START)) + btrfs_throttle_for_delayed_refs(info, &cur_trans->delayed_refs, + total_delayed_refs, throttle); + btrfs_put_transaction(cur_trans); + return err; } diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 453cea7c7a72..2ec10978fa2a 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -109,7 +109,23 @@ struct btrfs_trans_handle { u64 transid; u64 bytes_reserved; u64 chunk_bytes_reserved; + + /* + * This tracks the number of items required for the delayed ref rsv, and + * is used by that code. The accounting is + * + * - 1 per delayed ref head (individual items are not counted). + * - number of csum items that would be inserted for data. + * - block group item updates. + */ unsigned long delayed_ref_updates; + + /* + * This is the total number of delayed items that we added for this + * trans handle, this is used for the end transaction throttling code. + */ + unsigned long total_delayed_refs; + struct btrfs_transaction *transaction; struct btrfs_block_rsv *block_rsv; struct btrfs_block_rsv *orig_rsv; From patchwork Fri Mar 13 21:23:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437911 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 43344913 for ; Fri, 13 Mar 2020 21:23:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 23DE320767 for ; Fri, 13 Mar 2020 21:23:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="AfS17Ng/" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727519AbgCMVXw (ORCPT ); Fri, 13 Mar 2020 17:23:52 -0400 Received: from mail-qk1-f193.google.com ([209.85.222.193]:40794 "EHLO mail-qk1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727507AbgCMVXw (ORCPT ); Fri, 13 Mar 2020 17:23:52 -0400 Received: by mail-qk1-f193.google.com with SMTP id j2so2297440qkl.7 for ; Fri, 13 Mar 2020 14:23:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=G08ksGNnBKdttQkIG65mLPKcCadIDPby6s3DYKD2PkE=; b=AfS17Ng/YbidxmggfvGCQQ7Pk4ha04594mzpbVA4shAiNXn+83y0WXs18zv+tmfXGA FeQmmu7tovIxOvMgmUtZx73X6OEOdJGLN/qfU03KtRGBgrc8B7lnbmjjvAbCSyRmzmpc qk/P0oZyQnyi8VghiIAsVnpTCmgtHoQO4vKG9gyKkW7mcAyRUD6l7nhOmcbRFDZFoz1M BblyyolWyn29Wgiy+e27HMZkLMgEbycfSAUt1QeR1rgR83gNswH7WXm9nw3QaenWPpxS OQpIOmewLpBSjHXayNJ3XsejUe8OnwIJkBEz++tq0KixUVZRng0HONrWuLV/LnK0yIkf I9kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=G08ksGNnBKdttQkIG65mLPKcCadIDPby6s3DYKD2PkE=; b=RJkktILLDEDNTk+O/6hHCsuFQe0bNezLzsp9W0bPkLX62etSPCp4thDUVrLGmrUt6G zWfOYDa+FDqchRHvbSe87fjmuAvaYlgdXF7YX2dCMn4e9UfzFM32NEife94Boeb7z+wO 3FdiJqyjISvBHviB0VUd1bh6jEma927RAF5f+sgS1Wc6SYgMpdoYZKoeODv65YUKt6e2 WnYgxrZJzPNXOQU2H33cUjktBLOn2RP363ywga9/vSLWS1ynh2oCL+vFNrIOFZNCcVFr X1Fraba6fxcwWD0BZUBoXm1KlGInJctTfOxOlyTjY8Exc+cd9xAmr5F+CggQPQb/oSI2 sI0Q== X-Gm-Message-State: ANhLgQ3lCXFKvfWZLVNsTHOZoerVbWFuPig1+6fyldvfMPUmkVYM/o4w /kq9+TJUUF9uW5TZJ0G8yop3j9V1PoVjDg== X-Google-Smtp-Source: ADFU+vvv01KEhmglKLfc2cUr6k2JMhkUtU4mqGng1vRUMpy+NpUYHce7Ham8jik1N+5aFq2M68akyA== X-Received: by 2002:a37:4b4c:: with SMTP id y73mr14866994qka.467.1584134630473; Fri, 13 Mar 2020 14:23:50 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id o81sm4652474qke.24.2020.03.13.14.23.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:49 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 10/13] btrfs: handle uncontrolled delayed ref generation Date: Fri, 13 Mar 2020 17:23:27 -0400 Message-Id: <20200313212330.149024-11-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Some operations can generate way too many delayed refs, resulting in the async flusher being unable to keep up. To deal with this keep track of how often we're needing to throttle the trans handles, and if it's too much increase how many delayed refs they need to wait on each iteration. Signed-off-by: Josef Bacik --- fs/btrfs/delayed-ref.h | 3 +++ fs/btrfs/transaction.c | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index 16cf0af91464..03590a13f86e 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h @@ -157,6 +157,9 @@ struct btrfs_delayed_ref_root { atomic_t entries_run; wait_queue_head_t wait; + atomic_t mult; + time64_t last_adjustment; + /* total number of head nodes in tree */ unsigned long num_heads; diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index ac77a2b805fa..6f74f9699560 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -308,6 +308,7 @@ static noinline int join_transaction(struct btrfs_fs_info *fs_info, cur_trans->delayed_refs.dirty_extent_root = RB_ROOT; atomic_set(&cur_trans->delayed_refs.num_entries, 0); atomic_set(&cur_trans->delayed_refs.entries_run, 0); + atomic_set(&cur_trans->delayed_refs.mult, 1); init_waitqueue_head(&cur_trans->delayed_refs.wait); /* @@ -902,6 +903,17 @@ btrfs_throttle_for_delayed_refs(struct btrfs_fs_info *fs_info, { unsigned long threshold = max(refs, 1UL) + atomic_read(&delayed_refs->entries_run); + time64_t start = ktime_get_seconds(); + + spin_lock(&delayed_refs->lock); + if (delayed_refs->last_adjustment - start >= 1) { + if (delayed_refs->last_adjustment) + atomic_inc(&delayed_refs->mult); + delayed_refs->last_adjustment = start; + } + spin_unlock(&delayed_refs->lock); + refs *= atomic_read(&delayed_refs->mult); + wait_event_interruptible(delayed_refs->wait, (atomic_read(&delayed_refs->entries_run) >= threshold) || !btrfs_should_throttle_delayed_refs(fs_info, delayed_refs, @@ -973,6 +985,15 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, err = -EIO; } + if (!throttle_delayed_refs && atomic_read(&cur_trans->delayed_refs.mult) > 1) { + time64_t start = ktime_get_seconds(); + spin_lock(&cur_trans->delayed_refs.lock); + if ((start - cur_trans->delayed_refs.last_adjustment) >= 1) { + atomic_dec(&cur_trans->delayed_refs.mult); + cur_trans->delayed_refs.last_adjustment = start; + } + spin_unlock(&cur_trans->delayed_refs.lock); + } if (run_async && !work_busy(&info->async_delayed_ref_work)) queue_work(system_unbound_wq, &info->async_delayed_ref_work); From patchwork Fri Mar 13 21:23:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437913 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 0AE30913 for ; Fri, 13 Mar 2020 21:23:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E0CF120754 for ; Fri, 13 Mar 2020 21:23:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="du1PSM3o" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727535AbgCMVXz (ORCPT ); Fri, 13 Mar 2020 17:23:55 -0400 Received: from mail-qv1-f65.google.com ([209.85.219.65]:40275 "EHLO mail-qv1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727531AbgCMVXy (ORCPT ); Fri, 13 Mar 2020 17:23:54 -0400 Received: by mail-qv1-f65.google.com with SMTP id u17so5441732qvv.7 for ; Fri, 13 Mar 2020 14:23:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=i1g8PvplrqHt5XBMdH9s/NUv6j6OUjCgqYZ2SvxGJJA=; b=du1PSM3oVNsvyhzZHHn0V/zvAb0s+LzRtKodVb87HK6Ygp0hkZgeBPwj8bt4lqZC9Z 63KmOY08dCTKe+IeKX3a4W6+F5kQfV6dU8x8zmSm/BEWZoZ7D56ByXSNDnoOi7xOp9eQ mKNfTU41XJctur6Kc5SzHN30WsKJ3mzAFjgzvHQ8K6M1huzMiCE1CAPhb6TAXeP/X2qX YRwEpNFnrECpIM/inSJjITxngItv/A8tJyyaRhQl+RPDljRxSNgV9oAcjwPyDa9mpLQE FWkeeR3BMfpL/7jV1ql/4puME5Ut+zkZeW2OINujE5iDZjKaSoYjCR8W50Acu6rBn4Vs r/dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=i1g8PvplrqHt5XBMdH9s/NUv6j6OUjCgqYZ2SvxGJJA=; b=cFzCDuz7eDb8PirsQ3EqiqczY1ZvJ/ZoMzblu3PjPvt4TzWlfWJWXHoBiN4i94ACGo WoSyHdVTDWN0gPaZwNi3DZabp5mDRP0O/15hHjpkgnFXKQnFGmphc1zQF0PQIBN+trUl lT9s57YExm+vW+pz90kG7VvB/KjITH3yGDgSsup8ThDGLU2eblN3XdAI8UZAgS5ja9aY ryhkKWBwRpi9qumRCjm2ZugorHsHakSD2FD0cFIjk7O0TkDXQRvYQFt+9USI389mA6ni ULapK3uDk0J1+9ogn/JVYNLlCdzVnHAk5GApWB0dGEoJdZzk7yL85eMkcW3p3yJub8vK nXzQ== X-Gm-Message-State: ANhLgQ1XPSMv7t/P0MpD/QovOECKoUArfD0AD6WUJ+f7r+XUhG58URL5 hGydgNeSneTXQrMgasxN4tGflGEC5N9yng== X-Google-Smtp-Source: ADFU+vsckDP0Dvl431wH9uaUHyZsefqz41Ue7zk3ZqduMffgZs5KnudT4xkuMS4JDN2i/5ykYdd5Iw== X-Received: by 2002:ad4:5429:: with SMTP id g9mr14014394qvt.134.1584134632162; Fri, 13 Mar 2020 14:23:52 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id u6sm1835931qtq.66.2020.03.13.14.23.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:51 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 11/13] btrfs: check delayed refs while relocating Date: Fri, 13 Mar 2020 17:23:28 -0400 Message-Id: <20200313212330.149024-12-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Relocation can generate a serious amount of delayed refs, so we need to throttle the relocation sometimes in order to keep up with the async flusher. We already have a mechanism to start over because of ENOSPC, simply add delayed ref counts to the check as well. Signed-off-by: Josef Bacik --- fs/btrfs/relocation.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 45268e50cb17..e3d6ba27663e 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -2797,6 +2797,16 @@ static int reserve_metadata_space(struct btrfs_trans_handle *trans, int ret; u64 tmp; + /* + * If we're generating too many delayed refs we should bail and allow + * the delayed ref throttling stuff to catch up. + */ + if (btrfs_check_space_for_delayed_refs(fs_info) || + btrfs_should_throttle_delayed_refs(fs_info, + &trans->transaction->delayed_refs, + true)) + return -EAGAIN; + num_bytes = calcu_metadata_size(rc, node, 1) * 2; trans->block_rsv = rc->block_rsv; From patchwork Fri Mar 13 21:23:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437915 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 9ED3092A for ; Fri, 13 Mar 2020 21:23:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8158520752 for ; Fri, 13 Mar 2020 21:23:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="Sjm9uvNO" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727542AbgCMVXz (ORCPT ); Fri, 13 Mar 2020 17:23:55 -0400 Received: from mail-qt1-f194.google.com ([209.85.160.194]:44736 "EHLO mail-qt1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727532AbgCMVXz (ORCPT ); Fri, 13 Mar 2020 17:23:55 -0400 Received: by mail-qt1-f194.google.com with SMTP id h16so8869875qtr.11 for ; Fri, 13 Mar 2020 14:23:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=K+OcyLSfcOjmpvj97pGWI9kgRgheJmWWNju1jww1gxo=; b=Sjm9uvNO+dUg1S7BY9HBeepjlpd2aQIpmHw4wCY5SFSsALr7xp/lam1ppeGMunjEC4 Nzb1nhUzfDoOsWGWvLnskAvndLVlu5FoFAlEL8gebAYHYxBQMOSkqRTwYspD8GA9k/og YJlnJw87nb4dex0r7IcMg6twU0YhuVqw4+JQh7oQ14Zo5Eh00pvwAnrNMUZN29hKsYm+ VryEYj/dn/qKKze/9fqfqQ6LZa3Bt36PJzZQb/q06dYBvwPofM7sLjECqzOqeC/2NRSV yFcF2P3RIS6udKUYSSo9Edu5s4wSs2lx6EAshQCNeSI3AGpHWNh4W7NG3qu8IUDpUmVY AeTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=K+OcyLSfcOjmpvj97pGWI9kgRgheJmWWNju1jww1gxo=; b=GN2wUQ/yWYjJubym7Xb3ngy9B54SWPfn4dGiAY9o2kqYsx/ecBA9f+aE6vGSLEZYI9 a19VUW5ugbuVB9zxDP93Iz1mnMKbok0ztdQsFiIr/Zp2TgK18rBGmGJFpqIHauJJdeN3 /twGh1yNUar10hrrpiPHY/eRhr4FcAiInYZ/FL9ZNtdoWhihYTvzZA9wA8JFKgV20D5r P6neOMBkqNldwU9iXrMUnX1p0QI0j0F/2sg8sLC+u44d2SnyKENCrnXuIv1ZwrLn+Df+ I2qOkEwBoKfQ8Zx15ZnPNT+9kTPg2bYTVTSTYzlFMKOaZd0AF3E+0BWI7kgxBemr7Shh f9UA== X-Gm-Message-State: ANhLgQ11TN1eoXc/30WyaYC7BIgJ919Qflsl7/2Qxjd+AWBD7foAYjxG GY4l8tuMkc54uEQPnWsMAv+kH82cZqkkCA== X-Google-Smtp-Source: ADFU+vt4eBDO14OwtD9f6K/c3yX/4G9jXG9J1IT4g868cziMWbPQDzUuiLo5OwVYelDeTLVRPayALA== X-Received: by 2002:ac8:8e7:: with SMTP id y36mr7153077qth.26.1584134633782; Fri, 13 Mar 2020 14:23:53 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id g62sm29733131qkd.25.2020.03.13.14.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:53 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 12/13] btrfs: throttle truncate for delayed ref generation Date: Fri, 13 Mar 2020 17:23:29 -0400 Message-Id: <20200313212330.149024-13-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Truncates can generate a lot of delayed refs, and if we're over our time limit or we're already flushing we should just bail so the appropriate action can be taken. Signed-off-by: Josef Bacik --- fs/btrfs/inode.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c9815ed03d21..c39794a95acb 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4386,6 +4386,21 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, * let the normal reservation dance happen higher up. */ if (should_throttle) { + struct btrfs_transaction *cur_trans = + trans->transaction; + + /* + * If we're over time, or we're flushing, go + * ahead and break out so that we can let + * everybody catch up. + */ + if (btrfs_should_throttle_delayed_refs(fs_info, + &cur_trans->delayed_refs, true) || + cur_trans->delayed_refs.flushing) { + ret = -EAGAIN; + break; + } + ret = btrfs_delayed_refs_rsv_refill(fs_info, BTRFS_RESERVE_NO_FLUSH); if (ret) { From patchwork Fri Mar 13 21:23:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11437919 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 38F9C913 for ; Fri, 13 Mar 2020 21:24:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 10DC62074A for ; Fri, 13 Mar 2020 21:24:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="OQyi6/Mt" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727553AbgCMVX6 (ORCPT ); Fri, 13 Mar 2020 17:23:58 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:32884 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727532AbgCMVX5 (ORCPT ); Fri, 13 Mar 2020 17:23:57 -0400 Received: by mail-qt1-f196.google.com with SMTP id d22so8916401qtn.0 for ; Fri, 13 Mar 2020 14:23:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=O09kyuVKhx5DnmVq0UhYwwe1Jjhy86WgZU1kNa9gJa4=; b=OQyi6/MttZj/zZn9QC3hk7+zy81gHJIxRaS9Nxl+w7JJe+qx9R6Bi90JNMXCG1PZZ9 polOL9Flyr4nAuf1RVxztYse4M3juvVpV9tZDoiekcgWVhXvmX2l8kCY4ywFF9C+hVAf 5N6fLyZkeqN3MeU3647pnguHOnyHTCWxXrms+xatGCpb6gbSDvCsi1GmOKaiC9oMpTQ4 RorjV1U4cf7bR6UbsoPNMTHqtIrRTrjHXZmyEtCKmTpkMXXdUVNna/RpSVxNI1SeQIC6 LXzim9EbRoTYfcfHb/ohTGsGbBIn5YftpZP8cqFA8aY7Cp8DBt9ZGvUaBWEl909nuL4m hvpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=O09kyuVKhx5DnmVq0UhYwwe1Jjhy86WgZU1kNa9gJa4=; b=WNyAW7Ert8TupmlklzTu5TkrdzB2Qd/srzvfJM19HuTbNls09lq9PPujBExdSXEByP Dv8sVzECuRZK49xQxk+WIBmRhOMHY/RZ+KQGwBZJ+OAgQbQIgY+JE91NFnWajHRRfJCF SmGLQgQEIYsg8d1TMdoCr3MFCRSUjnlxMT03+YTgEBV2NtAfENztQ+FkKqnboSdXU2NU 9+8WBnHa6Xfe9KZzLCTU5D99dvzTbB0xr7ncG9bfq/ijHEtjTTKERY7cU/6pnZKy89Ij tGgz9kx6rgUJkITIsRWSUVdNhzC20CzfTZeaVg+5kboyoA8wU1cwGDXh0F8Hj7vdewZH dQRw== X-Gm-Message-State: ANhLgQ2IOLLcr/pozkeIRYZpVLnvKw6FVpoJ/bQVUqV481KFPj5NXBMk /2kBkA61kkBomgbmCAxJvo8B+I2aApf92Q== X-Google-Smtp-Source: ADFU+vuLpeQIj7bC/dqVm2w5TRWJD8swrTVFIhjZ/l0aeqpsUy6twlGsoiRXkL1EJD0EC4cwIK4Qhg== X-Received: by 2002:ac8:72d1:: with SMTP id o17mr11246648qtp.347.1584134635431; Fri, 13 Mar 2020 14:23:55 -0700 (PDT) Received: from localhost ([107.15.81.208]) by smtp.gmail.com with ESMTPSA id q7sm797812qti.58.2020.03.13.14.23.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2020 14:23:54 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 13/13] btrfs: throttle snapshot delete on delayed refs Date: Fri, 13 Mar 2020 17:23:30 -0400 Message-Id: <20200313212330.149024-14-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200313212330.149024-1-josef@toxicpanda.com> References: <20200313212330.149024-1-josef@toxicpanda.com> MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org One of the largest generators of delayed refs is snapshot delete. This is because we'll walk down to a shared node/leaf and drop all of the references to the lower layer in that node/leaf. With our default nodesize of 16kib this can be hundreds of delayed refs, which can easily put us over our threshold for running delayed refs. Instead check and see if we need to throttle ourselves, and if we do break out with -EAGAIN. If this happens we do not want to do the walk_up_tree because we need to keep processing the node we're on. We also have to get rid of our BUG_ON(drop_level == 0) everywhere, because we can actually stop at the 0 level. Since we already have the ability to restart snapshot deletions from an arbitrary key this works out fine. Signed-off-by: Josef Bacik --- fs/btrfs/extent-tree.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index e490ce994d1d..718c99e5674f 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -4662,6 +4662,7 @@ struct walk_control { int reada_slot; int reada_count; int restarted; + int drop_subtree; }; #define DROP_REFERENCE 1 @@ -4766,6 +4767,21 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans, u64 flag = BTRFS_BLOCK_FLAG_FULL_BACKREF; int ret; + /* + * We only want to break if we aren't yet at the end of our leaf/node. + * The reason for this is if we're at DROP_REFERENCE we'll grab the + * current slot's key for the drop_progress. If we're at the end this + * will obviously go wrong. We are also not going to generate many more + * delayed refs at this point, so allowing us to continue will not hurt + * us. + */ + if (!wc->drop_subtree && + (path->slots[level] < btrfs_header_nritems(path->nodes[level])) && + btrfs_should_throttle_delayed_refs(fs_info, + &trans->transaction->delayed_refs, + true)) + return -EAGAIN; + if (wc->stage == UPDATE_BACKREF && btrfs_header_owner(eb) != root->root_key.objectid) return 1; @@ -5198,6 +5214,8 @@ static noinline int walk_down_tree(struct btrfs_trans_handle *trans, ret = walk_down_proc(trans, root, path, wc, lookup_info); if (ret > 0) break; + if (ret < 0) + return ret; if (level == 0) break; @@ -5332,7 +5350,6 @@ int btrfs_drop_snapshot(struct btrfs_root *root, sizeof(wc->update_progress)); level = root_item->drop_level; - BUG_ON(level == 0); path->lowest_level = level; ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); path->lowest_level = 0; @@ -5381,19 +5398,23 @@ int btrfs_drop_snapshot(struct btrfs_root *root, wc->update_ref = update_ref; wc->keep_locks = 0; wc->reada_count = BTRFS_NODEPTRS_PER_BLOCK(fs_info); + wc->drop_subtree = 0; while (1) { ret = walk_down_tree(trans, root, path, wc); - if (ret < 0) { - err = ret; - break; - } - - ret = walk_up_tree(trans, root, path, wc, BTRFS_MAX_LEVEL); - if (ret < 0) { + if (ret < 0 && ret != -EAGAIN) { err = ret; break; + } else if (ret != -EAGAIN) { + ret = walk_up_tree(trans, root, path, wc, + BTRFS_MAX_LEVEL); + if (ret < 0) { + err = ret; + break; + } + } else { + ret = 0; } if (ret > 0) { @@ -5411,7 +5432,6 @@ int btrfs_drop_snapshot(struct btrfs_root *root, &wc->drop_progress); root_item->drop_level = wc->drop_level; - BUG_ON(wc->level == 0); if (btrfs_should_end_transaction(trans) || (!for_reloc && btrfs_need_cleaner_sleep(fs_info))) { ret = btrfs_update_root(trans, tree_root, @@ -5544,6 +5564,7 @@ int btrfs_drop_subtree(struct btrfs_trans_handle *trans, wc->stage = DROP_REFERENCE; wc->update_ref = 0; wc->keep_locks = 1; + wc->drop_subtree = 1; wc->reada_count = BTRFS_NODEPTRS_PER_BLOCK(fs_info); while (1) {