Skip to contentSkip to conversation

block: Switch to using refcount_t for zone write plugs

PATCH Applied Damien Le Moal 4 participants 5 messages Nov 7, 2024

Subsystems (2)
lore
Share & tools
lore

Damien Le Moal

author maintainer
#0 lore raw

PATCH 1/1 block: Switch to using refcount_t for zone write plugs

Replace the raw atomic_t reference counting of zone write plugs with a refcount_t. No functional changes.

---
 block/blk-zoned.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
block/blk-zoned.c +10 -10
index 797a5d30ac01..70211751df16 100644
@@ -18,7 +18,7 @@
 #include <linux/vmalloc.h>
 #include <linux/sched/mm.h>
 #include <linux/spinlock.h>
-#include <linux/atomic.h>
+#include <linux/refcount.h>
 #include <linux/mempool.h>
 
 #include "blk.h"
@@ -64,7 +64,7 @@ static const char *const zone_cond_name[] = {
 struct blk_zone_wplug {
 	struct hlist_node	node;
 	struct list_head	link;
-	atomic_t		ref;
+	refcount_t		ref;
 	spinlock_t		lock;
 	unsigned int		flags;
 	unsigned int		zone_no;
@@ -404,7 +404,7 @@ static struct blk_zone_wplug *disk_get_zone_wplug(struct gendisk *disk,
 
 	hlist_for_each_entry_rcu(zwplug, &disk->zone_wplugs_hash[idx], node) {
 		if (zwplug->zone_no == zno &&
-		    atomic_inc_not_zero(&zwplug->ref)) {
+		    refcount_inc_not_zero(&zwplug->ref)) {
 			rcu_read_unlock();
 			return zwplug;
 		}
@@ -425,7 +425,7 @@ static void disk_free_zone_wplug_rcu(struct rcu_head *rcu_head)
 
 static inline void disk_put_zone_wplug(struct blk_zone_wplug *zwplug)
 {
-	if (atomic_dec_and_test(&zwplug->ref)) {
+	if (refcount_dec_and_test(&zwplug->ref)) {
 		WARN_ON_ONCE(!bio_list_empty(&zwplug->bio_list));
 		WARN_ON_ONCE(!list_empty(&zwplug->link));
 		WARN_ON_ONCE(!(zwplug->flags & BLK_ZONE_WPLUG_UNHASHED));
@@ -456,7 +456,7 @@ static inline bool disk_should_remove_zone_wplug(struct gendisk *disk,
 	 * taken when the plug was allocated and another reference taken by the
 	 * caller context).
 	 */
-	if (atomic_read(&zwplug->ref) > 2)
+	if (refcount_read(&zwplug->ref) > 2)
 		return false;
 
 	/* We can remove zone write plugs for zones that are empty or full. */
@@ -526,7 +526,7 @@ static struct blk_zone_wplug *disk_get_and_lock_zone_wplug(struct gendisk *disk,
 
 	INIT_HLIST_NODE(&zwplug->node);
 	INIT_LIST_HEAD(&zwplug->link);
-	atomic_set(&zwplug->ref, 2);
+	refcount_set(&zwplug->ref, 2);
 	spin_lock_init(&zwplug->lock);
 	zwplug->flags = 0;
 	zwplug->zone_no = zno;
@@ -617,7 +617,7 @@ static inline void disk_zone_wplug_set_error(struct gendisk *disk,
 	 * finished.
 	 */
 	zwplug->flags |= BLK_ZONE_WPLUG_ERROR;
-	atomic_inc(&zwplug->ref);
+	refcount_inc(&zwplug->ref);
 
 	spin_lock_irqsave(&disk->zone_wplugs_lock, flags);
 	list_add_tail(&zwplug->link, &disk->zone_wplugs_err_list);
@@ -1092,7 +1092,7 @@ static void disk_zone_wplug_schedule_bio_work(struct gendisk *disk,
 	 * reference we take here.
 	 */
 	WARN_ON_ONCE(!(zwplug->flags & BLK_ZONE_WPLUG_PLUGGED));
-	atomic_inc(&zwplug->ref);
+	refcount_inc(&zwplug->ref);
 	queue_work(disk->zone_wplugs_wq, &zwplug->bio_work);
 }
 
@@ -1437,7 +1437,7 @@ static void disk_destroy_zone_wplugs_hash_table(struct gendisk *disk)
 		while (!hlist_empty(&disk->zone_wplugs_hash[i])) {
 			zwplug = hlist_entry(disk->zone_wplugs_hash[i].first,
 					     struct blk_zone_wplug, node);
-			atomic_inc(&zwplug->ref);
+			refcount_inc(&zwplug->ref);
 			disk_remove_zone_wplug(disk, zwplug);
 			disk_put_zone_wplug(zwplug);
 		}
@@ -1851,7 +1851,7 @@ int queue_zone_wplugs_show(void *data, struct seq_file *m)
 			spin_lock_irqsave(&zwplug->lock, flags);
 			zwp_zone_no = zwplug->zone_no;
 			zwp_flags = zwplug->flags;
-			zwp_ref = atomic_read(&zwplug->ref);
+			zwp_ref = refcount_read(&zwplug->ref);
 			zwp_wp_offset = zwplug->wp_offset;
 			zwp_bio_list_size = bio_list_size(&zwplug->bio_list);
 			spin_unlock_irqrestore(&zwplug->lock, flags);
Signature · 1 line
2.47.0
Reviewed-by on v1 1/1
#1 lore raw
Quoted 2 lines · Damien Le Moal

Replace the raw atomic_t reference counting of zone write plugs with a refcount_t. No functional changes.

I don't quite see the point, but if Jens wants to take it the code changes look correct to me:

author maintainer
#2 lore raw
Quoted 6 lines · Christoph Hellwig
Quoted 2 lines · Damien Le Moal

Replace the raw atomic_t reference counting of zone write plugs with a refcount_t. No functional changes.

I don't quite see the point, but if Jens wants to take it the code changes look correct to me:

The point is only to avoid kernel bots screaming about the use of atomic for refcounting. Nothing more than that.

Quoted 1 line

Thanks.

Signature · 2 lines
Damien Le Moal
Western Digital Research
#3 lore raw
Quoted 10 lines · Damien Le Moal
Quoted 6 lines · Christoph Hellwig
Quoted 2 lines · Damien Le Moal

Replace the raw atomic_t reference counting of zone write plugs with a refcount_t. No functional changes.

I don't quite see the point, but if Jens wants to take it the code changes look correct to me:

The point is only to avoid kernel bots screaming about the use of atomic for refcounting. Nothing more than that.

There may be better approaches to achieve this goal, e.g. introducing an annotation scheme that makes these bots ignore zwplug->ref. I prefer the annotation approach because I'm concerned that this patch will have a negative performance for ZNS and ZUFS devices.

Thanks,

Bart.

maintainer Applied
#4 lore raw
In reply to Damien Le Moal
Quoted 4 lines · Damien Le Moal

Replace the raw atomic_t reference counting of zone write plugs with a refcount_t. No functional changes.

Applied, thanks!

[1/1] block: Switch to using refcount_t for zone write plugs

      commit: 4122fef16b172f7c1838fcf74340268c86ed96db

Best regards,

Signature · 1 line
Jens Axboe