[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [win-pv-devel] [PATCH 4/4] Rework BlkifRingDisable


  • To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>, "win-pv-devel@xxxxxxxxxxxxxxxxxxxx" <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Owen Smith <owen.smith@xxxxxxxxxx>
  • Date: Tue, 17 Sep 2019 15:05:43 +0000
  • Accept-language: en-GB, en-US
  • Authentication-results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=owen.smith@xxxxxxxxxx; spf=Pass smtp.mailfrom=owen.smith@xxxxxxxxxx; spf=None smtp.helo=postmaster@xxxxxxxxxxxxxxx
  • Delivery-date: Tue, 17 Sep 2019 15:05:50 +0000
  • Ironport-sdr: V2pxEPOEwMKYTJuLNFLKTcy/bhnaqAk76/0769HU8/YkDjGncK7MZX/7hNe3ADltDoIoFViyyU 1QWBi0J7O9NkszdOIzV8GEv+tIJDa5lup3IaQafvdF1N0YkxAX8H6kXU/zZatFaIuuL+R4UsCX DEa5WdOkRdyIZqSMy6tTEgTbxPJBi9zWoaV0ZlugYvbnAdnoWeXnXxnatlz8ZgBvyd6hkmFiqs DzRWjjE8CJoEFMg/3nq94W+WYX77X36S7alCm6lNzXt9gAXC0fpzGXWVUudhIQA4mMNAcRr7eQ 8kA=
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>
  • Thread-index: AQHVbKJzkkvitNCf0EympGjEVb7Yx6cv1wqAgAAiSaA=
  • Thread-topic: [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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.