[Devel] [PATCH RHEL7 COMMIT] fuse kio: infinite loop in processing congestion queue

Konstantin Khorenko khorenko at virtuozzo.com
Fri Jun 8 19:30:31 MSK 2018


The commit is pushed to "branch-rh7-3.10.0-693.21.1.vz7.50.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.21.1.vz7.50.7
------>
commit cc79c46896440e10e2871dcd48bcb79213c0ae3f
Author: Alexey Kuznetsov <kuznet at virtuozzo.com>
Date:   Fri Jun 8 19:30:31 2018 +0300

    fuse kio: infinite loop in processing congestion queue
    
    Affects: #VSTOR-10928
    
    Signed-off-by: Alexey Kuznetsov <kuznet at virtuozzo.com>
    Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 fs/fuse/kio/pcs/pcs_map.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/fs/fuse/kio/pcs/pcs_map.c b/fs/fuse/kio/pcs/pcs_map.c
index b8bcda778959..9a05e247fe47 100644
--- a/fs/fuse/kio/pcs/pcs_map.c
+++ b/fs/fuse/kio/pcs/pcs_map.c
@@ -1577,16 +1577,25 @@ void pcs_deaccount_ireq(struct pcs_int_request *ireq, pcs_error_t * err)
 			pcs_cs_deaccount(ireq, csl->cs[i].cslink.cs, 0);
 		}
 
-		do {
+		for (;;) {
 			for (i = csl->nsrv - 1; i >= 0; i--)
 				pcs_cs_wakeup(csl->cs[i].cslink.cs);
 
 			requeue = 0;
 			for (i = csl->nsrv - 1; i >= 0; i--)
 				requeue |= pcs_cs_still_congested(csl->cs[i].cslink.cs);
-		} while (requeue);
+
+			if (!requeue)
+				break;
+
+			for (i = csl->nsrv - 1; i >= 0; i--) {
+				struct pcs_cs * cs = csl->cs[i].cslink.cs;
+				spin_lock(&cs->lock);
+				pcs_cs_activate_cong_queue(cs);
+				spin_unlock(&cs->lock);
+			}
+		};
 	} else {
-		int requeue;
 		struct pcs_cs * rcs = csl->cs[ireq->iochunk.cs_index].cslink.cs;
 
 		if (ireq->flags & IREQ_F_SEQ_READ) {
@@ -1597,11 +1606,16 @@ void pcs_deaccount_ireq(struct pcs_int_request *ireq, pcs_error_t * err)
 
 		pcs_cs_deaccount(ireq, rcs, error);
 
-		do {
+		for (;;) {
 			pcs_cs_wakeup(rcs);
 
-			requeue = pcs_cs_still_congested(rcs);
-		} while (requeue);
+			if (!pcs_cs_still_congested(rcs))
+				break;
+
+			spin_lock(&rcs->lock);
+			pcs_cs_activate_cong_queue(rcs);
+			spin_unlock(&rcs->lock);
+		};
 	}
 	*csl_p = NULL;
 	cslist_put(csl);


More information about the Devel mailing list