From: Naohiro Aota <naohiro.aota@wdc.com>
To: linux-btrfs@vger.kernel.org, David Sterba <dsterba@suse.com>
Cc: Chris Mason <clm@fb.com>, Josef Bacik <josef@toxicpanda.com>,
Nikolay Borisov <nborisov@suse.com>,
Damien Le Moal <damien.lemoal@wdc.com>,
Johannes Thumshirn <Johannes.Thumshirn@wdc.com>,
Hannes Reinecke <hare@suse.com>,
Anand Jain <anand.jain@oracle.com>,
linux-fsdevel@vger.kernel.org,
Naohiro Aota <naohiro.aota@wdc.com>
Subject: [PATCH v2 06/21] btrfs: factor out init_alloc_chunk_ctl
Date: Wed, 12 Feb 2020 16:20:33 +0900 [thread overview]
Message-ID: <20200212072048.629856-7-naohiro.aota@wdc.com> (raw)
In-Reply-To: <20200212072048.629856-1-naohiro.aota@wdc.com>
Factor out init_alloc_chunk_ctl() from __btrfs_alloc_chunk(). This function
initialises parameters of "struct alloc_chunk_ctl" for allocation.
init_alloc_chunk_ctl() handles a common part of the initialisation to load
the RAID parameters from btrfs_raid_array.
init_alloc_chunk_ctl_policy_regular() decides some parameters for its
allocation.
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
---
fs/btrfs/volumes.c | 97 ++++++++++++++++++++++++++++------------------
1 file changed, 60 insertions(+), 37 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index ed90e9d2bd9b..9181e3ab617d 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -4841,6 +4841,61 @@ struct alloc_chunk_ctl {
int ndevs;
};
+static void
+init_alloc_chunk_ctl_policy_regular(struct btrfs_fs_devices *fs_devices,
+ struct alloc_chunk_ctl *ctl)
+{
+ u64 type = ctl->type;
+
+ if (type & BTRFS_BLOCK_GROUP_DATA) {
+ ctl->max_stripe_size = SZ_1G;
+ ctl->max_chunk_size = BTRFS_MAX_DATA_CHUNK_SIZE;
+ } else if (type & BTRFS_BLOCK_GROUP_METADATA) {
+ /* for larger filesystems, use larger metadata chunks */
+ if (fs_devices->total_rw_bytes > 50ULL * SZ_1G)
+ ctl->max_stripe_size = SZ_1G;
+ else
+ ctl->max_stripe_size = SZ_256M;
+ ctl->max_chunk_size = ctl->max_stripe_size;
+ } else if (type & BTRFS_BLOCK_GROUP_SYSTEM) {
+ ctl->max_stripe_size = SZ_32M;
+ ctl->max_chunk_size = 2 * ctl->max_stripe_size;
+ ctl->devs_max = min_t(int, ctl->devs_max,
+ BTRFS_MAX_DEVS_SYS_CHUNK);
+ } else {
+ BUG();
+ }
+
+ /* We don't want a chunk larger than 10% of writable space */
+ ctl->max_chunk_size = min(div_factor(fs_devices->total_rw_bytes, 1),
+ ctl->max_chunk_size);
+}
+
+static void init_alloc_chunk_ctl(struct btrfs_fs_devices *fs_devices,
+ struct alloc_chunk_ctl *ctl)
+{
+ int index = btrfs_bg_flags_to_raid_index(ctl->type);
+
+ ctl->sub_stripes = btrfs_raid_array[index].sub_stripes;
+ ctl->dev_stripes = btrfs_raid_array[index].dev_stripes;
+ ctl->devs_max = btrfs_raid_array[index].devs_max;
+ if (!ctl->devs_max)
+ ctl->devs_max = BTRFS_MAX_DEVS(fs_devices->fs_info);
+ ctl->devs_min = btrfs_raid_array[index].devs_min;
+ ctl->devs_increment = btrfs_raid_array[index].devs_increment;
+ ctl->ncopies = btrfs_raid_array[index].ncopies;
+ ctl->nparity = btrfs_raid_array[index].nparity;
+ ctl->ndevs = 0;
+
+ switch (fs_devices->chunk_alloc_policy) {
+ case BTRFS_CHUNK_ALLOC_REGULAR:
+ init_alloc_chunk_ctl_policy_regular(fs_devices, ctl);
+ break;
+ default:
+ BUG();
+ }
+}
+
static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
u64 start, u64 type)
{
@@ -4859,7 +4914,6 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
int ndevs;
int i;
int j;
- int index;
if (!alloc_profile_is_valid(type, 0)) {
ASSERT(0);
@@ -4872,45 +4926,14 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
return -ENOSPC;
}
- ctl.start = start;
- ctl.type = type;
-
- index = btrfs_bg_flags_to_raid_index(type);
-
- ctl.sub_stripes = btrfs_raid_array[index].sub_stripes;
- ctl.dev_stripes = btrfs_raid_array[index].dev_stripes;
- ctl.devs_max = btrfs_raid_array[index].devs_max;
- if (!ctl.devs_max)
- ctl.devs_max = BTRFS_MAX_DEVS(info);
- ctl.devs_min = btrfs_raid_array[index].devs_min;
- ctl.devs_increment = btrfs_raid_array[index].devs_increment;
- ctl.ncopies = btrfs_raid_array[index].ncopies;
- ctl.nparity = btrfs_raid_array[index].nparity;
-
- if (type & BTRFS_BLOCK_GROUP_DATA) {
- ctl.max_stripe_size = SZ_1G;
- ctl.max_chunk_size = BTRFS_MAX_DATA_CHUNK_SIZE;
- } else if (type & BTRFS_BLOCK_GROUP_METADATA) {
- /* for larger filesystems, use larger metadata chunks */
- if (fs_devices->total_rw_bytes > 50ULL * SZ_1G)
- ctl.max_stripe_size = SZ_1G;
- else
- ctl.max_stripe_size = SZ_256M;
- ctl.max_chunk_size = ctl.max_stripe_size;
- } else if (type & BTRFS_BLOCK_GROUP_SYSTEM) {
- ctl.max_stripe_size = SZ_32M;
- ctl.max_chunk_size = 2 * ctl.max_stripe_size;
- ctl.devs_max = min_t(int, ctl.devs_max,
- BTRFS_MAX_DEVS_SYS_CHUNK);
- } else {
- btrfs_err(info, "invalid chunk type 0x%llx requested",
- type);
+ if (!(type & BTRFS_BLOCK_GROUP_TYPE_MASK)) {
+ btrfs_err(info, "invalid chunk type 0x%llx requested", type);
BUG();
}
- /* We don't want a chunk larger than 10% of writable space */
- ctl.max_chunk_size = min(div_factor(fs_devices->total_rw_bytes, 1),
- ctl.max_chunk_size);
+ ctl.start = start;
+ ctl.type = type;
+ init_alloc_chunk_ctl(fs_devices, &ctl);
devices_info = kcalloc(fs_devices->rw_devices, sizeof(*devices_info),
GFP_NOFS);
--
2.25.0
next prev parent reply other threads:[~2020-02-12 7:21 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-12 7:20 [PATCH v2 00/21] btrfs: refactor and generalize chunk/dev_extent/extent allocation Naohiro Aota
2020-02-12 7:20 ` [PATCH v2 01/21] btrfs: change type of full_search to bool Naohiro Aota
2020-02-12 7:20 ` [PATCH v2 02/21] btrfs: do not BUG_ON with invalid profile Naohiro Aota
2020-02-12 7:58 ` Johannes Thumshirn
2020-02-12 14:14 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 03/21] btrfs: introduce chunk allocation policy Naohiro Aota
2020-02-12 7:20 ` [PATCH v2 04/21] btrfs: refactor find_free_dev_extent_start() Naohiro Aota
2020-02-12 14:16 ` Josef Bacik
2020-02-13 11:32 ` Johannes Thumshirn
2020-02-12 7:20 ` [PATCH v2 05/21] btrfs: introduce alloc_chunk_ctl Naohiro Aota
2020-02-12 8:00 ` Johannes Thumshirn
2020-02-13 16:17 ` Josef Bacik
2020-02-12 7:20 ` Naohiro Aota [this message]
2020-02-13 16:20 ` [PATCH v2 06/21] btrfs: factor out init_alloc_chunk_ctl Josef Bacik
2020-02-12 7:20 ` [PATCH v2 07/21] btrfs: factor out gather_device_info() Naohiro Aota
2020-02-12 8:04 ` Johannes Thumshirn
2020-02-12 7:20 ` [PATCH v2 08/21] btrfs: factor out decide_stripe_size() Naohiro Aota
2020-02-12 7:20 ` [PATCH v2 09/21] btrfs: factor out create_chunk() Naohiro Aota
2020-02-12 8:07 ` Johannes Thumshirn
2020-02-13 16:24 ` Josef Bacik
2020-02-20 10:17 ` Naohiro Aota
2020-02-12 7:20 ` [PATCH v2 10/21] btrfs: parameterize dev_extent_min Naohiro Aota
2020-02-13 16:27 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 11/21] btrfs: introduce extent allocation policy Naohiro Aota
2020-02-13 19:55 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 12/21] btrfs: move hint_byte into find_free_extent_ctl Naohiro Aota
2020-02-12 14:11 ` Johannes Thumshirn
2020-02-13 19:56 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 13/21] btrfs: move vairalbes for clustered allocation " Naohiro Aota
2020-02-12 14:14 ` Johannes Thumshirn
2020-02-13 19:57 ` Josef Bacik
2020-02-20 14:27 ` Christoph Hellwig
2020-02-12 7:20 ` [PATCH v2 14/21] btrfs: factor out do_allocation() Naohiro Aota
2020-02-12 14:45 ` Johannes Thumshirn
2020-02-13 19:57 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 15/21] btrfs: drop unnecessary arguments from clustered allocation functions Naohiro Aota
2020-02-12 14:47 ` Johannes Thumshirn
2020-02-13 19:58 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 16/21] btrfs: factor out release_block_group() Naohiro Aota
2020-02-12 14:48 ` Johannes Thumshirn
2020-02-13 19:58 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 17/21] btrfs: factor out found_extent() Naohiro Aota
2020-02-12 14:50 ` Johannes Thumshirn
2020-02-13 19:58 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 18/21] btrfs: drop unnecessary arguments from find_free_extent_update_loop() Naohiro Aota
2020-02-12 14:51 ` Johannes Thumshirn
2020-02-13 19:58 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 19/21] btrfs: factor out chunk_allocation_failed() Naohiro Aota
2020-02-12 14:56 ` Johannes Thumshirn
2020-02-13 19:52 ` Josef Bacik
2020-02-20 9:57 ` Naohiro Aota
2020-02-12 7:20 ` [PATCH v2 20/21] btrfs: skip LOOP_NO_EMPTY_SIZE if not clustered allocation Naohiro Aota
2020-02-13 19:55 ` Josef Bacik
2020-02-20 9:56 ` Naohiro Aota
2020-02-20 15:40 ` Josef Bacik
2020-02-12 7:20 ` [PATCH v2 21/21] btrfs: factor out prepare_allocation() Naohiro Aota
2020-02-13 19:59 ` Josef Bacik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200212072048.629856-7-naohiro.aota@wdc.com \
--to=naohiro.aota@wdc.com \
--cc=Johannes.Thumshirn@wdc.com \
--cc=anand.jain@oracle.com \
--cc=clm@fb.com \
--cc=damien.lemoal@wdc.com \
--cc=dsterba@suse.com \
--cc=hare@suse.com \
--cc=josef@toxicpanda.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=nborisov@suse.com \
/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).