[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] 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 5323243..1b980be 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; for (;;) { -- 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 |