|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [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>
---
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |