VOID (*ReleaseLock)(PVOID);
PVOID Argument;
LIST_ENTRY GetList;
+ LONG GetCount;
PLIST_ENTRY PutList;
- LONG ObjectCount;
+ LONG PutCount;
+ LONG ListCount;
PXENBUS_CACHE_MAGAZINE Magazine;
ULONG MagazineCount;
XENBUS_CACHE_FIST FIST;
KIRQL Irql = PASSIVE_LEVEL;
NTSTATUS status;
- Count = InterlockedDecrement(&Cache->ObjectCount);
+ Count = InterlockedDecrement(&Cache->ListCount);
status = STATUS_NO_MEMORY;
if (Count < 0)
return Object;
fail1:
- (VOID) InterlockedIncrement(&Cache->ObjectCount);
+ (VOID) InterlockedIncrement(&Cache->ListCount);
return NULL;
}
KeMemoryBarrier();
- (VOID) InterlockedIncrement(&Cache->ObjectCount);
+ (VOID) InterlockedIncrement(&Cache->ListCount);
}
static PVOID
{
PXENBUS_CACHE_MAGAZINE Magazine;
+ ASSERT3U(Index, <, Cache->MagazineCount);
Magazine = &Cache->Magazine[Index];
for (Index = 0; Index < XENBUS_CACHE_MAGAZINE_SLOTS; Index++) {
{
PXENBUS_CACHE_MAGAZINE Magazine;
+ ASSERT3U(Index, <, Cache->MagazineCount);
Magazine = &Cache->Magazine[Index];
for (Index = 0; Index < XENBUS_CACHE_MAGAZINE_SLOTS; Index++) {
done:
KeLowerIrql(Irql);
+ (VOID) InterlockedIncrement(&Cache->GetCount);
+
return Object;
}
UNREFERENCED_PARAMETER(Interface);
+ (VOID) InterlockedIncrement(&Cache->PutCount);
+
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
Index = KeGetCurrentProcessorNumberEx(NULL);
RtlZeroMemory(&Cache->ListEntry, sizeof (LIST_ENTRY));
+ ASSERT3U(Cache->PutCount, ==, Cache->GetCount);
+ Cache->PutCount = 0;
+ Cache->GetCount = 0;
+
Cache->Reservation = 0;
CacheFlushMagazines(Cache);
- CacheSpill(Cache, Cache->ObjectCount);
-
- ASSERT3U(Cache->ObjectCount, ==, 0);
ASSERT(IsZeroMemory(Cache->Magazine, sizeof (XENBUS_CACHE_MAGAZINE) * Cache->MagazineCount));
__CacheFree(Cache->Magazine);
Cache->Magazine = NULL;
Cache->MagazineCount = 0;
+ CacheSpill(Cache, Cache->ListCount);
+ ASSERT3U(Cache->ListCount, ==, 0);
+
+ ASSERT(IsListEmpty(&Cache->GetList));
RtlZeroMemory(&Cache->GetList, sizeof (LIST_ENTRY));
RtlZeroMemory(&Cache->FIST, sizeof (XENBUS_CACHE_FIST));
&Context->DebugInterface,
"- %s: Count = %d (Reservation = %d)\n",
Cache->Name,
- Cache->ObjectCount,
+ Cache->ListCount,
Cache->Reservation);
}
}
Cache = CONTAINING_RECORD(ListEntry, XENBUS_CACHE, ListEntry);
- Count = Cache->ObjectCount;
+ Count = Cache->ListCount;
if (Count < Cache->Reservation)
CacheFill(Cache, Cache->Reservation - Count);
#define MAXNAMELEN 128
struct _XENBUS_GNTTAB_CACHE {
- PXENBUS_GNTTAB_CONTEXT Context;
+ LIST_ENTRY ListEntry;
CHAR Name[MAXNAMELEN];
+ PXENBUS_GNTTAB_CONTEXT Context;
VOID (*AcquireLock)(PVOID);
VOID (*ReleaseLock)(PVOID);
PVOID Argument;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackEarly;
XENBUS_DEBUG_INTERFACE DebugInterface;
PXENBUS_DEBUG_CALLBACK DebugCallback;
+ LIST_ENTRY List;
};
#define XENBUS_GNTTAB_TAG 'TTNG'
)
{
PXENBUS_GNTTAB_CONTEXT Context = Interface->Context;
+ KIRQL Irql;
NTSTATUS status;
*Cache = __GnttabAllocate(sizeof (XENBUS_GNTTAB_CACHE));
if (!NT_SUCCESS(status))
goto fail3;
+ KeAcquireSpinLock(&Context->Lock, &Irql);
+ InsertTailList(&Context->List, &(*Cache)->ListEntry);
+ KeReleaseSpinLock(&Context->Lock, Irql);
+
return STATUS_SUCCESS;
fail3:
)
{
PXENBUS_GNTTAB_CONTEXT Context = Interface->Context;
+ KIRQL Irql;
+
+ KeAcquireSpinLock(&Context->Lock, &Irql);
+ RemoveEntryList(&Cache->ListEntry);
+ KeReleaseSpinLock(&Context->Lock, Irql);
+
+ RtlZeroMemory(&Cache->ListEntry, sizeof (LIST_ENTRY));
XENBUS_CACHE(Destroy,
&Context->CacheInterface,
Trace("====>\n");
+ if (!IsListEmpty(&Context->List))
+ BUG("OUTSTANDING CACHES");
+
XENBUS_DEBUG(Deregister,
&Context->DebugInterface,
Context->DebugCallback);
ASSERT(NT_SUCCESS(status));
ASSERT((*Context)->DebugInterface.Interface.Context != NULL);
+ InitializeListHead(&(*Context)->List);
KeInitializeSpinLock(&(*Context)->Lock);
(*Context)->Fdo = Fdo;
Context->Fdo = NULL;
RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
+ RtlZeroMemory(&Context->List, sizeof (LIST_ENTRY));
RtlZeroMemory(&Context->DebugInterface,
sizeof (XENBUS_DEBUG_INTERFACE));