|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH v2 3/4] Rework BlkifRingDisable
> -----Original Message-----
> From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of
> Owen Smith
> Sent: 18 September 2019 14:25
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Owen Smith <owen.smith@xxxxxxxxxx>
> Subject: [win-pv-devel] [PATCH v2 3/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.
> Also ignores missing requests for responses.
>
> Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
> ---
> src/xenvbd/ring.c | 68
> ++++++++++++++++++++-----------------------------------
> 1 file changed, 25 insertions(+), 43 deletions(-)
>
> diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
> index 6edee5c..8dcdee3 100644
> --- a/src/xenvbd/ring.c
> +++ b/src/xenvbd/ring.c
> @@ -1242,17 +1242,17 @@ BlkifRingPoll(
>
> rsp = RING_GET_RESPONSE(&BlkifRing->Front, rsp_cons);
> rsp_cons++;
> - BlkifRing->ResponsesProcessed++;
>
> BlkifRing->Stopped = FALSE;
>
> Request = __BlkifRingGetSubmittedRequest(BlkifRing,
> rsp->id);
> - ASSERT3P(Request, != , NULL);
> -
> - __BlkifRingCompleteResponse(BlkifRing,
> - Request,
> - rsp->status);
> + if (Request != NULL) {
> + BlkifRing->ResponsesProcessed++;
> + __BlkifRingCompleteResponse(BlkifRing,
> + Request,
> + rsp->status);
> + }
This really should not happen, but I guess it may avoid a non-obvious crash in
the non-debug case (where the assert is compiled out).
Acked-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
>
> if (rsp_cons - BlkifRing->Front.rsp_cons >
> XENVBD_BATCH(BlkifRing))
> Retry = TRUE;
> @@ -2044,57 +2044,39 @@ 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
> - while (!IsListEmpty(&BlkifRing->PreparedQueue)) {
> - PLIST_ENTRY ListEntry;
> - PXENVBD_REQUEST Request;
> - PXENVBD_SRBEXT SrbExt;
> - PSCSI_REQUEST_BLOCK Srb;
> -
> - ListEntry = RemoveHeadList(&BlkifRing->PreparedQueue);
> - ASSERT3P(ListEntry, !=, &BlkifRing->PreparedQueue);
> + BlkifRing->Enabled = FALSE;
>
> - Request = CONTAINING_RECORD(ListEntry,
> - XENVBD_REQUEST,
> - ListEntry);
> - SrbExt = Request->SrbExt;
> - Srb = SrbExt->Srb;
> - Srb->SrbStatus = SRB_STATUS_ABORTED;
> - Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> + while (!IsListEmpty(&BlkifRing->SubmittedList)) {
> + PLIST_ENTRY ListEntry;
> + PXENVBD_REQUEST Request;
>
> - BlkifRingPutRequest(BlkifRing, Request);
> + ListEntry = RemoveHeadList(&BlkifRing->SubmittedList);
> + ASSERT3P(ListEntry, !=, &BlkifRing->SubmittedList);
>
> - 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);
> + while (!IsListEmpty(&BlkifRing->PreparedQueue)) {
> + 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);
> + ASSERT3P(ListEntry, !=, &BlkifRing->PreparedQueue);
>
> - 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 |