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

Re: [win-pv-devel] [PATCH 7/8] Add Get/Put for request, segment and indirect(pages)



> -----Original Message-----
> From: win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx [mailto:win-pv-devel-
> bounces@xxxxxxxxxxxxxxxxxxxx] On Behalf Of Owen Smith
> Sent: 27 October 2015 11:16
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 7/8] Add Get/Put for request, segment and
> indirect(pages)
> 
> Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>

Acked-by: Paul Durrant <paul.durrant@xxxxxxxxxx>

> ---
>  src/xenvbd/pdo.c | 211 +++++++++++++++++++++++++++++++++-----------
> -----------
>  1 file changed, 126 insertions(+), 85 deletions(-)
> 
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 5023a93..e8d94cb 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -567,17 +567,127 @@ PdoSectorSize(
>  }
> 
> 
> //=========================================================
> ====================
> +static PVOID
> +PdoGetIndirect(
> +    IN  PXENVBD_PDO             Pdo
> +    )
> +{
> +    PVOID                       Indirect;
> 
> -static FORCEINLINE ULONG
> -PdoGetTag(
> +    Indirect = __LookasideAlloc(&Pdo->IndirectList);
> +    if (Indirect == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    return Indirect;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutIndirect(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PVOID                   Indirect
> +    )
> +{
> +    RtlZeroMemory(Indirect, PAGE_SIZE);
> +    __LookasideFree(&Pdo->IndirectList, Indirect);
> +}
> +
> +static PXENVBD_SEGMENT
> +PdoGetSegment(
> +    IN  PXENVBD_PDO             Pdo
> +    )
> +{
> +    PXENVBD_SEGMENT             Segment;
> +
> +    Segment = __LookasideAlloc(&Pdo->SegmentList);
> +    if (Segment == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
> +    return Segment;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutSegment(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PXENVBD_SEGMENT         Segment
> +    )
> +{
> +    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +
> +    if (Segment->Grant)
> +        GranterPut(Granter, Segment->Grant);
> +
> +    if (Segment->BufferId)
> +        BufferPut(Segment->BufferId);
> +
> +    if (Segment->Buffer)
> +        MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
> +
> +    RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT));
> +    __LookasideFree(&Pdo->SegmentList, Segment);
> +}
> +
> +static PXENVBD_REQUEST
> +PdoGetRequest(
>      IN  PXENVBD_PDO             Pdo
>      )
>  {
> -    return (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
> +    PXENVBD_REQUEST             Request;
> +
> +    Request = __LookasideAlloc(&Pdo->RequestList);
> +    if (Request == NULL)
> +        goto fail1;
> +
> +    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
> +    Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag);
> +    InitializeListHead(&Request->Segments);
> +
> +    return Request;
> +
> +fail1:
> +    return NULL;
> +}
> +
> +static VOID
> +PdoPutRequest(
> +    IN  PXENVBD_PDO             Pdo,
> +    IN  PXENVBD_REQUEST         Request
> +    )
> +{
> +    ULONG           Index;
> +    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> +
> +    for (;;) {
> +        PLIST_ENTRY     Entry;
> +        PXENVBD_SEGMENT Segment;
> +
> +        Entry = RemoveHeadList(&Request->Segments);
> +        if (Entry == &Request->Segments)
> +            break;
> +        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
> +        PdoPutSegment(Pdo, Segment);
> +    }
> +
> +    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST;
> ++Index) {
> +        if (Request->Grants[Index])
> +            GranterPut(Granter, Request->Grants[Index]);
> +        if (Request->Pages[Index])
> +            PdoPutIndirect(Pdo, Request->Pages[Index]);
> +    }
> +
> +    RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
> +    __LookasideFree(&Pdo->RequestList, Request);
>  }
> 
>  static FORCEINLINE PXENVBD_REQUEST
> -PdoPutTag(
> +PdoRequestFromTag(
>      IN  PXENVBD_PDO             Pdo,
>      IN  ULONG                   Tag
>      )
> @@ -793,63 +903,6 @@ fail:
>  }
> 
>  static FORCEINLINE VOID
> -UnmapSegmentBuffer(
> -    IN  PXENVBD_SEGMENT         Segment
> -    )
> -{
> -    MmUnmapLockedPages(Segment->Buffer, &Segment->Mdl);
> -    RtlZeroMemory(&Segment->Mdl, sizeof(Segment->Mdl));
> -    RtlZeroMemory(Segment->Pfn, sizeof(Segment->Pfn));
> -    Segment->Buffer = NULL;
> -    Segment->Length = 0;
> -}
> -
> -static FORCEINLINE VOID
> -RequestCleanup(
> -    IN  PXENVBD_PDO             Pdo,
> -    IN  PXENVBD_REQUEST         Request
> -    )
> -{
> -    ULONG           Index;
> -    PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
> -
> -    for (;;) {
> -        PLIST_ENTRY     Entry;
> -        PXENVBD_SEGMENT Segment;
> -
> -        Entry = RemoveHeadList(&Request->Segments);
> -        if (Entry == &Request->Segments)
> -            break;
> -
> -        Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
> -        --Request->NrSegments;
> -
> -        if (Segment->Grant)
> -            GranterPut(Granter, Segment->Grant);
> -        Segment->Grant = NULL;
> -
> -        if (Segment->BufferId)
> -            BufferPut(Segment->BufferId);
> -        Segment->BufferId = NULL;
> -
> -        if (Segment->Buffer)
> -            UnmapSegmentBuffer(Segment);
> -
> -        __LookasideFree(&Pdo->SegmentList, Segment);
> -    }
> -
> -    for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST;
> ++Index) {
> -        if (Request->Grants[Index])
> -            GranterPut(Granter, Request->Grants[Index]);
> -        Request->Grants[Index] = NULL;
> -
> -        if (Request->Pages[Index])
> -            __LookasideFree(&Pdo->IndirectList, Request->Pages[Index]);
> -        Request->Pages[Index] = NULL;
> -    }
> -}
> -
> -static FORCEINLINE VOID
>  RequestCopyOutput(
>      __in PXENVBD_REQUEST         Request
>      )
> @@ -965,7 +1018,7 @@ PrepareBlkifReadWrite(
>          PXENVBD_SEGMENT Segment;
>          ULONG           SectorsNow;
> 
> -        Segment = __LookasideAlloc(&Pdo->SegmentList);
> +        Segment = PdoGetSegment(Pdo);
>          if (Segment == NULL)
>              goto fail1;
> 
> @@ -1008,7 +1061,7 @@ PrepareBlkifIndirect(
>              Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST &&
>              NrSegments < Request->NrSegments;
>                  ++Index) {
> -        Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
> +        Request->Pages[Index] = PdoGetIndirect(Pdo);
>          if (Request->Pages[Index] == NULL)
>              goto fail1;
> 
> @@ -1085,7 +1138,7 @@ PdoCancelRequestList(
>              break;
> 
>          Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
>      }
>  }
> 
> @@ -1114,15 +1167,12 @@ PrepareReadWrite(
>          ULONG           SectorsDone = 0;
>          PXENVBD_REQUEST Request;
> 
> -        Request = __LookasideAlloc(&Pdo->RequestList);
> +        Request = PdoGetRequest(Pdo);
>          if (Request == NULL)
>              goto fail1;
>          InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb    = Srb;
> -        Request->Id     = PdoGetTag(Pdo);
> -        InitializeListHead(&Request->Segments);
> -
>          MaxSegments = UseIndirect(Pdo, SectorsLeft);
> 
>          if (!PrepareBlkifReadWrite(Pdo,
> @@ -1168,16 +1218,14 @@ PrepareSyncCache(
>      SrbExt->Count = 0;
>      Srb->SrbStatus = SRB_STATUS_PENDING;
> 
> -    Request = __LookasideAlloc(&Pdo->RequestList);
> +    Request = PdoGetRequest(Pdo);
>      if (Request == NULL)
>          goto fail1;
>      InsertTailList(&List, &Request->Entry);
> 
>      Request->Srb        = Srb;
> -    Request->Id         = PdoGetTag(Pdo);
>      Request->Operation  = BLKIF_OP_WRITE_BARRIER;
>      Request->FirstSector = Cdb_LogicalBlock(Srb);
> -    InitializeListHead(&Request->Segments);
> 
>      SrbExt->Count = PdoQueueRequestList(Pdo, &List);
>      return TRUE;
> @@ -1209,18 +1257,16 @@ PrepareUnmap(
>          PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
>          PXENVBD_REQUEST         Request;
> 
> -        Request = __LookasideAlloc(&Pdo->RequestList);
> +        Request = PdoGetRequest(Pdo);
>          if (Request == NULL)
>              goto fail1;
>          InsertTailList(&List, &Request->Entry);
> 
>          Request->Srb            = Srb;
> -        Request->Id             = PdoGetTag(Pdo);
>          Request->Operation      = BLKIF_OP_DISCARD;
>          Request->FirstSector    = _byteswap_uint64(*(PULONG64)Descr-
> >StartingLba);
>          Request->NrSectors      = _byteswap_ulong(*(PULONG)Descr-
> >LbaCount);
>          Request->Flags          = 0;
> -        InitializeListHead(&Request->Segments);
>      }
> 
>      SrbExt->Count = PdoQueueRequestList(Pdo, &List);
> @@ -1296,8 +1342,7 @@ __PdoPauseDataPath(
>          Verbose("Target[%d] : PreparedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> 
>          SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
> @@ -1460,7 +1505,7 @@ PdoCompleteResponse(
>      PSCSI_REQUEST_BLOCK Srb;
>      PXENVBD_SRBEXT      SrbExt;
> 
> -    Request = PdoPutTag(Pdo, Tag);
> +    Request = PdoRequestFromTag(Pdo, Tag);
>      if (Request == NULL)
>          return;
> 
> @@ -1489,8 +1534,7 @@ PdoCompleteResponse(
>          break;
>      }
> 
> -    RequestCleanup(Pdo, Request);
> -    __LookasideFree(&Pdo->RequestList, Request);
> +    PdoPutRequest(Pdo, Request);
> 
>      // complete srb
>      if (InterlockedDecrement(&SrbExt->Count) == 0) {
> @@ -1529,8 +1573,7 @@ PdoPreResume(
>          SrbExt = GetSrbExt(Request->Srb);
> 
>          BlockRingAbort(BlockRing, Request);
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              InsertTailList(&List, &SrbExt->Entry);
> @@ -1547,8 +1590,7 @@ PdoPreResume(
>          Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
>          SrbExt = GetSrbExt(Request->Srb);
> 
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              InsertTailList(&List, &SrbExt->Entry);
> @@ -2155,8 +2197,7 @@ __PdoCleanupSubmittedReqs(
> 
>          Verbose("Target[%d] : SubmittedReq 0x%p -> FAILED\n",
> PdoGetTargetId(Pdo), Request);
> 
> -        RequestCleanup(Pdo, Request);
> -        __LookasideFree(&Pdo->RequestList, Request);
> +        PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
>              SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


 


Rackspace

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