All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@zeniv.linux.org.uk>
To: Christoph Hellwig <hch@lst.de>
Cc: linux-fsdevel@vger.kernel.org, Yu Kuai <yukuai1@huaweicloud.com>,
	linux-block@vger.kernel.org,
	Christian Brauner <brauner@kernel.org>,
	Jens Axboe <axboe@kernel.dk>
Subject: Re: [PATCHES][RFC] packing struct block_device flags
Date: Mon, 29 Apr 2024 18:02:09 +0100	[thread overview]
Message-ID: <20240429170209.GA2118490@ZenIV> (raw)
In-Reply-To: <20240429073107.GZ2118490@ZenIV>

On Mon, Apr 29, 2024 at 08:31:07AM +0100, Al Viro wrote:

> FWIW, we could go for atomic_t there and use
> 	atomic_read() & 0xff
> for partno, with atomic_or()/atomic_and() for set/clear and
> atomic_read() & constant for test.  That might slightly optimize
> set/clear on some architectures, but setting/clearing flags is
> nowhere near hot enough for that to make a difference.

Incremental for that (would be folded into 3/8 if we went that way)
is below; again, I'm not at all sure it's idiomatic enough to bother
with, but that should at least show what's going on:

diff --git a/block/bdev.c b/block/bdev.c
index 9aa23620fe92..fae30eae7741 100644
--- a/block/bdev.c
+++ b/block/bdev.c
@@ -411,7 +411,7 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
 	mutex_init(&bdev->bd_fsfreeze_mutex);
 	spin_lock_init(&bdev->bd_size_lock);
 	mutex_init(&bdev->bd_holder_lock);
-	bdev->__bd_flags = partno;
+	atomic_set(&bdev->__bd_flags, partno);
 	bdev->bd_inode = inode;
 	bdev->bd_queue = disk->queue;
 	if (partno && bdev_test_flag(disk->part0, BD_HAS_SUBMIT_BIO))
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index 98e1c2d28d60..a822911e28e5 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -45,7 +45,7 @@ struct block_device {
 	struct request_queue *	bd_queue;
 	struct disk_stats __percpu *bd_stats;
 	unsigned long		bd_stamp;
-	u32			__bd_flags;	// partition number + flags
+	atomic_t		__bd_flags;	// partition number + flags
 	dev_t			bd_dev;
 	struct inode		*bd_inode;	/* will die */
 
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index d556cec9224b..a8271497ac62 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -722,38 +722,22 @@ void disk_uevent(struct gendisk *disk, enum kobject_action action);
 
 static inline u8 bdev_partno(const struct block_device *bdev)
 {
-	return bdev->__bd_flags & 0xff;
+	return atomic_read(&bdev->__bd_flags) & 0xff;
 }
 
 static inline bool bdev_test_flag(const struct block_device *bdev, int flag)
 {
-	return bdev->__bd_flags & (1 << (flag + 8));
+	return atomic_read(&bdev->__bd_flags) & (1 << (flag + 8));
 }
 
 static inline void bdev_set_flag(struct block_device *bdev, int flag)
 {
-	u32 v = bdev->__bd_flags;
-
-	for (;;) {
-		u32 w = cmpxchg(&bdev->__bd_flags, v, v | (1 << (flag + 8)));
-
-		if (v == w)
-			return;
-		v = w;
-	}
+	atomic_or(1 << (flag + 8), &bdev->__bd_flags);
 }
 
 static inline void bdev_clear_flag(struct block_device *bdev, int flag)
 {
-	u32 v = bdev->__bd_flags;
-
-	for (;;) {
-		u32 w = cmpxchg(&bdev->__bd_flags, v, v & ~(1 << (flag + 8)));
-
-		if (v == w)
-			return;
-		v = w;
-	}
+	atomic_and(~(1 << (flag + 8)), &bdev->__bd_flags);
 }
 
 static inline int get_disk_ro(struct gendisk *disk)

  reply	other threads:[~2024-04-29 17:02 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-28  5:12 [PATCHES][RFC] packing struct block_device flags Al Viro
2024-04-28  5:14 ` [PATCH 1/8] Use bdev_is_paritition() instead of open-coding it Al Viro
2024-04-29  5:19   ` Christoph Hellwig
2024-04-28  5:15 ` [PATCH 2/8] wrapper for access to ->bd_partno Al Viro
2024-04-28  5:16 ` [PATCH 3/8] bdev: infrastructure for flags Al Viro
2024-04-28  5:17 ` [PATCH 4/8] bdev: move ->bd_read_only to ->__bd_flags Al Viro
2024-04-28  5:18 ` [PATCH 5/8] bdev: move ->bd_write_holder into ->__bd_flags Al Viro
2024-04-28  5:19 ` [PATCH 6/8] bdev: move ->bd_has_subit_bio to ->__bd_flags Al Viro
2024-04-28  5:19 ` [PATCH 7/8] bdev: move ->bd_ro_warned " Al Viro
2024-04-28  5:21 ` [PATCH 8/8] bdev: move ->bd_make_it_fail " Al Viro
2024-04-29  5:23 ` [PATCHES][RFC] packing struct block_device flags Christoph Hellwig
2024-04-29  7:31   ` Al Viro
2024-04-29 17:02     ` Al Viro [this message]
2024-04-29 18:13       ` Al Viro
2024-04-29 18:30         ` Al Viro
2024-05-03  0:06           ` Al Viro
2024-05-03  0:07             ` [PATCH 1/8] Use bdev_is_paritition() instead of open-coding it Al Viro
2024-05-03  0:07             ` [PATCH 2/8] wrapper for access to ->bd_partno Al Viro
2024-05-03  0:08             ` [PATCH v2 3/8] bdev: infrastructure for flags Al Viro
2024-05-03  0:09             ` [PATCH v2 4/8] bdev: move ->bd_read_only to ->__bd_flags Al Viro
2024-05-03  0:09             ` [PATCH v2 5/8] bdev: move ->bd_write_holder into ->__bd_flags Al Viro
2024-05-03  0:10             ` [PATCH v2 6/8] bdev: move ->bd_has_subit_bio to ->__bd_flags Al Viro
2024-05-03  0:10             ` [PATCH v2 7/8] bdev: move ->bd_ro_warned " Al Viro
2024-05-03  0:11             ` [PATCH v2 8/8] bdev: move ->bd_make_it_fail " Al Viro

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=20240429170209.GA2118490@ZenIV \
    --to=viro@zeniv.linux.org.uk \
    --cc=axboe@kernel.dk \
    --cc=brauner@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=yukuai1@huaweicloud.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.