[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH 05/10] Move scatter gather list parsing to adapter.c
> -----Original Message----- > From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On > Behalf Of owen.smith@xxxxxxxxxx > Sent: 23 June 2017 13:49 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Owen Smith <owen.smith@xxxxxxxxxx> > Subject: [win-pv-devel] [PATCH 05/10] Move scatter gather list parsing to > adapter.c > > From: Owen Smith <owen.smith@xxxxxxxxxx> > > Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > src/xenvbd/adapter.c | 62 +++++++++++++++++++++++++++ > src/xenvbd/adapter.h | 9 ++++ > src/xenvbd/srbext.h | 4 ++ > src/xenvbd/target.c | 116 > +++++++++++++-------------------------------------- > 4 files changed, 104 insertions(+), 87 deletions(-) > > diff --git a/src/xenvbd/adapter.c b/src/xenvbd/adapter.c > index bc93037..14e9ae6 100644 > --- a/src/xenvbd/adapter.c > +++ b/src/xenvbd/adapter.c > @@ -1434,6 +1434,66 @@ AdapterSetDeviceQueueDepth( > TargetId); > } > > +PFN_NUMBER > +AdapterGetNextSGEntry( > + IN PXENVBD_ADAPTER Adapter, > + IN PXENVBD_SRBEXT SrbExt, > + IN ULONG Existing, > + OUT PULONG Offset, > + OUT PULONG Length > + ) > +{ > + PSTOR_SCATTER_GATHER_LIST SGList = SrbExt->SGList; > + PSTOR_SCATTER_GATHER_ELEMENT SGElement; > + STOR_PHYSICAL_ADDRESS PhysAddr; > + > + UNREFERENCED_PARAMETER(Adapter); > + > + ASSERT3P(SGList, !=, NULL); > + ASSERT3U(SrbExt->SGIndex, <, SGList->NumberOfElements); > + > + SGElement = &SGList->List[SrbExt->SGIndex]; > + > + PhysAddr.QuadPart = SGElement->PhysicalAddress.QuadPart + SrbExt- > >SGOffset; > + *Offset = (ULONG)(PhysAddr.QuadPart & (PAGE_SIZE - 1)); > + *Length = __min(PAGE_SIZE - *Offset - Existing, > SGElement->Length > - SrbExt->SGOffset); > + > + ASSERT3U(*Length, <=, PAGE_SIZE); > + ASSERT3U(SrbExt->SGOffset, <, SGElement->Length); > + > + SrbExt->SGOffset += *Length; > + if (SrbExt->SGOffset >= SGElement->Length) { > + SrbExt->SGIndex++; > + SrbExt->SGOffset = 0; > + } > + > + return (PFN_NUMBER)(PhysAddr.QuadPart >> PAGE_SHIFT); > +} > + > +static FORCEINLINE VOID > +AdapterPullupSrb( > + IN PXENVBD_ADAPTER Adapter, > + IN PSCSI_REQUEST_BLOCK Srb > + ) > +{ > + PXENVBD_SRBEXT SrbExt = Srb->SrbExtension; > + UCHAR Operation; > + > + Operation = Cdb_OperationEx(Srb); > + switch (Operation) { > + case SCSIOP_READ: > + case SCSIOP_WRITE: > + SrbExt->SGList = StorPortGetScatterGatherList(Adapter, Srb); > + ASSERT3P(SrbExt->SGList, !=, NULL); > + ASSERT3U(((PSTOR_SCATTER_GATHER_LIST)SrbExt->SGList)- > >NumberOfElements, !=, 0); > + ASSERT3U(((PSTOR_SCATTER_GATHER_LIST)SrbExt->SGList)- > >NumberOfElements, <=, XENVBD_MAX_PAGES_PER_SRB); > + break; > + > + default: > + break; > + } > +} > + > static VOID > AdapterUnplugRequest( > IN PXENVBD_ADAPTER Adapter, > @@ -1725,6 +1785,8 @@ AdapterHwBuildIo( > > switch (Srb->Function) { > case SRB_FUNCTION_EXECUTE_SCSI: > + AdapterPullupSrb(Adapter, Srb); > + // Intentional fall through > case SRB_FUNCTION_RESET_DEVICE: > case SRB_FUNCTION_FLUSH: > case SRB_FUNCTION_SHUTDOWN: > diff --git a/src/xenvbd/adapter.h b/src/xenvbd/adapter.h > index a398b75..ce0c794 100644 > --- a/src/xenvbd/adapter.h > +++ b/src/xenvbd/adapter.h > @@ -82,6 +82,15 @@ AdapterSetDeviceQueueDepth( > IN ULONG TargetId > ); > > +extern PFN_NUMBER > +AdapterGetNextSGEntry( > + IN PXENVBD_ADAPTER Adapter, > + IN PXENVBD_SRBEXT SrbExt, > + IN ULONG Existing, > + OUT PULONG Offset, > + OUT PULONG Length > + ); > + > extern NTSTATUS > AdapterDispatchPnp( > IN PXENVBD_ADAPTER Adapter, > diff --git a/src/xenvbd/srbext.h b/src/xenvbd/srbext.h > index 6b41475..c5ecdb6 100644 > --- a/src/xenvbd/srbext.h > +++ b/src/xenvbd/srbext.h > @@ -90,6 +90,10 @@ typedef struct _XENVBD_SRBEXT { > PSCSI_REQUEST_BLOCK Srb; > LIST_ENTRY Entry; > LONG Count; > + > + PVOID SGList; > + ULONG SGIndex; > + ULONG SGOffset; > } XENVBD_SRBEXT, *PXENVBD_SRBEXT; > > FORCEINLINE PXENVBD_SRBEXT > diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c > index 0fe8889..c9cb803 100644 > --- a/src/xenvbd/target.c > +++ b/src/xenvbd/target.c > @@ -49,18 +49,6 @@ > #include <suspend_interface.h> > #include <stdlib.h> > > -typedef struct _XENVBD_SG_LIST { > - // SGList from SRB > - PSTOR_SCATTER_GATHER_LIST SGList; > - // "current" values > - STOR_PHYSICAL_ADDRESS PhysAddr; > - ULONG PhysLen; > - // iteration > - ULONG Index; > - ULONG Offset; > - ULONG Length; > -} XENVBD_SG_LIST, *PXENVBD_SG_LIST; > - > #define TARGET_SIGNATURE 'odpX' > > typedef struct _XENVBD_LOOKASIDE { > @@ -732,22 +720,6 @@ __Operation( > } > } > > -static FORCEINLINE ULONG > -__Offset( > - __in STOR_PHYSICAL_ADDRESS PhysAddr > - ) > -{ > - return (ULONG)(PhysAddr.QuadPart & (PAGE_SIZE - 1)); > -} > - > -static FORCEINLINE PFN_NUMBER > -__Phys2Pfn( > - __in STOR_PHYSICAL_ADDRESS PhysAddr > - ) > -{ > - return (PFN_NUMBER)(PhysAddr.QuadPart >> PAGE_SHIFT); > -} > - > static FORCEINLINE MM_PAGE_PRIORITY > __TargetPriority( > __in PXENVBD_TARGET Target > @@ -763,42 +735,6 @@ __TargetPriority( > } > > static FORCEINLINE VOID > -SGListGet( > - IN OUT PXENVBD_SG_LIST SGList > - ) > -{ > - PSTOR_SCATTER_GATHER_ELEMENT SGElement; > - > - ASSERT3U(SGList->Index, <, SGList->SGList->NumberOfElements); > - > - SGElement = &SGList->SGList->List[SGList->Index]; > - > - SGList->PhysAddr.QuadPart = SGElement->PhysicalAddress.QuadPart + > SGList->Offset; > - SGList->PhysLen = __min(PAGE_SIZE - __Offset(SGList->PhysAddr) > - > SGList->Length, SGElement->Length - SGList->Offset); > - > - ASSERT3U(SGList->PhysLen, <=, PAGE_SIZE); > - ASSERT3U(SGList->Offset, <, SGElement->Length); > - > - SGList->Length = SGList->PhysLen; // gets reset every time for Granted, > every 1or2 times for Bounced > - SGList->Offset = SGList->Offset + SGList->PhysLen; > - if (SGList->Offset >= SGElement->Length) { > - SGList->Index = SGList->Index + 1; > - SGList->Offset = 0; > - } > -} > - > -static FORCEINLINE BOOLEAN > -SGListNext( > - IN OUT PXENVBD_SG_LIST SGList, > - IN ULONG AlignmentMask > - ) > -{ > - SGList->Length = 0; > - SGListGet(SGList); // get next PhysAddr and PhysLen > - return !((SGList->PhysAddr.QuadPart & AlignmentMask) || (SGList- > >PhysLen & AlignmentMask)); > -} > - > -static FORCEINLINE VOID > RequestCopyOutput( > __in PXENVBD_REQUEST Request > ) > @@ -820,33 +756,39 @@ RequestCopyOutput( > > static BOOLEAN > PrepareSegment( > - IN PXENVBD_TARGET Target, > + IN PXENVBD_TARGET Target, > IN PXENVBD_SEGMENT Segment, > - IN PXENVBD_SG_LIST SGList, > + IN PXENVBD_SRBEXT SrbExt, > IN BOOLEAN ReadOnly, > IN ULONG SectorsLeft, > OUT PULONG SectorsNow > ) > { > PFN_NUMBER Pfn; > + ULONG Offset; > + ULONG Length; > NTSTATUS Status; > PXENVBD_GRANTER Granter = FrontendGetGranter(Target->Frontend); > const ULONG SectorSize = TargetSectorSize(Target); > const ULONG SectorsPerPage = __SectorsPerPage(SectorSize); > > - if (SGListNext(SGList, SectorSize - 1)) { > + Pfn = AdapterGetNextSGEntry(TargetGetAdapter(Target), > + SrbExt, > + 0, > + &Offset, > + &Length); > + if ((Offset & (SectorSize - 1)) == 0 && > + (Length & (SectorSize - 1)) == 0) { > ++Target->SegsGranted; > // get first sector, last sector and count > - Segment->FirstSector = (UCHAR)((__Offset(SGList->PhysAddr) + > SectorSize - 1) / SectorSize); > + Segment->FirstSector = (UCHAR)((Offset + SectorSize - 1) / > SectorSize); > *SectorsNow = __min(SectorsLeft, SectorsPerPage - > Segment- > >FirstSector); > Segment->LastSector = (UCHAR)(Segment->FirstSector + > *SectorsNow - 1); > Segment->BufferId = NULL; // granted, ensure its null > Segment->Buffer = NULL; // granted, ensure its null > Segment->Length = 0; // granted, ensure its 0 > - Pfn = __Phys2Pfn(SGList->PhysAddr); > > - ASSERT3U((SGList->PhysLen / SectorSize), ==, *SectorsNow); > - ASSERT3U((SGList->PhysLen & (SectorSize - 1)), ==, 0); > + ASSERT3U((Length / SectorSize), ==, *SectorsNow); > } else { > PMDL Mdl; > > @@ -866,15 +808,19 @@ PrepareSegment( > Mdl->Process = NULL; > Mdl->MappedSystemVa = NULL; > Mdl->StartVa = NULL; > - Mdl->ByteCount = SGList->PhysLen; > - Mdl->ByteOffset = __Offset(SGList->PhysAddr); > - Segment->Pfn[0] = __Phys2Pfn(SGList->PhysAddr); > - > - if (SGList->PhysLen < *SectorsNow * SectorSize) { > - SGListGet(SGList); > + Mdl->ByteCount = Length; > + Mdl->ByteOffset = Offset; > + Segment->Pfn[0] = Pfn; > + > + if (Length < *SectorsNow * SectorSize) { > + Pfn = AdapterGetNextSGEntry(TargetGetAdapter(Target), > + SrbExt, > + Length, > + &Offset, > + &Length); > Mdl->Size += sizeof(PFN_NUMBER); > - Mdl->ByteCount = Mdl->ByteCount + SGList->PhysLen; > - Segment->Pfn[1] = __Phys2Pfn(SGList->PhysAddr); > + Mdl->ByteCount = Mdl->ByteCount + Length; > + Segment->Pfn[1] = Pfn; > } > #pragma warning(pop) > > @@ -922,9 +868,9 @@ fail1: > > static BOOLEAN > PrepareBlkifReadWrite( > - IN PXENVBD_TARGET Target, > + IN PXENVBD_TARGET Target, > IN PXENVBD_REQUEST Request, > - IN PXENVBD_SG_LIST SGList, > + IN PXENVBD_SRBEXT SrbExt, > IN ULONG MaxSegments, > IN ULONG64 SectorStart, > IN ULONG SectorsLeft, > @@ -956,7 +902,7 @@ PrepareBlkifReadWrite( > > if (!PrepareSegment(Target, > Segment, > - SGList, > + SrbExt, > ReadOnly, > SectorsLeft, > &SectorsNow)) > @@ -1075,7 +1021,6 @@ PrepareReadWrite( > ULONG64 SectorStart = Cdb_LogicalBlock(Srb); > ULONG SectorsLeft = Cdb_TransferBlock(Srb); > LIST_ENTRY List; > - XENVBD_SG_LIST SGList; > ULONG DebugCount; > > Srb->SrbStatus = SRB_STATUS_PENDING; > @@ -1083,9 +1028,6 @@ PrepareReadWrite( > InitializeListHead(&List); > SrbExt->Count = 0; > > - RtlZeroMemory(&SGList, sizeof(SGList)); > - SGList.SGList = StorPortGetScatterGatherList(TargetGetAdapter(Target), > Srb); > - > while (SectorsLeft > 0) { > ULONG MaxSegments; > ULONG SectorsDone = 0; > @@ -1102,7 +1044,7 @@ PrepareReadWrite( > > if (!PrepareBlkifReadWrite(Target, > Request, > - &SGList, > + SrbExt, > MaxSegments, > SectorStart, > SectorsLeft, > -- > 2.8.3 > > > _______________________________________________ > win-pv-devel mailing list > win-pv-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |