|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH v2 4/4] Attempt to process responses on the ring
> -----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 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>
Acked-by: Paul Durrant <paul.durrant@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
_______________________________________________
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 |