[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH 4/4] Rework BlkifRingDisable
> -----Original Message----- > From: Paul Durrant > Sent: 17 September 2019 16:02 > To: Owen Smith <owen.smith@xxxxxxxxxx>; win-pv- > devel@xxxxxxxxxxxxxxxxxxxx > Cc: Owen Smith <owen.smith@xxxxxxxxxx> > Subject: RE: [win-pv-devel] [PATCH 4/4] Rework BlkifRingDisable > > > -----Original Message----- > > From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On > > Behalf Of Owen Smith > > Sent: 16 September 2019 16:18 > > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > > Cc: Owen Smith <owen.smith@xxxxxxxxxx> > > Subject: [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); > > + } > > Still don't understand why this is conditional, but if it needs to be then > then > moving the counter bump should surely be in the previous patch. > > Paul This counter bump should be combined with the previous patch Owen > > > > > 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 _______________________________________________ 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 |