[Devel] [PATCH RH8 2/2] ploop: Check disable_merge only if there is a delta with such method

Kirill Tkhai ktkhai at virtuozzo.com
Mon Aug 16 12:37:30 MSK 2021


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 c4cb944358ee..9abce6afa976 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