|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH v2 4/4] Attempt to process responses on the ring
When Disabling the ring, outstanding responses need to be completed.
Poll the ring to complete outstanding responses if the backend is still
connected and valid.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvbd/ring.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
index 8dcdee3..4bb7475 100644
--- a/src/xenvbd/ring.c
+++ b/src/xenvbd/ring.c
@@ -2044,11 +2044,57 @@ BlkifRingDisable(
IN PXENVBD_BLKIF_RING BlkifRing
)
{
+ PXENVBD_RING Ring;
+ PCHAR Buffer;
+ XenbusState State;
+ NTSTATUS status;
+
+ Ring = BlkifRing->Ring;
+
Trace("====> %u\n", BlkifRing->Index);
__BlkifRingAcquireLock(BlkifRing);
ASSERT(BlkifRing->Enabled);
+ status = XENBUS_STORE(Read,
+ &Ring->StoreInterface,
+ NULL,
+ FrontendGetBackendPath(Ring->Frontend),
+ "state",
+ &Buffer);
+ if (!NT_SUCCESS(status)) {
+ State = XenbusStateUnknown;
+ } else {
+ State = (XenbusState) strtol(Buffer, NULL, 10);
+
+ XENBUS_STORE(Free,
+ &Ring->StoreInterface,
+ Buffer);
+ }
+
+ if (State == XenbusStateConnected) {
+ ULONG Attempt;
+
+ Attempt = 0;
+ ASSERT3U(BlkifRing->RequestsPushed, ==, BlkifRing->RequestsPosted);
+ while (BlkifRing->ResponsesProcessed != BlkifRing->RequestsPushed) {
+ Attempt++;
+ if (Attempt > 100)
+ break;
+
+ // Try to move things along
+ __BlkifRingSend(BlkifRing);
+ (VOID) BlkifRingPoll(BlkifRing);
+
+ // We are waiting for a watch event at DISPATCH_LEVEL so
+ // it is our responsibility to poll the store ring.
+ XENBUS_STORE(Poll,
+ &Ring->StoreInterface);
+
+ KeStallExecutionProcessor(1000); // 1ms
+ }
+ }
+
BlkifRing->Enabled = FALSE;
while (!IsListEmpty(&BlkifRing->SubmittedList)) {
--
2.16.2.windows.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |