[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 8/8] Rework indirect context structure
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xenvbd/blockring.c | 48 ++++++++++++++++----------------- src/xenvbd/pdo.c | 72 ++++++++++++++++++++++++++++++++------------------ src/xenvbd/srbext.h | 13 ++++++--- 3 files changed, 79 insertions(+), 54 deletions(-) diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c index 28f1393..6ca9cb2 100644 --- a/src/xenvbd/blockring.c +++ b/src/xenvbd/blockring.c @@ -152,9 +152,10 @@ __BlockRingInsert( case BLKIF_OP_WRITE: if (Request->NrSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) { // Indirect - ULONG PageIndex; - ULONG SegmentIndex; - PLIST_ENTRY Entry; + ULONG PageIdx; + ULONG SegIdx; + PLIST_ENTRY PageEntry; + PLIST_ENTRY SegEntry; blkif_request_indirect_t* req_indirect; req_indirect = (blkif_request_indirect_t*)req; @@ -165,29 +166,28 @@ __BlockRingInsert( req_indirect->sector_number = Request->FirstSector; req_indirect->handle = (USHORT)BlockRing->DeviceId; - for (PageIndex = 0, SegmentIndex = 0, Entry = Request->Segments.Flink; - PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST && - Entry != &Request->Segments; - Entry = Entry->Flink) { - PBLKIF_SEGMENT Indirect = Request->Pages[PageIndex]; - PXENVBD_SEGMENT Segment = CONTAINING_RECORD(Entry, XENVBD_SEGMENT, Entry); - - Indirect[SegmentIndex].GrantRef = GranterReference(Granter, Segment->Grant); - Indirect[SegmentIndex].First = Segment->FirstSector; - Indirect[SegmentIndex].Last = Segment->LastSector; - - ++SegmentIndex; - if (SegmentIndex >= XENVBD_MAX_SEGMENTS_PER_PAGE) { - ++PageIndex; - SegmentIndex = 0; + for (PageIdx = 0, + PageEntry = Request->Indirects.Flink, + SegEntry = Request->Segments.Flink; + PageIdx < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST && + PageEntry != &Request->Indirects && + SegEntry != &Request->Segments; + ++PageIdx, PageEntry = PageEntry->Flink) { + PXENVBD_INDIRECT Page = CONTAINING_RECORD(PageEntry, XENVBD_INDIRECT, Entry); + + req_indirect->indirect_grefs[PageIdx] = GranterReference(Granter, Page->Grant); + + for (SegIdx = 0; + SegIdx < XENVBD_MAX_SEGMENTS_PER_PAGE && + SegEntry != &Request->Segments; + ++SegIdx, SegEntry = SegEntry->Flink) { + PXENVBD_SEGMENT Segment = CONTAINING_RECORD(SegEntry, XENVBD_SEGMENT, Entry); + + Page->Page[SegIdx].GrantRef = GranterReference(Granter, Segment->Grant); + Page->Page[SegIdx].First = Segment->FirstSector; + Page->Page[SegIdx].Last = Segment->LastSector; } } - for (PageIndex = 0; - PageIndex < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST && - Request->Grants[PageIndex] != NULL; - ++PageIndex) { - req_indirect->indirect_grefs[PageIndex] = GranterReference(Granter, Request->Grants[PageIndex]); - } } else { // Direct ULONG Index; diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c index e8d94cb..3c429b2 100644 --- a/src/xenvbd/pdo.c +++ b/src/xenvbd/pdo.c @@ -567,20 +567,38 @@ PdoSectorSize( } //============================================================================= -static PVOID +static PXENVBD_INDIRECT PdoGetIndirect( IN PXENVBD_PDO Pdo ) { - PVOID Indirect; + PXENVBD_INDIRECT Indirect; + NTSTATUS status; + PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend); Indirect = __LookasideAlloc(&Pdo->IndirectList); if (Indirect == NULL) goto fail1; - RtlZeroMemory(Indirect, PAGE_SIZE); + RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT)); + + Indirect->Page = __AllocPages(PAGE_SIZE, &Indirect->Mdl); + if (Indirect->Page == NULL) + goto fail2; + + status = GranterGet(Granter, + MmGetMdlPfnArray(Indirect->Mdl)[0], + TRUE, + &Indirect->Grant); + if (!NT_SUCCESS(status)) + goto fail3; + return Indirect; +fail3: + __FreePages(Indirect->Page, Indirect->Mdl); +fail2: + __LookasideFree(&Pdo->IndirectList, Indirect); fail1: return NULL; } @@ -588,10 +606,17 @@ fail1: static VOID PdoPutIndirect( IN PXENVBD_PDO Pdo, - IN PVOID Indirect + IN PXENVBD_INDIRECT Indirect ) { - RtlZeroMemory(Indirect, PAGE_SIZE); + PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend); + + if (Indirect->Grant) + GranterPut(Granter, Indirect->Grant); + if (Indirect->Page) + __FreePages(Indirect->Page, Indirect->Mdl); + + RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT)); __LookasideFree(&Pdo->IndirectList, Indirect); } @@ -648,6 +673,7 @@ PdoGetRequest( RtlZeroMemory(Request, sizeof(XENVBD_REQUEST)); Request->Id = (ULONG)InterlockedIncrement((PLONG)&Pdo->NextTag); InitializeListHead(&Request->Segments); + InitializeListHead(&Request->Indirects); return Request; @@ -661,11 +687,9 @@ PdoPutRequest( IN PXENVBD_REQUEST Request ) { - ULONG Index; - PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend); + PLIST_ENTRY Entry; for (;;) { - PLIST_ENTRY Entry; PXENVBD_SEGMENT Segment; Entry = RemoveHeadList(&Request->Segments); @@ -675,11 +699,14 @@ PdoPutRequest( 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]); + for (;;) { + PXENVBD_INDIRECT Indirect; + + Entry = RemoveHeadList(&Request->Indirects); + if (Entry == &Request->Indirects) + break; + Indirect = CONTAINING_RECORD(Entry, XENVBD_INDIRECT, Entry); + PdoPutIndirect(Pdo, Indirect); } RtlZeroMemory(Request, sizeof(XENVBD_REQUEST)); @@ -1052,32 +1079,25 @@ PrepareBlkifIndirect( IN PXENVBD_REQUEST Request ) { - NTSTATUS status; ULONG Index; ULONG NrSegments = 0; - PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend); for (Index = 0; Index < BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST && NrSegments < Request->NrSegments; ++Index) { - Request->Pages[Index] = PdoGetIndirect(Pdo); - if (Request->Pages[Index] == NULL) - goto fail1; + PXENVBD_INDIRECT Indirect; - status = GranterGet(Granter, - __Virt2Pfn(Request->Pages[Index]), - TRUE, - &Request->Grants[Index]); - if (!NT_SUCCESS(status)) - goto fail2; + Indirect = PdoGetIndirect(Pdo); + if (Indirect == NULL) + goto fail1; + InsertTailList(&Request->Indirects, &Indirect->Entry); NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE; } return TRUE; -fail2: fail1: return FALSE; } @@ -2583,7 +2603,7 @@ PdoCreate( __LookasideInit(&Pdo->RequestList, sizeof(XENVBD_REQUEST), REQUEST_POOL_TAG); __LookasideInit(&Pdo->SegmentList, sizeof(XENVBD_SEGMENT), SEGMENT_POOL_TAG); - __LookasideInit(&Pdo->IndirectList, PAGE_SIZE, INDIRECT_POOL_TAG); + __LookasideInit(&Pdo->IndirectList, sizeof(XENVBD_INDIRECT), INDIRECT_POOL_TAG); Status = PdoD3ToD0(Pdo); if (!NT_SUCCESS(Status)) diff --git a/src/xenvbd/srbext.h b/src/xenvbd/srbext.h index 6550b72..6b41475 100644 --- a/src/xenvbd/srbext.h +++ b/src/xenvbd/srbext.h @@ -48,6 +48,14 @@ 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; + PBLKIF_SEGMENT Page; + PVOID Grant; + PMDL Mdl; +} XENVBD_INDIRECT, *PXENVBD_INDIRECT; + // Internal segment context typedef struct _XENVBD_SEGMENT { LIST_ENTRY Entry; @@ -74,10 +82,7 @@ typedef struct _XENVBD_REQUEST { ULONG64 FirstSector; ULONG64 NrSectors; // BLKIF_OP_DISCARD only - - // BLKIF_OP_{READ/WRITE} with NrSegments > 11 only - PVOID Pages[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; - PVOID Grants[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; + LIST_ENTRY Indirects; // BLKIF_OP_{READ/WRITE} with NrSegments > 11 only } XENVBD_REQUEST, *PXENVBD_REQUEST; // SRBExtension - context for SRBs -- 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |