linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Naohiro Aota <naohiro.aota@wdc.com>
To: Johannes Thumshirn <jthumshirn@suse.de>
Cc: linux-btrfs@vger.kernel.org, David Sterba <dsterba@suse.com>,
	Chris Mason <clm@fb.com>, Josef Bacik <josef@toxicpanda.com>,
	Nikolay Borisov <nborisov@suse.com>,
	Damien Le Moal <damien.lemoal@wdc.com>,
	Hannes Reinecke <hare@suse.com>,
	Anand Jain <anand.jain@oracle.com>,
	linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH v5 02/28] btrfs: Get zone information of zoned block devices
Date: Thu, 5 Dec 2019 15:28:17 +0900	[thread overview]
Message-ID: <20191205062817.5mtuatqlzeyetcwv@naota.dhcp.fujisawa.hgst.com> (raw)
In-Reply-To: <20191204153732.GA2083@Johanness-MacBook-Pro.local>

On Wed, Dec 04, 2019 at 04:37:32PM +0100, Johannes Thumshirn wrote:
>On Wed, Dec 04, 2019 at 05:17:09PM +0900, Naohiro Aota wrote:
>[..]
>
>> +#define LEN (sizeof(device->fs_info->sb->s_id) + sizeof("(device )") - 1)
>> +	char devstr[LEN];
>> +	const int len = LEN;
>> +#undef LEN
>
>Why not:
>	const int len = sizeof(device->fs_info->sb->s_id)
>					+ sizeof("(device )") - 1;
>	char devstr[len];
>
>But that's bikeshedding territory I admit.

I once tried that way, but it shows a "warning: ISO C90 forbids array
‘devstr’ whose size can’t be evaluated". So, I avoided that.

>
>> +
>> +	if (!bdev_is_zoned(bdev))
>> +		return 0;
>> +
>> +	zone_info = kzalloc(sizeof(*zone_info), GFP_KERNEL);
>> +	if (!zone_info)
>> +		return -ENOMEM;
>> +
>> +	zone_sectors = bdev_zone_sectors(bdev);
>> +	ASSERT(is_power_of_2(zone_sectors));
>> +	zone_info->zone_size = (u64)zone_sectors << SECTOR_SHIFT;
>> +	zone_info->zone_size_shift = ilog2(zone_info->zone_size);
>> +	zone_info->nr_zones = nr_sectors >> ilog2(bdev_zone_sectors(bdev));
>> +	if (nr_sectors & (bdev_zone_sectors(bdev) - 1))
>> +		zone_info->nr_zones++;
>
>You've already cached the return of bdev_zone_sectors(bdev) in
>zone_sectors at the beginning of this block and if (x & (y-1)) is the
>IS_ALIGNED() macro so the above should really be:
>	if (!IS_ALIGNED(nr_sectors, zone_sectors))
>		zone_info->nr_zones++;
>
>

Great. That's much clear.

>> +
>> +	zone_info->seq_zones = kcalloc(BITS_TO_LONGS(zone_info->nr_zones),
>> +				       sizeof(*zone_info->seq_zones),
>> +				       GFP_KERNEL);
>
>	zone_info->seq_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
>
>> +	if (!zone_info->seq_zones) {
>> +		ret = -ENOMEM;
>> +		goto free_zone_info;
>> +	}
>> +
>> +	zone_info->empty_zones = kcalloc(BITS_TO_LONGS(zone_info->nr_zones),
>> +					 sizeof(*zone_info->empty_zones),
>> +					 GFP_KERNEL);
>	
>	zone_info->empty_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
>

Thanks, I'll use the bitmap allocation helpers in the next version.

>> +	if (!zone_info->empty_zones) {
>> +		ret = -ENOMEM;
>> +		goto free_seq_zones;
>> +	}
>> +
>> +	zones = kcalloc(BTRFS_REPORT_NR_ZONES,
>> +			sizeof(struct blk_zone), GFP_KERNEL);
>> +	if (!zones) {
>> +		ret = -ENOMEM;
>> +		goto free_empty_zones;
>> +	}
>> +
>
>I personally would set nreported = 0 here instead in the declaration block. I
>had to scroll up to see what's the initial value, so I think it makes more
>sense to initialize it to 0 here.
>

OK, I'll do so.

>> +	/* Get zones type */
>> +	while (sector < nr_sectors) {
>> +		nr_zones = BTRFS_REPORT_NR_ZONES;
>> +		ret = btrfs_get_dev_zones(device, sector << SECTOR_SHIFT, zones,
>> +					  &nr_zones);
>> +		if (ret)
>> +			goto free_zones;
>> +
>> +		for (i = 0; i < nr_zones; i++) {
>> +			if (zones[i].type == BLK_ZONE_TYPE_SEQWRITE_REQ)
>> +				set_bit(nreported, zone_info->seq_zones);
>> +			if (zones[i].cond == BLK_ZONE_COND_EMPTY)
>> +				set_bit(nreported, zone_info->empty_zones);
>> +			nreported++;
>> +		}
>> +		sector = zones[nr_zones - 1].start + zones[nr_zones - 1].len;
>> +	}
>> +
>> +	if (nreported != zone_info->nr_zones) {
>> +		btrfs_err_in_rcu(device->fs_info,
>> +				 "inconsistent number of zones on %s (%u / %u)",
>> +				 rcu_str_deref(device->name), nreported,
>> +				 zone_info->nr_zones);
>> +		ret = -EIO;
>> +		goto free_zones;
>> +	}
>> +
>> +	kfree(zones);
>> +
>> +	device->zone_info = zone_info;
>> +
>> +	devstr[0] = 0;
>> +	if (device->fs_info)
>> +		snprintf(devstr, len, " (device %s)",
>> +			 device->fs_info->sb->s_id);
>> +
>> +	rcu_read_lock();
>> +	pr_info(
>> +"BTRFS info%s: host-%s zoned block device %s, %u zones of %llu sectors",
>> +		devstr,
>> +		bdev_zoned_model(bdev) == BLK_ZONED_HM ? "managed" : "aware",
>> +		rcu_str_deref(device->name), zone_info->nr_zones,
>> +		zone_info->zone_size >> SECTOR_SHIFT);
>> +	rcu_read_unlock();
>
>btrfs_info_in_rcu()?
>

Since this function is called before btrfs set "fs_info->sb->s_id",
btrfs_info_in_rcu() prints like "BTRFS info (device <unknown>) ...", which
is annoying. I intentionally used pr_info() and rcu_read_{lock,unlock} here
to show a cleaner print.

>> +
>> +	return 0;
>> +
>> +free_zones:
>> +	kfree(zones);
>> +free_empty_zones:
>> +	kfree(zone_info->empty_zones);
>	
>	bitmap_free(zone_info->empty_zones);
>
>> +free_seq_zones:
>> +	kfree(zone_info->seq_zones);
> 	
>	bitmap_free(zone_info->seq_zones);
>
>> +free_zone_info:
>> +	kfree(zone_info);
>> +
>> +	return ret;
>> +}
>> +
>> +void btrfs_destroy_dev_zone_info(struct btrfs_device *device)
>> +{
>> +	struct btrfs_zoned_device_info *zone_info = device->zone_info;
>> +
>> +	if (!zone_info)
>> +		return;
>> +
>> +	kfree(zone_info->seq_zones);
>> +	kfree(zone_info->empty_zones);
>
>	bitmap_free(zone_info->seq_zones);
>	bitmap_free(zone_info->empty_zones);
>
>Thanks,
>	Johannes

  parent reply	other threads:[~2019-12-05  6:28 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-04  8:17 [PATCH v5 00/28] btrfs: zoned block device support Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 01/28] btrfs: introduce HMZONED feature flag Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 02/28] btrfs: Get zone information of zoned block devices Naohiro Aota
2019-12-04 15:37   ` Johannes Thumshirn
2019-12-04 17:22     ` David Sterba
2019-12-05  6:29       ` Naohiro Aota
2019-12-05  6:28     ` Naohiro Aota [this message]
2019-12-07  9:47   ` Anand Jain
2019-12-10  4:41     ` Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 03/28] btrfs: Check and enable HMZONED mode Naohiro Aota
2019-12-04 16:07   ` Johannes Thumshirn
2019-12-05  5:17     ` Naohiro Aota
2019-12-05 15:28       ` David Sterba
2019-12-04  8:17 ` [PATCH v5 04/28] btrfs: disallow RAID5/6 in " Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 05/28] btrfs: disallow space_cache " Naohiro Aota
2019-12-05  7:21   ` Johannes Thumshirn
2019-12-05 15:39   ` David Sterba
2019-12-06  5:32     ` Naohiro Aota
2019-12-06 15:12       ` David Sterba
2019-12-04  8:17 ` [PATCH v5 06/28] btrfs: disallow NODATACOW " Naohiro Aota
2019-12-05  7:58   ` Johannes Thumshirn
2019-12-05 15:31   ` David Sterba
2019-12-06  5:37     ` Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 07/28] btrfs: disable fallocate " Naohiro Aota
2019-12-05  8:00   ` Johannes Thumshirn
2019-12-04  8:17 ` [PATCH v5 08/28] btrfs: implement log-structured superblock for " Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 09/28] btrfs: align device extent allocation to zone boundary Naohiro Aota
2019-12-05  8:56   ` Johannes Thumshirn
2019-12-06  5:45     ` Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 10/28] btrfs: do sequential extent allocation in HMZONED mode Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 11/28] btrfs: make unmirroed BGs readonly only if we have at least one writable BG Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 12/28] btrfs: ensure metadata space available on/after degraded mount in HMZONED Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 13/28] btrfs: reset zones of unused block groups Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 14/28] btrfs: redirty released extent buffers in HMZONED mode Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 15/28] btrfs: serialize data allocation and submit IOs Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 16/28] btrfs: implement atomic compressed IO submission Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 17/28] btrfs: support direct write IO in HMZONED Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 18/28] btrfs: serialize meta IOs on HMZONED mode Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 19/28] btrfs: wait existing extents before truncating Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 20/28] btrfs: avoid async checksum on HMZONED mode Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 21/28] btrfs: disallow mixed-bg in " Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 22/28] btrfs: disallow inode_cache " Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 23/28] btrfs: support dev-replace " Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 24/28] btrfs: enable relocation " Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 25/28] btrfs: relocate block group to repair IO failure in HMZONED Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 26/28] btrfs: split alloc_log_tree() Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 27/28] btrfs: enable tree-log on HMZONED mode Naohiro Aota
2019-12-04  8:17 ` [PATCH v5 28/28] btrfs: enable to mount HMZONED incompat flag Naohiro Aota

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=20191205062817.5mtuatqlzeyetcwv@naota.dhcp.fujisawa.hgst.com \
    --to=naohiro.aota@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=jthumshirn@suse.de \
    --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).