[Devel] [PATCH RHEL7 COMMIT] ploop: Check disable_merge only if there is a delta with such method

Vasily Averin vvs at virtuozzo.com
Tue Aug 24 14:39:48 MSK 2021


The commit is pushed to "branch-rh7-3.10.0-1160.36.2.vz7.182.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1160.36.2.vz7.182.1
------>
commit 54b4ddbd65f89be6a31c08e2add004d27c79ceed
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date:   Tue Aug 24 14:39:48 2021 +0300

    ploop: Check disable_merge only if there is a delta with such method
    
    There is high spinlock contention on NVME in this place.
    But really, we should try this optimization only if it's
    there is a delta, which provides such method. Kaio does
    not provide it, so here is just spinlock taking wasting.
    
    Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/block/ploop/dev.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index c4cb944..9abce6a 100644
--- a/drivers/block/ploop/dev.c
+++ b/drivers/block/ploop/dev.c
@@ -1248,18 +1248,27 @@ ploop_merge_bvec(struct request_queue *q, struct bvec_merge_data *bm_data,
 		return 0;
 	}
 
-	/* We can return ret right now, the further action is an optimization
-	 * to prevent splitting overhead and to enable fast path.
-	 */
-	spin_lock_irqsave(&plo->lock, flags);
-	delta = ploop_fast_lookup(plo, sec, 0, &isector);
-	if (delta &&
-	    delta->io.ops->disable_merge &&
-	    delta->io.ops->disable_merge(&delta->io, isector, len)) {
-		plo->st.merge_neg_disable++;
-		ret = 0;
+	if (plo->has_disable_merge) {
+		/*
+		 * We can return ret right now, the further action
+		 * is an optimization to prevent splitting overhead
+		 * and to enable fast path.
+		 * We do that only in case of there is a delta
+		 * with disable_merge method: otherwise this just
+		 * brings spinlock taking overhead (seen on NVME).
+		 * Since below is only optimization, we check
+		 * plo->has_disable_merge without any synchronization.
+		 */
+		spin_lock_irqsave(&plo->lock, flags);
+		delta = ploop_fast_lookup(plo, sec, 0, &isector);
+		if (delta &&
+		    delta->io.ops->disable_merge &&
+		    delta->io.ops->disable_merge(&delta->io, isector, len)) {
+			plo->st.merge_neg_disable++;
+			ret = 0;
+		}
+		spin_unlock_irqrestore(&plo->lock, flags);
 	}
-	spin_unlock_irqrestore(&plo->lock, flags);
 
 	/* If no mapping is available, merge up to cluster boundary */
 	return ret;


More information about the Devel mailing list