[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/5] Track slab occupancy using the mask



From: Paul Durrant <pdurrant@xxxxxxxxxx>

This further shortens the slab pre-amble and allows the occupancy to be
amended directly in __CacheMaskSet/Clear().

Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx>
---
 src/xenbus/cache.c | 76 +++++++++++++++++++++++++++-------------------
 1 file changed, 45 insertions(+), 31 deletions(-)

diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c
index 591a6fca550d..ec56cc092f52 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -56,6 +56,7 @@ typedef struct _XENBUS_CACHE_MAGAZINE {
 
 typedef struct _XENBUS_CACHE_MASK {
     ULONG   Size;
+    ULONG   Count;
     ULONG   Mask[1];
 } XENBUS_CACHE_MASK, *PXENBUS_CACHE_MASK;
 
@@ -65,8 +66,6 @@ typedef struct _XENBUS_CACHE_SLAB {
     ULONG               Magic;
     PXENBUS_CACHE       Cache;
     LIST_ENTRY          ListEntry;
-    USHORT              MaximumOccupancy;
-    USHORT              CurrentOccupancy;
     PXENBUS_CACHE_MASK  Mask;
     UCHAR               Buffer[1];
 } XENBUS_CACHE_SLAB, *PXENBUS_CACHE_SLAB;
@@ -228,6 +227,7 @@ CacheMaskDestroy(
     IN  PXENBUS_CACHE_MASK  Mask
     )
 {
+    ASSERT(Mask->Count == 0);
     __CacheFree(Mask);
 }
 
@@ -242,7 +242,10 @@ __CacheMaskSet(
 
     ASSERT3U(Bit, <, Mask->Size);
 
+    ASSERT(!(Mask->Mask[Index] & Value));
     Mask->Mask[Index] |= Value;
+    ASSERT(Mask->Count < Mask->Size);
+    Mask->Count++;
 }
 
 static FORCEINLINE BOOLEAN
@@ -270,9 +273,28 @@ __CacheMaskClear(
 
     ASSERT3U(Bit, <, Mask->Size);
 
+    ASSERT(Mask->Count != 0);
+    --Mask->Count;
+    ASSERT(Mask->Mask[Index] & Value);
     Mask->Mask[Index] &= ~Value;
 }
 
+static ULONG
+CacheMaskSize(
+    IN  PXENBUS_CACHE_MASK  Mask
+    )
+{
+    return Mask->Size;
+}
+
+static ULONG
+CacheMaskCount(
+    IN  PXENBUS_CACHE_MASK  Mask
+    )
+{
+    return Mask->Count;
+}
+
 static VOID
 CacheInsertSlab(
     IN  PXENBUS_CACHE       Cache,
@@ -290,7 +312,7 @@ CacheInsertSlab(
 
     PLIST_ENTRY             ListEntry;
 
-    ASSERT(New->CurrentOccupancy < New->MaximumOccupancy);
+    ASSERT(CacheMaskCount(New->Mask) < CacheMaskSize(New->Mask));
 
     Cache->Cursor = NULL;
 
@@ -301,12 +323,12 @@ CacheInsertSlab(
 
         Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
 
-        if (Slab->CurrentOccupancy < New->CurrentOccupancy) {
+        if (CacheMaskCount(Slab->Mask) < CacheMaskCount(New->Mask)) {
             INSERT_BEFORE(ListEntry, &New->ListEntry);
             goto done;
         }
 
-        if (Slab->CurrentOccupancy < Slab->MaximumOccupancy &&
+        if (CacheMaskCount(Slab->Mask) < CacheMaskSize(Slab->Mask) &&
             Cache->Cursor == NULL)
             Cache->Cursor = ListEntry;
     }
@@ -326,7 +348,7 @@ CacheAudit(
     IN  PXENBUS_CACHE   Cache
     )
 {
-    ULONG               CurrentOccupancy = ULONG_MAX;
+    ULONG               Count = ULONG_MAX;
     PLIST_ENTRY         ListEntry;
 
     //
@@ -340,7 +362,7 @@ CacheAudit(
 
         Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
 
-        if (Slab->CurrentOccupancy < Slab->MaximumOccupancy) {
+        if (CacheMaskCount(Slab->Mask) < CacheMaskSize(Slab->Mask)) {
             ASSERT3P(Cache->Cursor, ==, ListEntry);
             break;
         }
@@ -354,9 +376,9 @@ CacheAudit(
 
         Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
 
-        ASSERT3U(Slab->CurrentOccupancy, <=, CurrentOccupancy);
+        ASSERT3U(CacheMaskCount(Slab->Mask), <=, Count);
 
-        CurrentOccupancy = Slab->CurrentOccupancy;
+        Count = CacheMaskCount(Slab->Mask);
     }
 }
 #else
@@ -399,13 +421,12 @@ CacheCreateSlab(
 
     Slab->Magic = XENBUS_CACHE_SLAB_MAGIC;
     Slab->Cache = Cache;
-    Slab->MaximumOccupancy = (USHORT)Count;
 
     Slab->Mask = CacheMaskCreate(Count);
     if (Slab->Mask == NULL)
         goto fail3;
 
-    for (Index = 0; Index < (LONG)Slab->MaximumOccupancy; Index++) {
+    for (Index = 0; Index < (LONG)CacheMaskSize(Slab->Mask); Index++) {
         PVOID Object = (PVOID)&Slab->Buffer[Index * Cache->Size];
 
         status = __CacheCtor(Cache, Object);
@@ -456,10 +477,8 @@ CacheDestroySlab(
 {
     LONG                    Index;
 
-    ASSERT3U(Slab->CurrentOccupancy, ==, 0);
-
-    ASSERT3U(Cache->Count, >=, Slab->MaximumOccupancy);
-    Cache->Count -= Slab->MaximumOccupancy;
+    ASSERT3U(Cache->Count, >=, CacheMaskSize(Slab->Mask));
+    Cache->Count -= CacheMaskSize(Slab->Mask);
 
     //
     // The only reason the cursor should be pointing at this slab is
@@ -473,7 +492,7 @@ CacheDestroySlab(
     ASSERT(Cache->Cursor != &Cache->SlabList ||
            IsListEmpty(&Cache->SlabList));
 
-    Index = Slab->MaximumOccupancy;
+    Index = CacheMaskSize(Slab->Mask);
     while (--Index >= 0) {
         PVOID Object = (PVOID)&Slab->Buffer[Index * Cache->Size];
 
@@ -499,21 +518,20 @@ CacheGetObjectFromSlab(
 
     Cache = Slab->Cache;
 
-    ASSERT3U(Slab->CurrentOccupancy, <=, Slab->MaximumOccupancy);
-    if (Slab->CurrentOccupancy == Slab->MaximumOccupancy)
-        return NULL;
+    ASSERT(CacheMaskCount(Slab->Mask) <= CacheMaskSize(Slab->Mask));
+    if (CacheMaskCount(Slab->Mask) == CacheMaskSize(Slab->Mask))
+           return NULL;
 
     Index = 0;
-    while (Index < Slab->MaximumOccupancy) {
+    while (Index < CacheMaskSize(Slab->Mask)) {
         if (!__CacheMaskTest(Slab->Mask, Index))
             break;
 
         Index++;
     }
-    BUG_ON(Index >= Slab->MaximumOccupancy);
+    BUG_ON(Index >= CacheMaskSize(Slab->Mask));
 
     __CacheMaskSet(Slab->Mask, Index);
-    Slab->CurrentOccupancy++;
 
     Object = (PVOID)&Slab->Buffer[Index * Cache->Size];
     ASSERT3U(Index, ==, (ULONG)((PUCHAR)Object - &Slab->Buffer[0]) /
@@ -535,12 +553,8 @@ CachePutObjectToSlab(
     Cache = Slab->Cache;
 
     Index = (ULONG)((PUCHAR)Object - &Slab->Buffer[0]) / Cache->Size;
-    BUG_ON(Index >= Slab->MaximumOccupancy);
-
-    ASSERT(Slab->CurrentOccupancy != 0);
-    --Slab->CurrentOccupancy;
+    BUG_ON(Index >= CacheMaskSize(Slab->Mask));
 
-    ASSERT(__CacheMaskTest(Slab->Mask, Index));
     __CacheMaskClear(Slab->Mask, Index);
 }
 
@@ -582,7 +596,7 @@ again:
         Object = CacheGetObjectFromSlab(Slab);
         ASSERT(Object != NULL);
 
-        if (Slab->CurrentOccupancy == Slab->MaximumOccupancy)
+        if (CacheMaskCount(Slab->Mask) == CacheMaskSize(Slab->Mask))
             Cache->Cursor = Slab->ListEntry.Flink;
     }
 
@@ -717,11 +731,11 @@ CacheSpill(
 
         Slab = CONTAINING_RECORD(ListEntry, XENBUS_CACHE_SLAB, ListEntry);
 
-        if (Slab->CurrentOccupancy != 0)
+        if (CacheMaskCount(Slab->Mask) != 0)
             break;
 
-        ASSERT(Cache->Count >= Slab->MaximumOccupancy);
-        if (Cache->Count - Slab->MaximumOccupancy < Count)
+        ASSERT(Cache->Count >= CacheMaskSize(Slab->Mask));
+        if (Cache->Count - CacheMaskSize(Slab->Mask) < Count)
             break;
 
         CacheDestroySlab(Cache, Slab);
-- 
2.25.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.