|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 4/5] Tidy up srbext.h
From: Owen Smith <owen.smith@xxxxxxxxxx>
* reorders struct definitions
* remove inline functions and unneccessary headers
* replace Request.Id with (ULONG64)(ULONG_PTR)Request
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvbd/adapter.c | 4 +-
src/xenvbd/ring.c | 323 ++++++++++++++++++++++++---------------------------
src/xenvbd/srbext.h | 100 ++++++----------
src/xenvbd/target.c | 6 +-
4 files changed, 194 insertions(+), 239 deletions(-)
diff --git a/src/xenvbd/adapter.c b/src/xenvbd/adapter.c
index 4fb75b8..7753388 100644
--- a/src/xenvbd/adapter.c
+++ b/src/xenvbd/adapter.c
@@ -1911,7 +1911,9 @@ AdapterHwBuildIo(
PXENVBD_SRBEXT SrbExt = Srb->SrbExtension;
PXENVBD_TARGET Target;
- InitSrbExt(Srb);
+ RtlZeroMemory(SrbExt, sizeof(XENVBD_SRBEXT));
+ SrbExt->Srb = Srb;
+ Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
InterlockedIncrement((PLONG)&Adapter->BuildIo);
switch (Srb->Function) {
diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
index 033975b..372f0d5 100644
--- a/src/xenvbd/ring.c
+++ b/src/xenvbd/ring.c
@@ -52,7 +52,6 @@
#include "debug.h"
#include "assert.h"
-#define TAG_HEADER 'gaTX'
#define XENVBD_MAX_RING_PAGE_ORDER (4)
#define XENVBD_MAX_RING_PAGES (1 << XENVBD_MAX_RING_PAGE_ORDER)
@@ -93,7 +92,6 @@ struct _XENVBD_RING {
XENVBD_QUEUE PreparedReqs;
XENVBD_QUEUE SubmittedReqs;
XENVBD_QUEUE ShutdownSrbs;
- ULONG NextTag;
ULONG Submitted;
ULONG Received;
@@ -234,36 +232,6 @@ __Pfn(
return (PFN_NUMBER)(ULONG_PTR)(MmGetPhysicalAddress(VirtAddr).QuadPart >>
PAGE_SHIFT);
}
-static FORCEINLINE ULONG64
-__RingGetTag(
- IN PXENVBD_RING Ring,
- IN PXENVBD_REQUEST Request
- )
-{
- UNREFERENCED_PARAMETER(Ring);
- return ((ULONG64)TAG_HEADER << 32) | (ULONG64)Request->Id;
-}
-
-static FORCEINLINE BOOLEAN
-__RingPutTag(
- IN PXENVBD_RING Ring,
- IN ULONG64 Id,
- OUT PULONG Tag
- )
-{
- ULONG Header = (ULONG)((Id >> 32) & 0xFFFFFFFF);
-
- UNREFERENCED_PARAMETER(Ring);
-
- *Tag = (ULONG)(Id & 0xFFFFFFFF);
- if (Header != TAG_HEADER) {
- Error("PUT_TAG (%llx) TAG_HEADER (%08x%08x)\n", Id, Header, *Tag);
- return FALSE;
- }
-
- return TRUE;
-}
-
static FORCEINLINE VOID
__RingInsert(
IN PXENVBD_RING Ring,
@@ -288,7 +256,7 @@ __RingInsert(
req_indirect->operation = BLKIF_OP_INDIRECT;
req_indirect->indirect_op = Request->Operation;
req_indirect->nr_segments = Request->NrSegments;
- req_indirect->id = __RingGetTag(Ring, Request);
+ req_indirect->id = (ULONG64)(ULONG_PTR)Request;
req_indirect->sector_number = Request->FirstSector;
req_indirect->handle =
(USHORT)FrontendGetDeviceId(Ring->Frontend);
@@ -299,7 +267,7 @@ __RingInsert(
PageEntry != &Request->Indirects &&
SegEntry != &Request->Segments;
++PageIdx, PageEntry = PageEntry->Flink) {
- PXENVBD_INDIRECT Page = CONTAINING_RECORD(PageEntry,
XENVBD_INDIRECT, Entry);
+ PXENVBD_INDIRECT Page = CONTAINING_RECORD(PageEntry,
XENVBD_INDIRECT, ListEntry);
req_indirect->indirect_grefs[PageIdx] =
GranterReference(Granter, Page->Grant);
@@ -307,7 +275,7 @@ __RingInsert(
SegIdx < XENVBD_MAX_SEGMENTS_PER_PAGE &&
SegEntry != &Request->Segments;
++SegIdx, SegEntry = SegEntry->Flink) {
- PXENVBD_SEGMENT Segment = CONTAINING_RECORD(SegEntry,
XENVBD_SEGMENT, Entry);
+ PXENVBD_SEGMENT Segment = CONTAINING_RECORD(SegEntry,
XENVBD_SEGMENT, ListEntry);
Page->Page[SegIdx].GrantRef = GranterReference(Granter,
Segment->Grant);
Page->Page[SegIdx].First = Segment->FirstSector;
@@ -322,14 +290,14 @@ __RingInsert(
req->operation = Request->Operation;
req->nr_segments = (UCHAR)Request->NrSegments;
req->handle =
(USHORT)FrontendGetDeviceId(Ring->Frontend);
- req->id = __RingGetTag(Ring, Request);
+ req->id = (ULONG64)(ULONG_PTR)Request;
req->sector_number = Request->FirstSector;
for (Index = 0, Entry = Request->Segments.Flink;
Index < BLKIF_MAX_SEGMENTS_PER_REQUEST &&
Entry != &Request->Segments;
++Index, Entry = Entry->Flink) {
- PXENVBD_SEGMENT Segment = CONTAINING_RECORD(Entry,
XENVBD_SEGMENT, Entry);
+ PXENVBD_SEGMENT Segment = CONTAINING_RECORD(Entry,
XENVBD_SEGMENT, ListEntry);
req->seg[Index].gref = GranterReference(Granter,
Segment->Grant);
req->seg[Index].first_sect = Segment->FirstSector;
req->seg[Index].last_sect = Segment->LastSector;
@@ -342,7 +310,7 @@ __RingInsert(
req->operation = Request->Operation;
req->nr_segments = 0;
req->handle =
(USHORT)FrontendGetDeviceId(Ring->Frontend);
- req->id = __RingGetTag(Ring, Request);
+ req->id = (ULONG64)(ULONG_PTR)Request;
req->sector_number = Request->FirstSector;
break;
@@ -352,7 +320,7 @@ __RingInsert(
req_discard->operation = BLKIF_OP_DISCARD;
req_discard->flag = Request->Flags;
req_discard->handle =
(USHORT)FrontendGetDeviceId(Ring->Frontend);
- req_discard->id = __RingGetTag(Ring, Request);
+ req_discard->id = (ULONG64)(ULONG_PTR)Request;
req_discard->sector_number = Request->FirstSector;
req_discard->nr_sectors = Request->NrSectors;
} break;
@@ -481,7 +449,6 @@ RingGetRequest(
goto fail1;
RtlZeroMemory(Request, sizeof(XENVBD_REQUEST));
- Request->Id = (ULONG)InterlockedIncrement((PLONG)&Ring->NextTag);
InitializeListHead(&Request->Segments);
InitializeListHead(&Request->Indirects);
@@ -497,25 +464,25 @@ RingPutRequest(
IN PXENVBD_REQUEST Request
)
{
- PLIST_ENTRY Entry;
+ PLIST_ENTRY ListEntry;
for (;;) {
PXENVBD_SEGMENT Segment;
- Entry = RemoveHeadList(&Request->Segments);
- if (Entry == &Request->Segments)
+ ListEntry = RemoveHeadList(&Request->Segments);
+ if (ListEntry == &Request->Segments)
break;
- Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry);
+ Segment = CONTAINING_RECORD(ListEntry, XENVBD_SEGMENT, ListEntry);
RingPutSegment(Ring, Segment);
}
for (;;) {
PXENVBD_INDIRECT Indirect;
- Entry = RemoveHeadList(&Request->Indirects);
- if (Entry == &Request->Indirects)
+ ListEntry = RemoveHeadList(&Request->Indirects);
+ if (ListEntry == &Request->Indirects)
break;
- Indirect = CONTAINING_RECORD(Entry, XENVBD_INDIRECT, Entry);
+ Indirect = CONTAINING_RECORD(ListEntry, XENVBD_INDIRECT, ListEntry);
RingPutIndirect(Ring, Indirect);
}
@@ -524,21 +491,24 @@ RingPutRequest(
}
static FORCEINLINE PXENVBD_REQUEST
-RingRequestFromTag(
+RingFindRequest(
IN PXENVBD_RING Ring,
- IN ULONG Tag
+ IN ULONG64 Id
)
{
KIRQL Irql;
- PLIST_ENTRY Entry;
+ PLIST_ENTRY ListEntry;
+ PXENVBD_REQUEST Request;
PXENVBD_QUEUE Queue = &Ring->SubmittedReqs;
KeAcquireSpinLock(&Queue->Lock, &Irql);
- for (Entry = Queue->List.Flink; Entry != &Queue->List; Entry =
Entry->Flink) {
- PXENVBD_REQUEST Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST,
Entry);
- if (Request->Id == Tag) {
- RemoveEntryList(&Request->Entry);
+ for (ListEntry = Queue->List.Flink;
+ ListEntry != &Queue->List;
+ ListEntry = ListEntry->Flink) {
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
+ if ((ULONG64)(ULONG_PTR)Request == Id) {
+ RemoveEntryList(&Request->ListEntry);
--Queue->Current;
KeReleaseSpinLock(&Queue->Lock, Irql);
return Request;
@@ -546,9 +516,9 @@ RingRequestFromTag(
}
KeReleaseSpinLock(&Queue->Lock, Irql);
- Warning("Target[%d] : Tag %x not found in submitted list (%u items)\n",
+ Warning("Target[%d] : Tag %llx not found in submitted list (%u items)\n",
FrontendGetTargetId(Ring->Frontend),
- Tag,
+ Id,
QueueCount(Queue));
return NULL;
}
@@ -636,15 +606,15 @@ RingRequestCopyOutput(
IN PXENVBD_REQUEST Request
)
{
- PLIST_ENTRY Entry;
+ PLIST_ENTRY ListEntry;
if (Request->Operation != BLKIF_OP_READ)
return;
- for (Entry = Request->Segments.Flink;
- Entry != &Request->Segments;
- Entry = Entry->Flink) {
- PXENVBD_SEGMENT Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT,
Entry);
+ for (ListEntry = Request->Segments.Flink;
+ ListEntry != &Request->Segments;
+ ListEntry = ListEntry->Flink) {
+ PXENVBD_SEGMENT Segment = CONTAINING_RECORD(ListEntry, XENVBD_SEGMENT,
ListEntry);
PXENVBD_BOUNCE Bounce = Segment->Bounce;
if (Bounce) {
@@ -779,10 +749,11 @@ RingPrepareBlkifReadWrite(
OUT PULONG SectorsDone
)
{
+ PSCSI_REQUEST_BLOCK Srb = SrbExt->Srb;
UCHAR Operation;
BOOLEAN ReadOnly;
ULONG Index;
- __RingOperation(Cdb_OperationEx(Request->Srb), &Operation, &ReadOnly);
+ __RingOperation(Cdb_OperationEx(Srb), &Operation, &ReadOnly);
Request->Operation = Operation;
Request->NrSegments = 0;
@@ -799,7 +770,7 @@ RingPrepareBlkifReadWrite(
if (Segment == NULL)
goto fail1;
- InsertTailList(&Request->Segments, &Segment->Entry);
+ InsertTailList(&Request->Segments, &Segment->ListEntry);
++Request->NrSegments;
if (!RingPrepareSegment(Ring,
@@ -841,7 +812,7 @@ RingPrepareBlkifIndirect(
Indirect = RingGetIndirect(Ring);
if (Indirect == NULL)
goto fail1;
- InsertTailList(&Request->Indirects, &Indirect->Entry);
+ InsertTailList(&Request->Indirects, &Indirect->ListEntry);
NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
}
@@ -879,16 +850,16 @@ RingQueueRequestList(
ULONG Count = 0;
for (;;) {
PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry;
+ PLIST_ENTRY ListEntry;
- Entry = RemoveHeadList(List);
- if (Entry == List)
+ ListEntry = RemoveHeadList(List);
+ if (ListEntry == List)
break;
++Count;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
__RingIncBlkifOpCount(Ring, Request);
- QueueAppend(&Ring->PreparedReqs, &Request->Entry);
+ QueueAppend(&Ring->PreparedReqs, &Request->ListEntry);
}
return Count;
}
@@ -901,13 +872,13 @@ RingCancelRequestList(
{
for (;;) {
PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry;
+ PLIST_ENTRY ListEntry;
- Entry = RemoveHeadList(List);
- if (Entry == List)
+ ListEntry = RemoveHeadList(List);
+ if (ListEntry == List)
break;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
RingPutRequest(Ring, Request);
}
}
@@ -918,7 +889,7 @@ RingPrepareReadWrite(
IN PSCSI_REQUEST_BLOCK Srb
)
{
- PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
+ PXENVBD_SRBEXT SrbExt = Srb->SrbExtension;
ULONG64 SectorStart = Cdb_LogicalBlock(Srb);
ULONG SectorsLeft = Cdb_TransferBlock(Srb);
LIST_ENTRY List;
@@ -927,7 +898,7 @@ RingPrepareReadWrite(
Srb->SrbStatus = SRB_STATUS_PENDING;
InitializeListHead(&List);
- SrbExt->Count = 0;
+ SrbExt->RequestCount = 0;
while (SectorsLeft > 0) {
ULONG MaxSegments;
@@ -937,10 +908,10 @@ RingPrepareReadWrite(
Request = RingGetRequest(Ring);
if (Request == NULL)
goto fail1;
- InsertTailList(&List, &Request->Entry);
- InterlockedIncrement(&SrbExt->Count);
+ InsertTailList(&List, &Request->ListEntry);
+ InterlockedIncrement(&SrbExt->RequestCount);
- Request->Srb = Srb;
+ Request->SrbExt = SrbExt;
MaxSegments = RingUseIndirect(Ring, SectorsLeft);
if (!RingPrepareBlkifReadWrite(Ring,
@@ -962,10 +933,10 @@ RingPrepareReadWrite(
}
DebugCount = RingQueueRequestList(Ring, &List);
- if (DebugCount != (ULONG)SrbExt->Count) {
+ if (DebugCount != (ULONG)SrbExt->RequestCount) {
Trace("[%u] %d != %u\n",
FrontendGetTargetId(Ring->Frontend),
- SrbExt->Count,
+ SrbExt->RequestCount,
DebugCount);
}
return TRUE;
@@ -974,7 +945,7 @@ fail3:
fail2:
fail1:
RingCancelRequestList(Ring, &List);
- SrbExt->Count = 0;
+ SrbExt->RequestCount = 0;
Srb->SrbStatus = SRB_STATUS_ERROR;
return FALSE;
}
@@ -985,7 +956,7 @@ RingPrepareSyncCache(
IN PSCSI_REQUEST_BLOCK Srb
)
{
- PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
+ PXENVBD_SRBEXT SrbExt = Srb->SrbExtension;
PXENVBD_REQUEST Request;
LIST_ENTRY List;
UCHAR Operation;
@@ -999,30 +970,30 @@ RingPrepareSyncCache(
Operation = BLKIF_OP_WRITE_BARRIER;
InitializeListHead(&List);
- SrbExt->Count = 0;
+ SrbExt->RequestCount = 0;
Request = RingGetRequest(Ring);
if (Request == NULL)
goto fail1;
- InsertTailList(&List, &Request->Entry);
- InterlockedIncrement(&SrbExt->Count);
+ InsertTailList(&List, &Request->ListEntry);
+ InterlockedIncrement(&SrbExt->RequestCount);
- Request->Srb = Srb;
+ Request->SrbExt = SrbExt;
Request->Operation = Operation;
Request->FirstSector = Cdb_LogicalBlock(Srb);
DebugCount = RingQueueRequestList(Ring, &List);
- if (DebugCount != (ULONG)SrbExt->Count) {
+ if (DebugCount != (ULONG)SrbExt->RequestCount) {
Trace("[%u] %d != %u\n",
FrontendGetTargetId(Ring->Frontend),
- SrbExt->Count,
+ SrbExt->RequestCount,
DebugCount);
}
return TRUE;
fail1:
RingCancelRequestList(Ring, &List);
- SrbExt->Count = 0;
+ SrbExt->RequestCount = 0;
Srb->SrbStatus = SRB_STATUS_ERROR;
return FALSE;
}
@@ -1033,7 +1004,7 @@ RingPrepareUnmap(
IN PSCSI_REQUEST_BLOCK Srb
)
{
- PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
+ PXENVBD_SRBEXT SrbExt = Srb->SrbExtension;
PUNMAP_LIST_HEADER Unmap = Srb->DataBuffer;
ULONG Count =
_byteswap_ushort(*(PUSHORT)Unmap->BlockDescrDataLength) /
sizeof(UNMAP_BLOCK_DESCRIPTOR);
ULONG Index;
@@ -1043,7 +1014,7 @@ RingPrepareUnmap(
Srb->SrbStatus = SRB_STATUS_PENDING;
InitializeListHead(&List);
- SrbExt->Count = 0;
+ SrbExt->RequestCount = 0;
for (Index = 0; Index < Count; ++Index) {
PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
@@ -1052,10 +1023,10 @@ RingPrepareUnmap(
Request = RingGetRequest(Ring);
if (Request == NULL)
goto fail1;
- InsertTailList(&List, &Request->Entry);
- InterlockedIncrement(&SrbExt->Count);
+ InsertTailList(&List, &Request->ListEntry);
+ InterlockedIncrement(&SrbExt->RequestCount);
- Request->Srb = Srb;
+ Request->SrbExt = SrbExt;
Request->Operation = BLKIF_OP_DISCARD;
Request->FirstSector =
_byteswap_uint64(*(PULONG64)Descr->StartingLba);
Request->NrSectors = _byteswap_ulong(*(PULONG)Descr->LbaCount);
@@ -1063,17 +1034,17 @@ RingPrepareUnmap(
}
DebugCount = RingQueueRequestList(Ring, &List);
- if (DebugCount != (ULONG)SrbExt->Count) {
+ if (DebugCount != (ULONG)SrbExt->RequestCount) {
Trace("[%u] %d != %u\n",
FrontendGetTargetId(Ring->Frontend),
- SrbExt->Count,
+ SrbExt->RequestCount,
DebugCount);
}
return TRUE;
fail1:
RingCancelRequestList(Ring, &List);
- SrbExt->Count = 0;
+ SrbExt->RequestCount = 0;
Srb->SrbStatus = SRB_STATUS_ERROR;
return FALSE;
}
@@ -1084,13 +1055,13 @@ RingPrepareFresh(
)
{
PXENVBD_SRBEXT SrbExt;
- PLIST_ENTRY Entry;
+ PLIST_ENTRY ListEntry;
- Entry = QueuePop(&Ring->FreshSrbs);
- if (Entry == NULL)
+ ListEntry = QueuePop(&Ring->FreshSrbs);
+ if (ListEntry == NULL)
return FALSE; // fresh queue is empty
- SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
+ SrbExt = CONTAINING_RECORD(ListEntry, XENVBD_SRBEXT, ListEntry);
switch (Cdb_OperationEx(SrbExt->Srb)) {
case SCSIOP_READ:
@@ -1110,7 +1081,7 @@ RingPrepareFresh(
ASSERT(FALSE);
break;
}
- QueueUnPop(&Ring->FreshSrbs, &SrbExt->Entry);
+ QueueUnPop(&Ring->FreshSrbs, &SrbExt->ListEntry);
return FALSE; // prepare failed
}
@@ -1166,22 +1137,22 @@ RingSubmitPrepared(
for (;;) {
PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry;
+ PLIST_ENTRY ListEntry;
- Entry = QueuePop(&Ring->PreparedReqs);
- if (Entry == NULL)
+ ListEntry = QueuePop(&Ring->PreparedReqs);
+ if (ListEntry == NULL)
break;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
- QueueAppend(&Ring->SubmittedReqs, &Request->Entry);
+ QueueAppend(&Ring->SubmittedReqs, &Request->ListEntry);
KeMemoryBarrier();
if (RingSubmit(Ring, Request))
continue;
- QueueRemove(&Ring->SubmittedReqs, &Request->Entry);
- QueueUnPop(&Ring->PreparedReqs, &Request->Entry);
+ QueueRemove(&Ring->SubmittedReqs, &Request->ListEntry);
+ QueueUnPop(&Ring->PreparedReqs, &Request->ListEntry);
return FALSE; // ring full
}
@@ -1207,12 +1178,17 @@ RingCompleteShutdown(
Target = FrontendGetTarget(Ring->Frontend);
Adapter = TargetGetAdapter(Target);
for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PLIST_ENTRY Entry = QueuePop(&Ring->ShutdownSrbs);
- if (Entry == NULL)
+ PXENVBD_SRBEXT SrbExt;
+ PSCSI_REQUEST_BLOCK Srb;
+ PLIST_ENTRY ListEntry;
+
+ ListEntry = QueuePop(&Ring->ShutdownSrbs);
+ if (ListEntry == NULL)
break;
- SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
- SrbExt->Srb->SrbStatus = SRB_STATUS_SUCCESS;
+ SrbExt = CONTAINING_RECORD(ListEntry, XENVBD_SRBEXT, ListEntry);
+ Srb = SrbExt->Srb;
+
+ Srb->SrbStatus = SRB_STATUS_SUCCESS;
AdapterCompleteSrb(Adapter, SrbExt);
}
}
@@ -1269,7 +1245,7 @@ RingSubmitRequests(
static VOID
RingCompleteResponse(
IN PXENVBD_RING Ring,
- IN ULONG Tag,
+ IN ULONG64 Id,
IN SHORT Status
)
{
@@ -1277,13 +1253,12 @@ RingCompleteResponse(
PSCSI_REQUEST_BLOCK Srb;
PXENVBD_SRBEXT SrbExt;
- Request = RingRequestFromTag(Ring, Tag);
+ Request = RingFindRequest(Ring, Id);
if (Request == NULL)
return;
- Srb = Request->Srb;
- SrbExt = GetSrbExt(Srb);
- ASSERT3P(SrbExt, !=, NULL);
+ SrbExt = Request->SrbExt;
+ Srb = SrbExt->Srb;
switch (Status) {
case BLKIF_RSP_OKAY:
@@ -1299,10 +1274,10 @@ RingCompleteResponse(
case BLKIF_RSP_ERROR:
default:
- Warning("Target[%d] : %s BLKIF_RSP_ERROR (Tag %x)\n",
+ Warning("Target[%d] : %s BLKIF_RSP_ERROR (Tag %llx)\n",
FrontendGetTargetId(Ring->Frontend),
__BlkifOperationName(Request->Operation),
- Tag);
+ Id);
Srb->SrbStatus = SRB_STATUS_ERROR;
break;
}
@@ -1310,7 +1285,7 @@ RingCompleteResponse(
RingPutRequest(Ring, Request);
// complete srb
- if (InterlockedDecrement(&SrbExt->Count) == 0) {
+ if (InterlockedDecrement(&SrbExt->RequestCount) == 0) {
PXENVBD_TARGET Target = FrontendGetTarget(Ring->Frontend);
PXENVBD_ADAPTER Adapter = TargetGetAdapter(Target);
@@ -1358,18 +1333,14 @@ RingPoll(
break;
while (rsp_cons != rsp_prod && !Retry) {
- blkif_response_t* Response;
- ULONG Tag;
+ blkif_response_t* rsp;
- Response = RING_GET_RESPONSE(&Ring->Front, rsp_cons);
+ rsp = RING_GET_RESPONSE(&Ring->Front, rsp_cons);
++rsp_cons;
+ ++Ring->Received;
- if (__RingPutTag(Ring, Response->id, &Tag)) {
- ++Ring->Received;
- RingCompleteResponse(Ring, Tag, Response->status);
- }
-
- RtlZeroMemory(Response, sizeof(union blkif_sring_entry));
+ RingCompleteResponse(Ring, rsp->id, rsp->status);
+ RtlZeroMemory(rsp, sizeof(union blkif_sring_entry));
if (rsp_cons - Ring->Front.rsp_cons > RING_SIZE(&Ring->Front) / 4)
Retry = TRUE;
@@ -1960,32 +1931,40 @@ RingDisable(
// Abort Fresh SRBs
for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PLIST_ENTRY Entry = QueuePop(&Ring->FreshSrbs);
- if (Entry == NULL)
+ PXENVBD_SRBEXT SrbExt;
+ PSCSI_REQUEST_BLOCK Srb;
+ PLIST_ENTRY ListEntry;
+
+ ListEntry = QueuePop(&Ring->FreshSrbs);
+ if (ListEntry == NULL)
break;
- SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
+ SrbExt = CONTAINING_RECORD(ListEntry, XENVBD_SRBEXT, ListEntry);
+ Srb = SrbExt->Srb;
- SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
- SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
+ Srb->SrbStatus = SRB_STATUS_ABORTED;
+ Srb->ScsiStatus = 0x40; // SCSI_ABORTED;
AdapterCompleteSrb(Adapter, SrbExt);
}
// Fail PreparedReqs
for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry = QueuePop(&Ring->PreparedReqs);
- if (Entry == NULL)
+ PXENVBD_SRBEXT SrbExt;
+ PSCSI_REQUEST_BLOCK Srb;
+ PXENVBD_REQUEST Request;
+ PLIST_ENTRY ListEntry;
+
+ ListEntry = QueuePop(&Ring->PreparedReqs);
+ if (ListEntry == NULL)
break;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
- SrbExt = GetSrbExt(Request->Srb);
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
+ SrbExt = Request->SrbExt;
+ Srb = SrbExt->Srb;
- SrbExt->Srb->SrbStatus = SRB_STATUS_ABORTED;
RingPutRequest(Ring, Request);
- if (InterlockedDecrement(&SrbExt->Count) == 0) {
- SrbExt->Srb->ScsiStatus = 0x40; // SCSI_ABORTED
+ if (InterlockedDecrement(&SrbExt->RequestCount) == 0) {
+ Srb->SrbStatus = SRB_STATUS_ABORTED;
+ Srb->ScsiStatus = 0x40; // SCSI_ABORTED
AdapterCompleteSrb(Adapter, SrbExt);
}
}
@@ -2072,7 +2051,7 @@ RingQueueRequest(
)
{
QueueAppend(&Ring->FreshSrbs,
- &SrbExt->Entry);
+ &SrbExt->ListEntry);
if (!Ring->Enabled)
return;
@@ -2088,7 +2067,7 @@ RingQueueShutdown(
)
{
QueueAppend(&Ring->ShutdownSrbs,
- &SrbExt->Entry);
+ &SrbExt->ListEntry);
if (!Ring->Enabled)
return;
@@ -2108,47 +2087,53 @@ RingReQueueRequests(
// pop all submitted requests, cleanup and add associated SRB to a list
for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry = QueuePop(&Ring->SubmittedReqs);
- if (Entry == NULL)
+ PXENVBD_SRBEXT SrbExt;
+ PXENVBD_REQUEST Request;
+ PLIST_ENTRY ListEntry;
+
+ ListEntry = QueuePop(&Ring->SubmittedReqs);
+ if (ListEntry == NULL)
break;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
- SrbExt = GetSrbExt(Request->Srb);
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
+ SrbExt = Request->SrbExt;
RingPutRequest(Ring, Request);
- if (InterlockedDecrement(&SrbExt->Count) == 0) {
- InsertTailList(&List, &SrbExt->Entry);
+ if (InterlockedDecrement(&SrbExt->RequestCount) == 0) {
+ InsertTailList(&List, &SrbExt->ListEntry);
}
}
// pop all prepared requests, cleanup and add associated SRB to a list
for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry = QueuePop(&Ring->PreparedReqs);
- if (Entry == NULL)
+ PXENVBD_SRBEXT SrbExt;
+ PXENVBD_REQUEST Request;
+ PLIST_ENTRY ListEntry;
+
+ ListEntry = QueuePop(&Ring->PreparedReqs);
+ if (ListEntry == NULL)
break;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
- SrbExt = GetSrbExt(Request->Srb);
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
+ SrbExt = Request->SrbExt;
RingPutRequest(Ring, Request);
- if (InterlockedDecrement(&SrbExt->Count) == 0) {
- InsertTailList(&List, &SrbExt->Entry);
+ if (InterlockedDecrement(&SrbExt->RequestCount) == 0) {
+ InsertTailList(&List, &SrbExt->ListEntry);
}
}
// foreach SRB in list, put on start of FreshSrbs
for (;;) {
- PXENVBD_SRBEXT SrbExt;
- PLIST_ENTRY Entry = RemoveTailList(&List);
- if (Entry == &List)
+ PXENVBD_SRBEXT SrbExt;
+ PLIST_ENTRY ListEntry;
+
+ ListEntry = RemoveTailList(&List);
+ if (ListEntry == &List)
break;
- SrbExt = CONTAINING_RECORD(Entry, XENVBD_SRBEXT, Entry);
+ SrbExt = CONTAINING_RECORD(ListEntry, XENVBD_SRBEXT, ListEntry);
- QueueUnPop(&Ring->FreshSrbs, &SrbExt->Entry);
+ QueueUnPop(&Ring->FreshSrbs, &SrbExt->ListEntry);
}
// now the first set of requests popped off submitted list is the next SRB
diff --git a/src/xenvbd/srbext.h b/src/xenvbd/srbext.h
index 54ec119..c84c241 100644
--- a/src/xenvbd/srbext.h
+++ b/src/xenvbd/srbext.h
@@ -33,9 +33,32 @@
#define _XENVBD_SRBEXT_H
#include <ntddk.h>
-#include <xenvbd-storport.h>
+#include <storport.h>
#include <xen.h>
-#include "assert.h"
+
+typedef struct _XENVBD_SRBEXT {
+ PSCSI_REQUEST_BLOCK Srb;
+ LIST_ENTRY ListEntry;
+ LONG RequestCount;
+
+ PVOID SGList;
+ ULONG SGIndex;
+ ULONG SGOffset;
+} XENVBD_SRBEXT, *PXENVBD_SRBEXT;
+
+typedef struct _XENVBD_REQUEST {
+ PXENVBD_SRBEXT SrbExt;
+ LIST_ENTRY ListEntry;
+
+ UCHAR Operation; //
BLKIF_OP_{READ/WRITE/BARRIER/DISCARD}
+ UCHAR Flags; // BLKIF_OP_DISCARD only
+ USHORT NrSegments; // BLKIF_OP_{READ/WRITE} only, 0-11
(direct) or 11-4096 (indirect)
+ LIST_ENTRY Segments; // BLKIF_OP_{READ/WRITE} only
+
+ ULONG64 FirstSector;
+ ULONG64 NrSectors; // BLKIF_OP_DISCARD only
+ LIST_ENTRY Indirects; // BLKIF_OP_{READ/WRITE} with
NrSegments > 11 only
+} XENVBD_REQUEST, *PXENVBD_REQUEST;
typedef struct _XENVBD_BOUNCE {
PVOID BouncePtr;
@@ -45,6 +68,14 @@ typedef struct _XENVBD_BOUNCE {
PFN_NUMBER SourcePfn[2];
} XENVBD_BOUNCE, *PXENVBD_BOUNCE;
+typedef struct _XENVBD_SEGMENT {
+ LIST_ENTRY ListEntry;
+ PVOID Grant;
+ UCHAR FirstSector;
+ UCHAR LastSector;
+ PXENVBD_BOUNCE Bounce;
+} XENVBD_SEGMENT, *PXENVBD_SEGMENT;
+
#pragma pack(push, 1)
typedef struct _BLKIF_SEGMENT {
ULONG GrantRef;
@@ -56,74 +87,11 @@ typedef struct _BLKIF_SEGMENT {
#define XENVBD_MAX_SEGMENTS_PER_PAGE (PAGE_SIZE / sizeof(BLKIF_SEGMENT))
-// Internal indirect context
typedef struct _XENVBD_INDIRECT {
- LIST_ENTRY Entry;
+ LIST_ENTRY ListEntry;
PBLKIF_SEGMENT Page;
PVOID Grant;
PMDL Mdl;
} XENVBD_INDIRECT, *PXENVBD_INDIRECT;
-// Internal segment context
-typedef struct _XENVBD_SEGMENT {
- LIST_ENTRY Entry;
- PVOID Grant;
- UCHAR FirstSector;
- UCHAR LastSector;
- ULONG Length;
- PXENVBD_BOUNCE Bounce;
-} XENVBD_SEGMENT, *PXENVBD_SEGMENT;
-
-// Internal request context
-typedef struct _XENVBD_REQUEST {
- PSCSI_REQUEST_BLOCK Srb;
- LIST_ENTRY Entry;
- ULONG Id;
-
- UCHAR Operation; //
BLKIF_OP_{READ/WRITE/BARRIER/DISCARD}
- UCHAR Flags; // BLKIF_OP_DISCARD only
- USHORT NrSegments; // BLKIF_OP_{READ/WRITE} only, 0-11
(direct) or 11-4096 (indirect)
- LIST_ENTRY Segments; // BLKIF_OP_{READ/WRITE} only
-
- ULONG64 FirstSector;
- ULONG64 NrSectors; // BLKIF_OP_DISCARD only
- LIST_ENTRY Indirects; // BLKIF_OP_{READ/WRITE} with
NrSegments > 11 only
-} XENVBD_REQUEST, *PXENVBD_REQUEST;
-
-// SRBExtension - context for SRBs
-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
-GetSrbExt(
- __in PSCSI_REQUEST_BLOCK Srb
- )
-{
- if (Srb && Srb->Function != SRB_FUNCTION_STORAGE_REQUEST_BLOCK) {
- ASSERT3P(Srb->SrbExtension, !=, NULL);
- return Srb->SrbExtension;
- }
- return NULL;
-}
-
-FORCEINLINE VOID
-InitSrbExt(
- __in PSCSI_REQUEST_BLOCK Srb
- )
-{
- PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
- if (SrbExt) {
- RtlZeroMemory(SrbExt, sizeof(XENVBD_SRBEXT));
- SrbExt->Srb = Srb;
- }
- Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
-}
-
#endif // _XENVBD_SRBEXT_H
diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c
index 37b9a2f..e46459b 100644
--- a/src/xenvbd/target.c
+++ b/src/xenvbd/target.c
@@ -266,7 +266,7 @@ TargetReadWrite(
)
{
PXENVBD_DISKINFO DiskInfo = FrontendGetDiskInfo(Target->Frontend);
- PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
+ PXENVBD_SRBEXT SrbExt = Srb->SrbExtension;
PXENVBD_RING Ring = FrontendGetRing(Target->Frontend);
if (FrontendGetCaps(Target->Frontend)->Connected == FALSE) {
@@ -293,7 +293,7 @@ TargetSyncCache(
__in PSCSI_REQUEST_BLOCK Srb
)
{
- PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
+ PXENVBD_SRBEXT SrbExt = Srb->SrbExtension;
PXENVBD_RING Ring = FrontendGetRing(Target->Frontend);
if (FrontendGetCaps(Target->Frontend)->Connected == FALSE) {
@@ -321,7 +321,7 @@ TargetUnmap(
__in PSCSI_REQUEST_BLOCK Srb
)
{
- PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
+ PXENVBD_SRBEXT SrbExt = Srb->SrbExtension;
PXENVBD_RING Ring = FrontendGetRing(Target->Frontend);
if (FrontendGetCaps(Target->Frontend)->Connected == FALSE) {
--
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 |