[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 1/2] Pre-calculate slab object size
There is no need to re-calculate the slab object size for each new slab. It can be calculated once, when the cache is created. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenbus/cache.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c index da1597a..d9aab76 100644 --- a/src/xenbus/cache.c +++ b/src/xenbus/cache.c @@ -57,8 +57,8 @@ typedef struct _XENBUS_CACHE_MAGAZINE { typedef struct _XENBUS_CACHE_SLAB { ULONG Magic; + PXENBUS_CACHE Cache; LIST_ENTRY ListEntry; - ULONG Size; ULONG Count; ULONG Allocated; UCHAR Buffer[1]; @@ -197,7 +197,6 @@ CacheCreateSlab( IN PXENBUS_CACHE Cache ) { - ULONG Size; PXENBUS_CACHE_SLAB Slab; ULONG NumberOfBytes; LARGE_INTEGER LowAddress; @@ -206,11 +205,8 @@ CacheCreateSlab( LONG Index; NTSTATUS status; - Size = __max(Cache->Size, MINIMUM_OBJECT_SIZE); - Size = P2ROUNDUP(Size, sizeof (ULONG_PTR)); - NumberOfBytes = P2ROUNDUP(FIELD_OFFSET(XENBUS_CACHE_SLAB, Buffer) + - Size, + Cache->Size, PAGE_SIZE); LowAddress.QuadPart = 0ull; @@ -231,14 +227,14 @@ CacheCreateSlab( RtlZeroMemory(Slab, NumberOfBytes); Slab->Magic = XENBUS_CACHE_SLAB_MAGIC; - Slab->Size = Size; + Slab->Cache = Cache; Slab->Count = (NumberOfBytes - FIELD_OFFSET(XENBUS_CACHE_SLAB, Buffer)) / - Size; + Cache->Size; ASSERT(Slab->Count != 0); for (Index = 0; Index < (LONG)Slab->Count; Index++) { - PVOID Object = (PVOID)&Slab->Buffer[Index * Size]; + PVOID Object = (PVOID)&Slab->Buffer[Index * Cache->Size]; status = __CacheCtor(Cache, Object); if (!NT_SUCCESS(status)) @@ -252,7 +248,7 @@ CacheCreateSlab( fail2: while (--Index >= 0) { - PVOID Object = (PVOID)&Slab->Buffer[Index * Size]; + PVOID Object = (PVOID)&Slab->Buffer[Index * Cache->Size]; __CacheDtor(Cache, Object); } @@ -284,7 +280,7 @@ CacheDestroySlab( Index = Slab->Count; while (--Index >= 0) { - PVOID Object = (PVOID)&Slab->Buffer[Index * Slab->Size]; + PVOID Object = (PVOID)&Slab->Buffer[Index * Cache->Size]; __CacheDtor(Cache, Object); } @@ -300,10 +296,13 @@ CacheGetObjectFromSlab( IN PXENBUS_CACHE_SLAB Slab ) { + PXENBUS_CACHE Cache; ULONG Free; ULONG Index; ULONG Set; + Cache = Slab->Cache; + Free = ~Slab->Allocated; if (!_BitScanForward(&Index, Free) || Index >= Slab->Count) return NULL; @@ -311,7 +310,7 @@ CacheGetObjectFromSlab( Set = InterlockedBitTestAndSet((LONG *)&Slab->Allocated, Index); ASSERT(!Set); - return (PVOID)&Slab->Buffer[Index * Slab->Size]; + return (PVOID)&Slab->Buffer[Index * Cache->Size]; } // May be called with or without lock held @@ -321,9 +320,12 @@ CachePutObjectToSlab( IN PVOID Object ) { + PXENBUS_CACHE Cache; ULONG Index; - Index = (ULONG)((PUCHAR)Object - &Slab->Buffer[0]) / Slab->Size; + Cache = Slab->Cache; + + Index = (ULONG)((PUCHAR)Object - &Slab->Buffer[0]) / Cache->Size; BUG_ON(Index >= Slab->Count); (VOID) InterlockedBitTestAndReset((LONG *)&Slab->Allocated, Index); @@ -559,6 +561,9 @@ CacheCreate( if (!NT_SUCCESS(status)) goto fail2; + Size = __max(Size, MINIMUM_OBJECT_SIZE); + Size = P2ROUNDUP(Size, sizeof (ULONG_PTR)); + (*Cache)->Size = Size; (*Cache)->Reservation = Reservation; (*Cache)->Ctor = Ctor; -- 2.5.3 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |