]> xenbits.xensource.com Git - pvdrivers/win/xenvbd.git/commitdiff
Call BlkifRing(Acquire/Release)Lock before/after BlkifRingPoll
authorOwen Smith <owen.smith@citrix.com>
Mon, 21 Jun 2021 12:54:45 +0000 (13:54 +0100)
committerPaul Durrant <pdurrant@amazon.com>
Mon, 21 Jun 2021 13:32:06 +0000 (14:32 +0100)
Releasing the blkif ring lock drains the atomic SRB list into the queue. When
attempting to move things along, this also includes the atomic SRB list.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
src/xenvbd/ring.c

index 66e8cdd9ac60f6e2da0b2bf74d8fee5e49fc434e..1ea12508d6e2342ffe3f9a41e122685cd8918194 100644 (file)
@@ -2158,7 +2158,6 @@ BlkifRingDisable(
 
     Trace("====> %u\n", BlkifRing->Index);
 
-    __BlkifRingAcquireLock(BlkifRing);
     ASSERT(BlkifRing->Enabled);
 
     status = XENBUS_STORE(Read,
@@ -2188,8 +2187,10 @@ BlkifRingDisable(
                 break;
 
             // Try to move things along
+            __BlkifRingAcquireLock(BlkifRing);
             __BlkifRingSend(BlkifRing);
             (VOID) BlkifRingPoll(BlkifRing);
+            __BlkifRingReleaseLock(BlkifRing);
 
             // We are waiting for a watch event at DISPATCH_LEVEL so
             // it is our responsibility to poll the store ring.
@@ -2200,6 +2201,7 @@ BlkifRingDisable(
         }
     }
 
+    __BlkifRingAcquireLock(BlkifRing);
     BlkifRing->Enabled = FALSE;
 
     while (!IsListEmpty(&BlkifRing->SubmittedList)) {