From: Nilay Shroff <nilay@linux.ibm.com>
To: linux-block@vger.kernel.org
Cc: hch@lst.de, ming.lei@redhat.com, dlemoal@kernel.org,
hare@suse.de, axboe@kernel.dk, gjoyce@ibm.com
Subject: [PATCHv3 6/7] block: protect wbt_lat_usec using q->elevator_lock
Date: Mon, 24 Feb 2025 19:00:57 +0530 [thread overview]
Message-ID: <20250224133102.1240146-7-nilay@linux.ibm.com> (raw)
In-Reply-To: <20250224133102.1240146-1-nilay@linux.ibm.com>
The wbt latency and state could be updated while initializing the
elevator or exiting the elevator. It could be also updates while
configuring IO latency QoS parameters using cgroup. The elevator
code path is now protected with q->elevator_lock. So we should
protect the access to sysfs attribute wbt_lat_usec using q->elevator
_lock instead of q->sysfs_lock. White we're at it, also protect
ioc_qos_write(), which configures wbt parameters via cgroup, using
q->elevator_lock.
Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
---
block/blk-iocost.c | 2 ++
block/blk-sysfs.c | 20 ++++++++------------
2 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/block/blk-iocost.c b/block/blk-iocost.c
index 65a1d4427ccf..c68373361301 100644
--- a/block/blk-iocost.c
+++ b/block/blk-iocost.c
@@ -3249,6 +3249,7 @@ static ssize_t ioc_qos_write(struct kernfs_open_file *of, char *input,
}
memflags = blk_mq_freeze_queue(disk->queue);
+ mutex_lock(&disk->queue->elevator_lock);
blk_mq_quiesce_queue(disk->queue);
spin_lock_irq(&ioc->lock);
@@ -3356,6 +3357,7 @@ static ssize_t ioc_qos_write(struct kernfs_open_file *of, char *input,
spin_unlock_irq(&ioc->lock);
blk_mq_unquiesce_queue(disk->queue);
+ mutex_unlock(&disk->queue->elevator_lock);
blk_mq_unfreeze_queue(disk->queue, memflags);
ret = -EINVAL;
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 1ca0938b2fd7..8f47d9f30fbf 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -557,7 +557,7 @@ static ssize_t queue_wb_lat_show(struct gendisk *disk, char *page)
ssize_t ret;
struct request_queue *q = disk->queue;
- mutex_lock(&q->sysfs_lock);
+ mutex_lock(&q->elevator_lock);
if (!wbt_rq_qos(q)) {
ret = -EINVAL;
goto out;
@@ -570,7 +570,7 @@ static ssize_t queue_wb_lat_show(struct gendisk *disk, char *page)
ret = sysfs_emit(page, "%llu\n", div_u64(wbt_get_min_lat(q), 1000));
out:
- mutex_unlock(&q->sysfs_lock);
+ mutex_unlock(&q->elevator_lock);
return ret;
}
@@ -589,8 +589,8 @@ static ssize_t queue_wb_lat_store(struct gendisk *disk, const char *page,
if (val < -1)
return -EINVAL;
- mutex_lock(&q->sysfs_lock);
memflags = blk_mq_freeze_queue(q);
+ mutex_lock(&q->elevator_lock);
rqos = wbt_rq_qos(q);
if (!rqos) {
@@ -619,8 +619,8 @@ static ssize_t queue_wb_lat_store(struct gendisk *disk, const char *page,
blk_mq_unquiesce_queue(q);
out:
+ mutex_unlock(&q->elevator_lock);
blk_mq_unfreeze_queue(q, memflags);
- mutex_unlock(&q->sysfs_lock);
return ret;
}
@@ -689,19 +689,15 @@ static struct attribute *queue_attrs[] = {
/* Request-based queue attributes that are not relevant for bio-based queues. */
static struct attribute *blk_mq_queue_attrs[] = {
- /*
- * attributes protected with q->sysfs_lock
- */
-#ifdef CONFIG_BLK_WBT
- &queue_wb_lat_entry.attr,
-#endif
/*
* attributes which require some form of locking
* other than q->sysfs_lock
*/
&elv_iosched_entry.attr,
&queue_requests_entry.attr,
-
+#ifdef CONFIG_BLK_WBT
+ &queue_wb_lat_entry.attr,
+#endif
/*
* attributes which don't require locking
*/
@@ -882,10 +878,10 @@ int blk_register_queue(struct gendisk *disk)
goto out_crypto_sysfs_unregister;
}
}
+ wbt_enable_default(disk);
mutex_unlock(&q->elevator_lock);
blk_queue_flag_set(QUEUE_FLAG_REGISTERED, q);
- wbt_enable_default(disk);
/* Now everything is ready and send out KOBJ_ADD uevent */
kobject_uevent(&disk->queue_kobj, KOBJ_ADD);
--
2.47.1
next prev parent reply other threads:[~2025-02-24 13:33 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-24 13:30 [PATCHv3 0/7] block: fix lock order and remove redundant locking Nilay Shroff
2025-02-24 13:30 ` [PATCHv3 1/7] block: acquire q->limits_lock while reading sysfs attributes Nilay Shroff
2025-02-25 7:38 ` Hannes Reinecke
2025-02-24 13:30 ` [PATCHv3 2/7] block: move q->sysfs_lock and queue-freeze under show/store method Nilay Shroff
2025-02-24 16:31 ` Christoph Hellwig
2025-02-25 7:41 ` Hannes Reinecke
2025-02-24 13:30 ` [PATCHv3 3/7] block: remove q->sysfs_lock for attributes which don't need it Nilay Shroff
2025-02-25 7:46 ` Hannes Reinecke
2025-02-24 13:30 ` [PATCHv3 4/7] block: Introduce a dedicated lock for protecting queue elevator updates Nilay Shroff
2025-02-24 16:33 ` Christoph Hellwig
2025-02-25 13:28 ` Nilay Shroff
2025-02-25 7:49 ` Hannes Reinecke
2025-02-24 13:30 ` [PATCHv3 5/7] block: protect nr_requests update using q->elevator_lock Nilay Shroff
2025-02-25 7:50 ` Hannes Reinecke
2025-02-24 13:30 ` Nilay Shroff [this message]
2025-02-25 7:53 ` [PATCHv3 6/7] block: protect wbt_lat_usec " Hannes Reinecke
2025-02-25 10:05 ` Nilay Shroff
2025-02-24 13:30 ` [PATCHv3 7/7] block: protect read_ahead_kb using q->limits_lock Nilay Shroff
2025-02-25 7:58 ` Hannes Reinecke
2025-02-25 10:18 ` Nilay Shroff
2025-02-25 11:43 ` Hannes Reinecke
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=20250224133102.1240146-7-nilay@linux.ibm.com \
--to=nilay@linux.ibm.com \
--cc=axboe@kernel.dk \
--cc=dlemoal@kernel.org \
--cc=gjoyce@ibm.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
--cc=ming.lei@redhat.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