From: Ming Lei <ming.lei@redhat.com>
To: Yu Kuai <yukuai1@huaweicloud.com>
Cc: axboe@kernel.dk, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org, yukuai3@huawei.com,
yi.zhang@huawei.com, yangerkun@huawei.com
Subject: Re: [PATCH v2 1/2] block: introduce new field flags in block_device
Date: Tue, 21 Nov 2023 17:33:16 +0800 [thread overview]
Message-ID: <ZVx5XE3o+D8pGPib@fedora> (raw)
In-Reply-To: <20231121111927.2021846-2-yukuai1@huaweicloud.com>
On Tue, Nov 21, 2023 at 07:19:26PM +0800, Yu Kuai wrote:
> From: Yu Kuai <yukuai3@huawei.com>
>
> There are multiple switches in struct block_device, use separate bool
> fields for them is not gracefully. Add a new field flags and replace
> swithes to a bit, there are no functional changes, and preare to add
> a new switch in the next patch.
>
> In order to keep flags in the first cacheline, define it as u32 and add
> new helpers to set/clear/test each bit like 'bio->bi_flags'.
>
> Signed-off-by: Yu Kuai <yukuai3@huawei.com>
> ---
> block/bdev.c | 15 ++++++++-------
> block/blk-core.c | 7 ++++---
> block/genhd.c | 15 +++++++++++----
> block/ioctl.c | 6 +++++-
> include/linux/blk_types.h | 27 +++++++++++++++++++++------
> include/linux/blkdev.h | 5 +++--
> 6 files changed, 52 insertions(+), 23 deletions(-)
>
> diff --git a/block/bdev.c b/block/bdev.c
> index fc8d28d77495..6b420cbd4f3d 100644
> --- a/block/bdev.c
> +++ b/block/bdev.c
> @@ -408,10 +408,10 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
> bdev->bd_partno = partno;
> bdev->bd_inode = inode;
> bdev->bd_queue = disk->queue;
> - if (partno)
> - bdev->bd_has_submit_bio = disk->part0->bd_has_submit_bio;
> + if (partno && bdev_flagged(disk->part0, BD_FLAG_HAS_SUBMIT_BIO))
> + bdev_set_flag(bdev, BD_FLAG_HAS_SUBMIT_BIO);
> else
> - bdev->bd_has_submit_bio = false;
> + bdev_clear_flag(bdev, BD_FLAG_HAS_SUBMIT_BIO);
> bdev->bd_stats = alloc_percpu(struct disk_stats);
> if (!bdev->bd_stats) {
> iput(inode);
> @@ -612,7 +612,7 @@ static void bd_end_claim(struct block_device *bdev, void *holder)
> bdev->bd_holder = NULL;
> bdev->bd_holder_ops = NULL;
> mutex_unlock(&bdev->bd_holder_lock);
> - if (bdev->bd_write_holder)
> + if (bdev_flagged(bdev, BD_FLAG_WRITE_HOLDER))
> unblock = true;
> }
> if (!whole->bd_holders)
> @@ -625,7 +625,7 @@ static void bd_end_claim(struct block_device *bdev, void *holder)
> */
> if (unblock) {
> disk_unblock_events(bdev->bd_disk);
> - bdev->bd_write_holder = false;
> + bdev_clear_flag(bdev, BD_FLAG_WRITE_HOLDER);
> }
> }
>
> @@ -878,9 +878,10 @@ struct bdev_handle *bdev_open_by_dev(dev_t dev, blk_mode_t mode, void *holder,
> * writeable reference is too fragile given the way @mode is
> * used in blkdev_get/put().
> */
> - if ((mode & BLK_OPEN_WRITE) && !bdev->bd_write_holder &&
> + if ((mode & BLK_OPEN_WRITE) &&
> + !bdev_flagged(bdev, BD_FLAG_WRITE_HOLDER) &&
> (disk->event_flags & DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE)) {
> - bdev->bd_write_holder = true;
> + bdev_set_flag(bdev, BD_FLAG_WRITE_HOLDER);
> unblock_events = false;
> }
> }
> diff --git a/block/blk-core.c b/block/blk-core.c
> index fdf25b8d6e78..f9f8b12ba626 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -482,7 +482,8 @@ __setup("fail_make_request=", setup_fail_make_request);
>
> bool should_fail_request(struct block_device *part, unsigned int bytes)
> {
> - return part->bd_make_it_fail && should_fail(&fail_make_request, bytes);
> + return bdev_flagged(part, BD_FLAG_MAKE_IT_FAIL) &&
> + should_fail(&fail_make_request, bytes);
> }
>
> static int __init fail_make_request_debugfs(void)
> @@ -595,7 +596,7 @@ static void __submit_bio(struct bio *bio)
> if (unlikely(!blk_crypto_bio_prep(&bio)))
> return;
>
> - if (!bio->bi_bdev->bd_has_submit_bio) {
> + if (!bdev_flagged(bio->bi_bdev, BD_FLAG_HAS_SUBMIT_BIO)) {
> blk_mq_submit_bio(bio);
> } else if (likely(bio_queue_enter(bio) == 0)) {
> struct gendisk *disk = bio->bi_bdev->bd_disk;
> @@ -703,7 +704,7 @@ void submit_bio_noacct_nocheck(struct bio *bio)
> */
> if (current->bio_list)
> bio_list_add(¤t->bio_list[0], bio);
> - else if (!bio->bi_bdev->bd_has_submit_bio)
> + else if (!bdev_flagged(bio->bi_bdev, BD_FLAG_HAS_SUBMIT_BIO))
> __submit_bio_noacct_mq(bio);
> else
> __submit_bio_noacct(bio);
> diff --git a/block/genhd.c b/block/genhd.c
> index c9d06f72c587..57f96c0c8da0 100644
> --- a/block/genhd.c
> +++ b/block/genhd.c
> @@ -413,7 +413,8 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
> elevator_init_mq(disk->queue);
>
> /* Mark bdev as having a submit_bio, if needed */
> - disk->part0->bd_has_submit_bio = disk->fops->submit_bio != NULL;
> + if (disk->fops->submit_bio)
> + bdev_set_flag(disk->part0, BD_FLAG_HAS_SUBMIT_BIO);
>
> /*
> * If the driver provides an explicit major number it also must provide
> @@ -1062,7 +1063,8 @@ static DEVICE_ATTR(diskseq, 0444, diskseq_show, NULL);
> ssize_t part_fail_show(struct device *dev,
> struct device_attribute *attr, char *buf)
> {
> - return sprintf(buf, "%d\n", dev_to_bdev(dev)->bd_make_it_fail);
> + return sprintf(buf, "%d\n",
> + bdev_flagged(dev_to_bdev(dev), BD_FLAG_MAKE_IT_FAIL));
> }
>
> ssize_t part_fail_store(struct device *dev,
> @@ -1071,8 +1073,13 @@ ssize_t part_fail_store(struct device *dev,
> {
> int i;
>
> - if (count > 0 && sscanf(buf, "%d", &i) > 0)
> - dev_to_bdev(dev)->bd_make_it_fail = i;
> + if (count > 0 && sscanf(buf, "%d", &i) > 0) {
> + if (!i)
> + bdev_clear_flag(dev_to_bdev(dev), BD_FLAG_MAKE_IT_FAIL);
> + else
> + bdev_set_flag(dev_to_bdev(dev), BD_FLAG_MAKE_IT_FAIL);
> +
> + }
>
> return count;
> }
> diff --git a/block/ioctl.c b/block/ioctl.c
> index 4160f4e6bd5b..a64440f4c96b 100644
> --- a/block/ioctl.c
> +++ b/block/ioctl.c
> @@ -394,7 +394,11 @@ static int blkdev_roset(struct block_device *bdev, unsigned cmd,
> if (ret)
> return ret;
> }
> - bdev->bd_read_only = n;
> +
> + if (!n)
> + bdev_clear_flag(bdev, BD_FLAG_READ_ONLY);
> + else
> + bdev_set_flag(bdev, BD_FLAG_READ_ONLY);
> return 0;
> }
>
> diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
> index 52e264d5a830..f7a7965eeb25 100644
> --- a/include/linux/blk_types.h
> +++ b/include/linux/blk_types.h
> @@ -37,6 +37,11 @@ struct bio_crypt_ctx;
> #define PAGE_SECTORS (1 << PAGE_SECTORS_SHIFT)
> #define SECTOR_MASK (PAGE_SECTORS - 1)
>
> +#define BD_FLAG_READ_ONLY 0 /* read-only-policy */
> +#define BD_FLAG_WRITE_HOLDER 1
> +#define BD_FLAG_HAS_SUBMIT_BIO 2
> +#define BD_FLAG_MAKE_IT_FAIL 3
> +
> struct block_device {
> sector_t bd_start_sect;
> sector_t bd_nr_sectors;
> @@ -44,10 +49,8 @@ struct block_device {
> struct request_queue * bd_queue;
> struct disk_stats __percpu *bd_stats;
> unsigned long bd_stamp;
> - bool bd_read_only; /* read-only policy */
> + unsigned int bd_flags;
> u8 bd_partno;
> - bool bd_write_holder;
> - bool bd_has_submit_bio;
> dev_t bd_dev;
> atomic_t bd_openers;
> spinlock_t bd_size_lock; /* for bd_inode->i_size updates */
As I mentioned, you can convert the above/original 4 fields into single
'unsigned int', otherwise one extra 'int' filed is added. Then, 'bd_size_lock'
is moved to the 2nd cache line, which isn't big deal since the field isn't
touched in fast path. Anyway, it can be one future cleanup, so:
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Thanks,
Ming
next prev parent reply other threads:[~2023-11-21 9:33 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-21 11:19 [PATCH v2 0/2] block: warn once for each partition in bio_check_ro() Yu Kuai
2023-11-21 11:19 ` [PATCH v2 1/2] block: introduce new field flags in block_device Yu Kuai
2023-11-21 9:33 ` Ming Lei [this message]
2023-11-21 11:06 ` Yu Kuai
2023-11-21 11:19 ` [PATCH v2 2/2] block: warn once for each partition in bio_check_ro() Yu Kuai
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=ZVx5XE3o+D8pGPib@fedora \
--to=ming.lei@redhat.com \
--cc=axboe@kernel.dk \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=yangerkun@huawei.com \
--cc=yi.zhang@huawei.com \
--cc=yukuai1@huaweicloud.com \
--cc=yukuai3@huawei.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.