[RHEL8,COMMIT] ploop: Convert ctl_mutex into rwsem

Submitted by Konstantin Khorenko on Oct. 25, 2019, 2:09 p.m.

Details

Message ID 201910251409.x9PE9fB2004862@finist_co8.work.ct
State New
Series "ploop: Convert ctl_mutex into rwsem"
Headers show

Commit Message

Konstantin Khorenko Oct. 25, 2019, 2:09 p.m.
The commit is pushed to "branch-rh8-4.18.0-80.1.2.vz8.2.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-80.1.2.vz8.2.3
------>
commit 4560637ae8f166a3f0ab85f44a13055716b6ed5e
Author: Kirill Tkhai <ktkhai@virtuozzo.com>
Date:   Fri Oct 25 17:09:41 2019 +0300

    ploop: Convert ctl_mutex into rwsem
    
    Userspace push backup is multithreaded, and push_backup_read/write
    may be called in parallel. Use rwsem to allow that.
    
    Possible, in the future I'll avoid a lock here at all,
    if this looks better. I don't know yet.
    
    Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 drivers/md/dm-ploop-cmd.c    | 25 ++++++++++++++++++++++---
 drivers/md/dm-ploop-target.c |  2 +-
 drivers/md/dm-ploop.h        |  2 +-
 3 files changed, 24 insertions(+), 5 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index d329b5d62455..e3886c175b2e 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -1564,12 +1564,23 @@  void process_deferred_cmd(struct ploop *ploop, struct ploop_index_wb *piwb)
 	spin_lock_irq(&ploop->deferred_lock);
 }
 
+static bool msg_wants_down_read(const char *cmd)
+{
+	if (!strcmp(cmd, "get_delta_name") ||
+	    !strcmp(cmd, "push_backup_get_uuid") ||
+	    !strcmp(cmd, "push_backup_read") ||
+	    !strcmp(cmd, "push_backup_write"))
+		return true;
+
+	return false;
+}
+
 int ploop_message(struct dm_target *ti, unsigned int argc, char **argv,
 		  char *result, unsigned int maxlen)
 {
 	struct ploop *ploop = ti->private;
+	bool read, forward = true;
 	int ival, ret = -EPERM;
-	bool forward = true;
 	u64 val, val2;
 
 	if (!capable(CAP_SYS_ADMIN))
@@ -1579,7 +1590,12 @@  int ploop_message(struct dm_target *ti, unsigned int argc, char **argv,
 	if (argc < 1)
 		goto out;
 
-	mutex_lock(&ploop->ctl_mutex);
+	read = msg_wants_down_read(argv[0]);
+	if (read)
+		down_read(&ploop->ctl_rwsem);
+	else
+		down_write(&ploop->ctl_rwsem);
+
 	if (!strcmp(argv[0], "resize")) {
 		if (argc != 2 || kstrtou64(argv[1], 10, &val) < 0)
 			goto unlock;
@@ -1649,7 +1665,10 @@  int ploop_message(struct dm_target *ti, unsigned int argc, char **argv,
 	}
 
 unlock:
-	mutex_unlock(&ploop->ctl_mutex);
+	if (read)
+		up_read(&ploop->ctl_rwsem);
+	else
+		up_write(&ploop->ctl_rwsem);
 out:
 	return ret;
 }
diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index 999f78a05977..2e11c4b9c27c 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -112,7 +112,7 @@  static int ploop_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 	}
 
 	rwlock_init(&ploop->bat_rwlock);
-	mutex_init(&ploop->ctl_mutex);
+	init_rwsem(&ploop->ctl_rwsem);
 	spin_lock_init(&ploop->deferred_lock);
 	spin_lock_init(&ploop->pb_lock);
 
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index fc58e1081a78..ea5b7d41a6e1 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -203,7 +203,7 @@  struct ploop {
 	struct bio_list deferred_bios;
 	struct bio_list discard_bios;
 
-	struct mutex ctl_mutex;
+	struct rw_semaphore ctl_rwsem;
 	struct ploop_cmd *deferred_cmd;
 
 	/*