[Devel] [PATCH RHEL9 COMMIT] dm-qcow2: Stop using err_status_lock
Konstantin Khorenko
khorenko at virtuozzo.com
Wed Mar 2 20:04:13 MSK 2022
The commit is pushed to "branch-rh9-5.14.0-42.vz9.14.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh9-5.14.0-42.vz9.14.3
------>
commit f03ea887b5e51cd7b0616299c8769b99d5c15f44
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date: Wed Mar 2 20:04:13 2022 +0300
dm-qcow2: Stop using err_status_lock
Instead of using spinlock as mem barrier, use memory barrier instead.
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
Feature: dm-qcow2: block device over QCOW2 files driver
---
drivers/md/dm-qcow2-cmd.c | 11 ++++-------
drivers/md/dm-qcow2-target.c | 1 -
drivers/md/dm-qcow2.h | 1 -
3 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/drivers/md/dm-qcow2-cmd.c b/drivers/md/dm-qcow2-cmd.c
index 779c6618e598..7c91daa5af2d 100644
--- a/drivers/md/dm-qcow2-cmd.c
+++ b/drivers/md/dm-qcow2-cmd.c
@@ -41,12 +41,10 @@ static void service_qio_endio(struct qcow2_target *tgt, struct qio *qio,
void *data, blk_status_t status)
{
blk_status_t *status_ptr = data;
- unsigned long flags;
if (unlikely(status)) {
- spin_lock_irqsave(&tgt->err_status_lock, flags);
- *status_ptr = status;
- spin_unlock_irqrestore(&tgt->err_status_lock, flags);
+ WRITE_ONCE(*status_ptr, status);
+ smp_wmb(); /* Pairs with smp_rmb() in qcow2_service_iter() */
}
atomic_dec(&tgt->service_qios);
@@ -99,9 +97,8 @@ static int qcow2_service_iter(struct qcow2_target *tgt, struct qcow2 *qcow2,
wait_event(tgt->service_wq, !atomic_read(&tgt->service_qios));
if (!ret) {
- spin_lock_irq(&tgt->err_status_lock);
- ret = blk_status_to_errno(service_status);
- spin_unlock_irq(&tgt->err_status_lock);
+ smp_rmb(); /* Pairs with smp_wmb() in service_qio_endio() */
+ ret = blk_status_to_errno(READ_ONCE(service_status));
}
return ret;
diff --git a/drivers/md/dm-qcow2-target.c b/drivers/md/dm-qcow2-target.c
index 2a29bff42bfe..99a0359391ce 100644
--- a/drivers/md/dm-qcow2-target.c
+++ b/drivers/md/dm-qcow2-target.c
@@ -448,7 +448,6 @@ static struct qcow2_target *alloc_qcow2_target(struct dm_target *ti)
}
init_completion(&tgt->inflight_ref_comp);
- spin_lock_init(&tgt->err_status_lock);
mutex_init(&tgt->ctl_mutex);
init_waitqueue_head(&tgt->service_wq);
ti->private = tgt;
diff --git a/drivers/md/dm-qcow2.h b/drivers/md/dm-qcow2.h
index 962b767c84b1..14899608b30f 100644
--- a/drivers/md/dm-qcow2.h
+++ b/drivers/md/dm-qcow2.h
@@ -125,7 +125,6 @@ struct qcow2_target {
atomic_t service_qios;
struct wait_queue_head service_wq;
- spinlock_t err_status_lock;
struct mutex ctl_mutex;
};
More information about the Devel
mailing list