[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 4/4] Rework BlkifRingDisable
Clean up all prepared and submitted requests when the ring is disabled, so that outstanding SRBs are returned to storport for queueing. This is especially important on the return from suspend path, as the ring is no longer valid, and any submitted requests would be lost and trigger a storport target reset. Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xenvbd/ring.c | 62 +++++++++++++++++++++---------------------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c index d5db1da..5323243 100644 --- a/src/xenvbd/ring.c +++ b/src/xenvbd/ring.c @@ -1242,16 +1242,17 @@ BlkifRingPoll( rsp = RING_GET_RESPONSE(&BlkifRing->Front, rsp_cons); rsp_cons++; - BlkifRing->ResponsesProcessed++; BlkifRing->Stopped = FALSE; Request = __BlkifRingGetSubmittedRequest(BlkifRing, rsp->id); - if (Request != NULL) + if (Request != NULL) { + BlkifRing->ResponsesProcessed++; __BlkifRingCompleteResponse(BlkifRing, Request, rsp->status); + } if (rsp_cons - BlkifRing->Front.rsp_cons > XENVBD_BATCH(BlkifRing)) Retry = TRUE; @@ -2043,58 +2044,41 @@ BlkifRingDisable( IN PXENVBD_BLKIF_RING BlkifRing ) { - PXENVBD_RING Ring = BlkifRing->Ring; - ULONG Attempt; - Trace("====> %u\n", BlkifRing->Index); __BlkifRingAcquireLock(BlkifRing); ASSERT(BlkifRing->Enabled); - // Discard any pending requests + BlkifRing->Enabled = FALSE; + for (;;) { - PLIST_ENTRY ListEntry; - PXENVBD_REQUEST Request; - PXENVBD_SRBEXT SrbExt; - PSCSI_REQUEST_BLOCK Srb; + PLIST_ENTRY ListEntry; + PXENVBD_REQUEST Request; - ListEntry = RemoveHeadList(&BlkifRing->PreparedQueue); - if (ListEntry == &BlkifRing->PreparedQueue) + ListEntry = RemoveHeadList(&BlkifRing->SubmittedList); + if (ListEntry == &BlkifRing->SubmittedList) break; - Request = CONTAINING_RECORD(ListEntry, - XENVBD_REQUEST, - ListEntry); - SrbExt = Request->SrbExt; - Srb = SrbExt->Srb; - Srb->SrbStatus = SRB_STATUS_ABORTED; - Srb->ScsiStatus = 0x40; // SCSI_ABORTED - - BlkifRingPutRequest(BlkifRing, Request); - - if (InterlockedDecrement(&SrbExt->RequestCount) == 0) - __BlkifRingCompleteSrb(BlkifRing, SrbExt); + Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry); + BlkifRing->ResponsesProcessed++; + __BlkifRingCompleteResponse(BlkifRing, Request, BLKIF_RSP_ERROR); } - Attempt = 0; - ASSERT3U(BlkifRing->RequestsPushed, == , BlkifRing->RequestsPosted); - while (BlkifRing->ResponsesProcessed != BlkifRing->RequestsPushed) { - Attempt++; - ASSERT(Attempt < 100); - - // Try to move things along - __BlkifRingSend(BlkifRing); - (VOID)BlkifRingPoll(BlkifRing); + for (;;) { + PLIST_ENTRY ListEntry; + PXENVBD_REQUEST Request; - // 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); + ListEntry = RemoveHeadList(&BlkifRing->PreparedQueue); + if (ListEntry == &BlkifRing->PreparedQueue) + break; - KeStallExecutionProcessor(1000); // 1ms + Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry); + // Dont increment ResponsesProcessed, as this is a faked response + __BlkifRingCompleteResponse(BlkifRing, Request, BLKIF_RSP_ERROR); } - BlkifRing->Enabled = FALSE; + BlkifRing->Stopped = FALSE; + __BlkifRingReleaseLock(BlkifRing); Trace("<==== %u\n", BlkifRing->Index); -- 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 |