[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 14/26] Use CACHE interface instead of lookaside lists
From: Owen Smith <owen.smith@xxxxxxxxxx> Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xenvbd/target.c | 326 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 269 insertions(+), 57 deletions(-) diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c index d242d96..cd3b736 100644 --- a/src/xenvbd/target.c +++ b/src/xenvbd/target.c @@ -78,6 +78,7 @@ struct _XENVBD_TARGET { XENVBD_STATE State; KSPIN_LOCK StateLock; KSPIN_LOCK QueueLock; + KSPIN_LOCK CacheLock; BOOLEAN Missing; PXENVBD_GRANTER Granter; PXENVBD_BLOCKRING BlockRing; @@ -106,6 +107,7 @@ struct _XENVBD_TARGET { XENBUS_DEBUG_INTERFACE DebugInterface; XENBUS_SUSPEND_INTERFACE SuspendInterface; XENBUS_STORE_INTERFACE StoreInterface; + XENBUS_CACHE_INTERFACE CacheInterface; PXENBUS_DEBUG_CALLBACK DebugCallback; PXENBUS_SUSPEND_CALLBACK SuspendCallback; @@ -117,9 +119,9 @@ struct _XENVBD_TARGET { LIST_ENTRY Submitted; LIST_ENTRY Shutdown; - NPAGED_LOOKASIDE_LIST RequestList; - NPAGED_LOOKASIDE_LIST SegmentList; - NPAGED_LOOKASIDE_LIST IndirectList; + PXENBUS_CACHE RequestCache; + PXENBUS_CACHE SegmentCache; + PXENBUS_CACHE IndirectCache; }; static FORCEINLINE PVOID @@ -235,6 +237,108 @@ TargetSetMissing( Target->Missing = TRUE; } +static VOID +TargetAcquireLock( + IN PVOID Argument + ) +{ + PXENVBD_TARGET Target = Argument; + + KeAcquireSpinLockAtDpcLevel(&Target->CacheLock); +} + +static VOID +TargetReleaseLock( + IN PVOID Argument + ) +{ + PXENVBD_TARGET Target = Argument; + +#pragma warning(suppress:26110) + KeReleaseSpinLockFromDpcLevel(&Target->CacheLock); +} + +static NTSTATUS +TargetRequestCtor( + IN PVOID Argument, + IN PVOID Object + ) +{ + UNREFERENCED_PARAMETER(Argument); + UNREFERENCED_PARAMETER(Object); + return STATUS_SUCCESS; +} + +static VOID +TargetRequestDtor( + IN PVOID Argument, + IN PVOID Object + ) +{ + UNREFERENCED_PARAMETER(Argument); + UNREFERENCED_PARAMETER(Object); +} + +static NTSTATUS +TargetSegmentCtor( + IN PVOID Argument, + IN PVOID Object + ) +{ + UNREFERENCED_PARAMETER(Argument); + UNREFERENCED_PARAMETER(Object); + return STATUS_SUCCESS; +} + +static VOID +TargetSegmentDtor( + IN PVOID Argument, + IN PVOID Object + ) +{ + UNREFERENCED_PARAMETER(Argument); + UNREFERENCED_PARAMETER(Object); +} + +static NTSTATUS +TargetIndirectCtor( + IN PVOID Argument, + IN PVOID Object + ) +{ + PXENVBD_INDIRECT Indirect = Object; + NTSTATUS status; + + UNREFERENCED_PARAMETER(Argument); + + status = STATUS_NO_MEMORY; + Indirect->Mdl = __AllocatePage(); + if (Indirect->Mdl == NULL) + goto fail1; + + Indirect->Page = MmGetSystemAddressForMdlSafe(Indirect->Mdl, + NormalPagePriority); + ASSERT(Indirect->Page != NULL); + + return STATUS_SUCCESS; + +fail1: + return status; +} + +static VOID +TargetIndirectDtor( + IN PVOID Argument, + IN PVOID Object + ) +{ + PXENVBD_INDIRECT Indirect = Object; + + UNREFERENCED_PARAMETER(Argument); + + __FreePage(Indirect->Mdl); +} + static PXENVBD_INDIRECT TargetGetIndirect( IN PXENVBD_TARGET Target @@ -243,35 +347,30 @@ TargetGetIndirect( PXENVBD_INDIRECT Indirect; NTSTATUS status; - Indirect = ExAllocateFromNPagedLookasideList(&Target->IndirectList); + Indirect = XENBUS_CACHE(Get, + &Target->CacheInterface, + Target->IndirectCache, + FALSE); if (Indirect == NULL) goto fail1; - RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT)); - InitializeListHead(&Indirect->ListEntry); - Indirect->Mdl = __AllocatePage(); - if (Indirect->Mdl == NULL) - goto fail2; - - Indirect->Page = MmGetSystemAddressForMdlSafe(Indirect->Mdl, - NormalPagePriority); - ASSERT(Indirect->Page != NULL); status = GranterGet(Target->Granter, MmGetMdlPfnArray(Indirect->Mdl)[0], TRUE, &Indirect->Grant); if (!NT_SUCCESS(status)) - goto fail3; + goto fail2; return Indirect; -fail3: - __FreePage(Indirect->Mdl); fail2: - RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT)); - ExFreeToNPagedLookasideList(&Target->IndirectList, Indirect); + XENBUS_CACHE(Put, + &Target->CacheInterface, + Target->IndirectCache, + Indirect, + FALSE); fail1: return NULL; } @@ -284,12 +383,13 @@ TargetPutIndirect( { if (Indirect->Grant) GranterPut(Target->Granter, Indirect->Grant); + Indirect->Grant = NULL; - if (Indirect->Page) - __FreePage(Indirect->Mdl); - - RtlZeroMemory(Indirect, sizeof(XENVBD_INDIRECT)); - ExFreeToNPagedLookasideList(&Target->IndirectList, Indirect); + XENBUS_CACHE(Put, + &Target->CacheInterface, + Target->IndirectCache, + Indirect, + FALSE); } static PXENVBD_SEGMENT @@ -299,12 +399,14 @@ TargetGetSegment( { PXENVBD_SEGMENT Segment; - Segment = ExAllocateFromNPagedLookasideList(&Target->SegmentList); + Segment = XENBUS_CACHE(Get, + &Target->CacheInterface, + Target->SegmentCache, + FALSE); if (Segment == NULL) goto fail1; RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT)); - InitializeListHead(&Segment->ListEntry); return Segment; @@ -329,7 +431,11 @@ TargetPutSegment( BufferPut(Segment->BufferId); RtlZeroMemory(Segment, sizeof(XENVBD_SEGMENT)); - ExFreeToNPagedLookasideList(&Target->SegmentList, Segment); + XENBUS_CACHE(Put, + &Target->CacheInterface, + Target->SegmentCache, + Segment, + FALSE); } static PXENVBD_REQUEST @@ -339,7 +445,10 @@ TargetGetRequest( { PXENVBD_REQUEST Request; - Request = ExAllocateFromNPagedLookasideList(&Target->RequestList); + Request = XENBUS_CACHE(Get, + &Target->CacheInterface, + Target->RequestCache, + FALSE); if (Request == NULL) goto fail1; @@ -386,7 +495,11 @@ TargetPutRequest( } RtlZeroMemory(Request, sizeof(XENVBD_REQUEST)); - ExFreeToNPagedLookasideList(&Target->RequestList, Request); + XENBUS_CACHE(Put, + &Target->CacheInterface, + Target->RequestCache, + Request, + FALSE); } static FORCEINLINE VOID @@ -2761,6 +2874,7 @@ TargetCreate( ULONG DeviceId; ULONG TargetId; ULONG Size; + CHAR Name[sizeof("vbd_XXXX_req")]; NTSTATUS status; DeviceId = strtoul(Device->Buffer, NULL, 10); @@ -2787,8 +2901,10 @@ TargetCreate( Target->BackendId = DOMID_INVALID; KeInitializeSpinLock(&Target->StateLock); KeInitializeSpinLock(&Target->QueueLock); + KeInitializeSpinLock(&Target->CacheLock); AdapterGetDebugInterface(Adapter, &Target->DebugInterface); + AdapterGetCacheInterface(Adapter, &Target->CacheInterface); AdapterGetStoreInterface(Adapter, &Target->StoreInterface); AdapterGetSuspendInterface(Adapter, &Target->SuspendInterface); @@ -2836,43 +2952,121 @@ TargetCreate( InitializeListHead(&Target->Submitted); InitializeListHead(&Target->Shutdown); - ExInitializeNPagedLookasideList(&Target->RequestList, - NULL, - NULL, - 0, - sizeof(XENVBD_REQUEST), - REQUEST_POOL_TAG, - 0); - ExInitializeNPagedLookasideList(&Target->SegmentList, - NULL, - NULL, - 0, - sizeof(XENVBD_SEGMENT), - SEGMENT_POOL_TAG, - 0); - ExInitializeNPagedLookasideList(&Target->IndirectList, - NULL, - NULL, - 0, - sizeof(XENVBD_INDIRECT), - INDIRECT_POOL_TAG, - 0); + status = XENBUS_CACHE(Acquire, + &Target->CacheInterface); + if (!NT_SUCCESS(status)) + goto fail9; + + status = RtlStringCbPrintfA(Name, + sizeof(Name), + "vbd_%u_req", + Target->TargetId); + if (!NT_SUCCESS(status)) + goto fail10; + + status = XENBUS_CACHE(Create, + &Target->CacheInterface, + Name, + sizeof(XENVBD_REQUEST), + 8, + TargetRequestCtor, + TargetRequestDtor, + TargetAcquireLock, + TargetReleaseLock, + Target, + &Target->RequestCache); + if (!NT_SUCCESS(status)) + goto fail11; + + status = RtlStringCbPrintfA(Name, + sizeof(Name), + "vbd_%u_seg", + Target->TargetId); + if (!NT_SUCCESS(status)) + goto fail12; + + status = XENBUS_CACHE(Create, + &Target->CacheInterface, + Name, + sizeof(XENVBD_SEGMENT), + 32, + TargetSegmentCtor, + TargetSegmentDtor, + TargetAcquireLock, + TargetReleaseLock, + Target, + &Target->SegmentCache); + if (!NT_SUCCESS(status)) + goto fail13; + + status = RtlStringCbPrintfA(Name, + sizeof(Name), + "vbd_%u_ind", + Target->TargetId); + if (!NT_SUCCESS(status)) + goto fail14; + + status = XENBUS_CACHE(Create, + &Target->CacheInterface, + Name, + sizeof(XENVBD_INDIRECT), + 0, + TargetIndirectCtor, + TargetIndirectDtor, + TargetAcquireLock, + TargetReleaseLock, + Target, + &Target->IndirectCache); + if (!NT_SUCCESS(status)) + goto fail15; status = TargetD3ToD0(Target); if (!NT_SUCCESS(status)) - goto fail9; + goto fail16; Verbose("[%u] <=====\n", TargetId); *_Target = Target; return STATUS_SUCCESS; +fail16: + Error("fail16\n"); + + XENBUS_CACHE(Destroy, + &Target->CacheInterface, + Target->IndirectCache); + Target->IndirectCache = NULL; + +fail15: + Error("fail15\n"); +fail14: + Error("fail14\n"); + + XENBUS_CACHE(Destroy, + &Target->CacheInterface, + Target->SegmentCache); + Target->SegmentCache = NULL; + +fail13: + Error("fail13\n"); +fail12: + Error("fail12\n"); + + XENBUS_CACHE(Destroy, + &Target->CacheInterface, + Target->RequestCache); + Target->RequestCache = NULL; + +fail11: + Error("fail11\n"); +fail10: + Error("fail10\n"); + + XENBUS_CACHE(Release, + &Target->CacheInterface); + fail9: Error("fail9\n"); - ExDeleteNPagedLookasideList(&Target->RequestList); - ExDeleteNPagedLookasideList(&Target->SegmentList); - ExDeleteNPagedLookasideList(&Target->IndirectList); - RtlZeroMemory(&Target->Prepared, sizeof(LIST_ENTRY)); RtlZeroMemory(&Target->Submitted, sizeof(LIST_ENTRY)); RtlZeroMemory(&Target->Shutdown, sizeof(LIST_ENTRY)); @@ -2903,6 +3097,7 @@ fail3: fail2: Error("fail2\n"); RtlZeroMemory(&Target->DebugInterface, sizeof(XENBUS_DEBUG_INTERFACE)); + RtlZeroMemory(&Target->CacheInterface, sizeof(XENBUS_CACHE_INTERFACE)); RtlZeroMemory(&Target->StoreInterface, sizeof(XENBUS_STORE_INTERFACE)); RtlZeroMemory(&Target->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE)); @@ -2914,6 +3109,7 @@ fail2: Target->TargetId = 0; Target->State = 0; Target->BackendId = 0; + RtlZeroMemory(&Target->CacheLock, sizeof(KSPIN_LOCK)); RtlZeroMemory(&Target->QueueLock, sizeof(KSPIN_LOCK)); RtlZeroMemory(&Target->StateLock, sizeof(KSPIN_LOCK)); @@ -2933,9 +3129,23 @@ TargetDestroy( ASSERT(IsListEmpty(&Target->Submitted)); ASSERT(IsListEmpty(&Target->Shutdown)); - ExDeleteNPagedLookasideList(&Target->RequestList); - ExDeleteNPagedLookasideList(&Target->SegmentList); - ExDeleteNPagedLookasideList(&Target->IndirectList); + XENBUS_CACHE(Destroy, + &Target->CacheInterface, + Target->IndirectCache); + Target->IndirectCache = NULL; + + XENBUS_CACHE(Destroy, + &Target->CacheInterface, + Target->SegmentCache); + Target->SegmentCache = NULL; + + XENBUS_CACHE(Destroy, + &Target->CacheInterface, + Target->RequestCache); + Target->RequestCache = NULL; + + XENBUS_CACHE(Release, + &Target->CacheInterface); RtlZeroMemory(&Target->Prepared, sizeof(LIST_ENTRY)); RtlZeroMemory(&Target->Submitted, sizeof(LIST_ENTRY)); @@ -2962,6 +3172,7 @@ TargetDestroy( RtlZeroMemory(&Target->DebugInterface, sizeof(XENBUS_DEBUG_INTERFACE)); RtlZeroMemory(&Target->StoreInterface, sizeof(XENBUS_STORE_INTERFACE)); + RtlZeroMemory(&Target->CacheInterface, sizeof(XENBUS_CACHE_INTERFACE)); RtlZeroMemory(&Target->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE)); Target->Adapter = NULL; @@ -2972,6 +3183,7 @@ TargetDestroy( Target->TargetId = 0; Target->State = 0; Target->BackendId = 0; + RtlZeroMemory(&Target->CacheLock, sizeof(KSPIN_LOCK)); RtlZeroMemory(&Target->QueueLock, sizeof(KSPIN_LOCK)); RtlZeroMemory(&Target->StateLock, sizeof(KSPIN_LOCK)); -- 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 |