block: Switch to using refcount_t for zone write plugs
Subsystems (2)
Damien Le Moal
maintainerPATCH 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
@@ -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
Quoted 2 lines · Damien Le Moal
Replace the raw
atomic_treference counting of zone write plugs with arefcount_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:
Damien Le Moal
maintainerQuoted 6 lines · Christoph Hellwig
Quoted 2 lines · Damien Le Moal
Replace the raw
atomic_treference counting of zone write plugs with arefcount_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
Reviewed-by Christoph Hellwig <[email protected]>
Thanks.
Signature · 2 lines
Damien Le Moal Western Digital Research
Quoted 10 lines · Damien Le Moal
Quoted 6 lines · Christoph Hellwig
Quoted 2 lines · Damien Le Moal
Replace the raw
atomic_treference counting of zone write plugs with arefcount_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.
Quoted 4 lines · Damien Le Moal
Replace the raw
atomic_treference counting of zone write plugs with arefcount_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