From: VMware, Inc <> Date: Thu, 24 Feb 2011 21:47:15 +0000 (-0800) Subject: Wrap VMCI list operations X-Git-Tag: 2011.02.23-368700~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84efb1cb393b03030af7f0fd2a2f65b25e505e3c;p=thirdparty%2Fopen-vm-tools.git Wrap VMCI list operations Both the guest and the host VMCI drivers use list operations, that clash with other header files, e.g, circList.h. This change wraps all list operations in the common modules, such that we can decide on which list implementation to use on a per platform basis. Signed-off-by: Marcelo Vanzin --- diff --git a/open-vm-tools/modules/linux/shared/vmci_kernel_if.h b/open-vm-tools/modules/linux/shared/vmci_kernel_if.h index 57b663374..32541fd36 100644 --- a/open-vm-tools/modules/linux/shared/vmci_kernel_if.h +++ b/open-vm-tools/modules/linux/shared/vmci_kernel_if.h @@ -33,7 +33,7 @@ #endif #if defined(_WIN32) -#include +# include #endif #if defined(linux) && !defined(VMKERNEL) @@ -45,14 +45,14 @@ #ifdef __APPLE__ # include -#include -#include +# include +# include #endif #ifdef VMKERNEL -#include "splock.h" -#include "semaphore_ext.h" -#include "vmkapi.h" +# include "splock.h" +# include "semaphore_ext.h" +# include "vmkapi.h" #endif #ifdef SOLARIS @@ -65,7 +65,9 @@ #include "vm_basic_types.h" #include "vmci_defs.h" -#if defined(__APPLE__) +#if defined(VMKERNEL) +# include "list.h" +#else # include "dbllnklst.h" #endif @@ -369,5 +371,32 @@ Bool VMCI_DeviceShutdown(void); # define VMCI_DeviceShutdown() FALSE #endif // !_WIN32 +#if defined(VMKERNEL) + typedef List_Links VMCIListItem; + typedef List_Links VMCIList; + +# define VMCIList_Init(_l) List_Init(_l) +# define VMCIList_InitEntry(_e) List_InitElement(_e) +# define VMCIList_Empty(_l) List_IsEmpty(_l) +# define VMCIList_Insert(_e, _l) List_Insert(_e, LIST_ATREAR(_l)) +# define VMCIList_Remove(_e, _l) List_Remove(_e) +# define VMCIList_Scan(_cur, _l) LIST_FORALL(_l, _cur) +# define VMCIList_ScanSafe(_cur, _next, _l) LIST_FORALL_SAFE(_l, _cur, _next) +# define VMCIList_Entry(_elem, _type, _field) List_Entry(_elem, _type, _field) +# define VMCIList_First(_l) (VMCIList_Empty(_l)?NULL:List_First(_l)) +#else + typedef DblLnkLst_Links VMCIListItem; + typedef DblLnkLst_Links VMCIList; + +# define VMCIList_Init(_l) DblLnkLst_Init(_l) +# define VMCIList_InitEntry(_e) DblLnkLst_Init(_e) +# define VMCIList_Empty(_l) (!DblLnkLst_IsLinked(_l)) +# define VMCIList_Insert(_e, _l) DblLnkLst_LinkLast(_l, _e) +# define VMCIList_Remove(_e, _l) DblLnkLst_Unlink1(_e) +# define VMCIList_Scan(_cur, _l) DblLnkLst_ForEach(_cur, _l) +# define VMCIList_ScanSafe(_cur, _next, _l) DblLnkLst_ForEachSafe(_cur, _next, _l) +# define VMCIList_Entry(_elem, _type, _field) DblLnkLst_Container(_elem, _type, _field) +# define VMCIList_First(_l) (VMCIList_Empty(_l)?NULL:(_l)->next) +#endif #endif // _VMCI_KERNEL_IF_H_ diff --git a/open-vm-tools/modules/linux/vmci/vmciEvent.c b/open-vm-tools/modules/linux/vmci/vmciEvent.c index ff053a901..d741b13d6 100644 --- a/open-vm-tools/modules/linux/vmci/vmciEvent.c +++ b/open-vm-tools/modules/linux/vmci/vmciEvent.c @@ -43,7 +43,6 @@ #else # include "vmciDriver.h" #endif -#include "circList.h" /* Must come after vmciVmkInt.h. */ #define LGPFX "VMCIEvent: " @@ -57,14 +56,9 @@ typedef struct VMCISubscription { VMCI_Event event; VMCI_EventCB callback; void *callbackData; - ListItem subscriberListItem; + VMCIListItem subscriberListItem; } VMCISubscription; -typedef struct VMCISubscriptionItem { - ListItem listItem; - VMCISubscription sub; -} VMCISubscriptionItem; - static VMCISubscription *VMCIEventFind(VMCIId subID); static int VMCIEventDeliver(VMCIEventMsg *eventMsg); @@ -92,7 +86,7 @@ static VMCISubscription *VMCIEventUnregisterSubscription(VMCIId subID); #endif -static ListItem *subscriberArray[VMCI_EVENT_MAX] = {NULL}; +static VMCIList subscriberArray[VMCI_EVENT_MAX]; static VMCILock subscriberLock; typedef struct VMCIDelayedEventInfo { @@ -120,6 +114,11 @@ typedef struct VMCIDelayedEventInfo { void VMCIEvent_Init(void) { + int i; + + for (i = 0; i < VMCI_EVENT_MAX; i++) { + VMCIList_Init(&subscriberArray[i]); + } VMCIEventInitLock(&subscriberLock, "VMCIEventSubscriberLock"); } @@ -143,12 +142,12 @@ VMCIEvent_Init(void) void VMCIEvent_Exit(void) { - ListItem *iter, *iter2; + VMCIListItem *iter, *iter2; VMCI_Event e; /* We free all memory at exit. */ for (e = 0; e < VMCI_EVENT_MAX; e++) { - LIST_SCAN_SAFE(iter, iter2, subscriberArray[e]) { + VMCIList_ScanSafe(iter, iter2, &subscriberArray[e]) { VMCISubscription *cur; /* @@ -162,7 +161,7 @@ VMCIEvent_Exit(void) */ ASSERT(FALSE); - cur = LIST_CONTAINER(iter, VMCISubscription, subscriberListItem); + cur = VMCIList_Entry(iter, VMCISubscription, subscriberListItem); VMCI_FreeKernelMem(cur, sizeof *cur); } } @@ -330,13 +329,13 @@ EventReleaseCB(void *clientData) // IN static VMCISubscription * VMCIEventFind(VMCIId subID) // IN { - ListItem *iter; + VMCIListItem *iter; VMCI_Event e; for (e = 0; e < VMCI_EVENT_MAX; e++) { - LIST_SCAN(iter, subscriberArray[e]) { + VMCIList_Scan(iter, &subscriberArray[e]) { VMCISubscription *cur = - LIST_CONTAINER(iter, VMCISubscription, subscriberListItem); + VMCIList_Entry(iter, VMCISubscription, subscriberListItem); if (cur->id == subID) { VMCIEventGet(cur); return cur; @@ -409,15 +408,15 @@ static int VMCIEventDeliver(VMCIEventMsg *eventMsg) // IN { int err = VMCI_SUCCESS; - ListItem *iter; + VMCIListItem *iter; VMCILockFlags flags; ASSERT(eventMsg); VMCIEventGrabLock(&subscriberLock, &flags); - LIST_SCAN(iter, subscriberArray[eventMsg->eventData.event]) { + VMCIList_Scan(iter, &subscriberArray[eventMsg->eventData.event]) { VMCI_EventData *ed; - VMCISubscription *cur = LIST_CONTAINER(iter, VMCISubscription, + VMCISubscription *cur = VMCIList_Entry(iter, VMCISubscription, subscriberListItem); ASSERT(cur && cur->event == eventMsg->eventData.event); @@ -570,6 +569,7 @@ VMCIEventRegisterSubscription(VMCISubscription *sub, // IN sub->event = event; sub->callback = callback; sub->callbackData = callbackData; + VMCIList_InitEntry(&sub->subscriberListItem); VMCIEventGrabLock(&subscriberLock, &lockFlags); @@ -602,7 +602,7 @@ VMCIEventRegisterSubscription(VMCISubscription *sub, // IN if (success) { VMCI_CreateEvent(&sub->destroyEvent); - LIST_QUEUE(&sub->subscriberListItem, &subscriberArray[event]); + VMCIList_Insert(&sub->subscriberListItem, &subscriberArray[event]); result = VMCI_SUCCESS; } else { result = VMCI_ERROR_NO_RESOURCES; @@ -642,7 +642,7 @@ VMCIEventUnregisterSubscription(VMCIId subID) // IN s = VMCIEventFind(subID); if (s != NULL) { VMCIEventRelease(s); - LIST_DEL(&s->subscriberListItem, &subscriberArray[s->event]); + VMCIList_Remove(&s->subscriberListItem, &subscriberArray[s->event]); } VMCIEventReleaseLock(&subscriberLock, flags); diff --git a/open-vm-tools/modules/linux/vmci/vmciNotifications.c b/open-vm-tools/modules/linux/vmci/vmciNotifications.c index 3e61ce145..c827e81bb 100644 --- a/open-vm-tools/modules/linux/vmci/vmciNotifications.c +++ b/open-vm-tools/modules/linux/vmci/vmciNotifications.c @@ -37,7 +37,6 @@ #include "vmci_call_defs.h" #include "vmciInt.h" #include "vmciUtil.h" -#include "circList.h" #define LGPFX "VMCINotifications: " @@ -66,14 +65,14 @@ typedef struct VMCINotifyHashEntry { void *callbackData; VMCIEvent destroyEvent; int refCount; - ListItem handleListItem; - ListItem idxListItem; + VMCIListItem handleListItem; + VMCIListItem idxListItem; } VMCINotifyHashEntry; typedef struct VMCINotifyHashTable { VMCILock lock; - ListItem *entriesByIdx[HASH_TABLE_SIZE]; - ListItem *entriesByHandle[HASH_TABLE_SIZE]; + VMCIList entriesByIdx[HASH_TABLE_SIZE]; + VMCIList entriesByHandle[HASH_TABLE_SIZE]; } VMCINotifyHashTable; @@ -156,8 +155,15 @@ static uint32 lastNotifyIdxReleased = PAGE_SIZE; void VMCINotifications_Init(void) { - memset(vmciNotifyHT.entriesByIdx, 0, ARRAY_SIZE(vmciNotifyHT.entriesByIdx)); - memset(vmciNotifyHT.entriesByHandle, 0, ARRAY_SIZE(vmciNotifyHT.entriesByHandle)); + int i; + + for (i = 0; i < ARRAY_SIZE(vmciNotifyHT.entriesByIdx); i++) { + VMCIList_Init(&vmciNotifyHT.entriesByIdx[i]); + } + for (i = 0; i < ARRAY_SIZE(vmciNotifyHT.entriesByHandle); i++) { + VMCIList_Init(&vmciNotifyHT.entriesByHandle[i]); + } + VMCI_InitLock(&vmciNotifyHT.lock, "VMCINotifyHashLock", VMCI_LOCK_RANK_HIGHER_BH); return; @@ -184,10 +190,10 @@ void VMCINotifications_Exit(void) { uint32 bucket; - ListItem *iter, *iter2; + VMCIListItem *iter, *iter2; for (bucket = 0; bucket < HASH_TABLE_SIZE; bucket++) { - LIST_SCAN_SAFE(iter, iter2, vmciNotifyHT.entriesByIdx[bucket]) { + VMCIList_ScanSafe(iter, iter2, &vmciNotifyHT.entriesByIdx[bucket]) { VMCINotifyHashEntry *cur; /* @@ -201,7 +207,7 @@ VMCINotifications_Exit(void) */ ASSERT(FALSE); - cur = LIST_CONTAINER(iter, VMCINotifyHashEntry, idxListItem); + cur = VMCIList_Entry(iter, VMCINotifyHashEntry, idxListItem); VMCI_FreeKernelMem(cur, sizeof *cur); } } @@ -265,7 +271,7 @@ VMCINotifications_Hibernate(Bool enterHibernate) // IN { VMCILockFlags flags; uint32 bucket; - ListItem *iter; + VMCIListItem *iter; if (enterHibernate) { /* @@ -278,11 +284,11 @@ VMCINotifications_Hibernate(Bool enterHibernate) // IN VMCI_GrabLock_BH(&vmciNotifyHT.lock, &flags); for (bucket = 0; bucket < HASH_TABLE_SIZE; bucket++) { - LIST_SCAN(iter, vmciNotifyHT.entriesByIdx[bucket]) { + VMCIList_Scan(iter, &vmciNotifyHT.entriesByIdx[bucket]) { VMCINotifyHashEntry *cur; int result; - cur = LIST_CONTAINER(iter, VMCINotifyHashEntry, idxListItem); + cur = VMCIList_Entry(iter, VMCINotifyHashEntry, idxListItem); result = LinkNotificationHypercall(cur->handle, cur->doorbell, cur->idx); if (result != VMCI_SUCCESS && result != VMCI_ERROR_DUPLICATE_ENTRY) { VMCI_WARNING((LGPFX"Failed to reregister doorbell handle 0x%x:0x%x " @@ -366,7 +372,8 @@ VMCINotifyHashAddEntry(VMCINotifyHashEntry *entry) // IN result = VMCI_ERROR_ALREADY_EXISTS; goto out; } - LIST_QUEUE(&entry->handleListItem, &vmciNotifyHT.entriesByHandle[bucket]); + VMCIList_Insert(&entry->handleListItem, + &vmciNotifyHT.entriesByHandle[bucket]); /* * Below we try to allocate an index in the notification bitmap @@ -408,7 +415,7 @@ VMCINotifyHashAddEntry(VMCINotifyHashEntry *entry) // IN bucket = VMCI_NOTIF_HASH(newNotifyIdx); entry->refCount++; entry->idx = newNotifyIdx; - LIST_QUEUE(&entry->idxListItem, &vmciNotifyHT.entriesByIdx[bucket]); + VMCIList_Insert(&entry->idxListItem, &vmciNotifyHT.entriesByIdx[bucket]); result = VMCI_SUCCESS; out: VMCI_ReleaseLock_BH(&vmciNotifyHT.lock, flags); @@ -476,9 +483,10 @@ VMCINotifyHashRemoveEntry(VMCIHandle handle, // IN entry = VMCINotifyHashFindByHandle(handle, doorbell, &bucket); if (entry) { ASSERT(entry->refCount > 0); - LIST_DEL(&entry->handleListItem, &vmciNotifyHT.entriesByHandle[bucket]); + VMCIList_Remove(&entry->handleListItem, + &vmciNotifyHT.entriesByHandle[bucket]); bucket = VMCI_NOTIF_HASH(entry->idx); - LIST_DEL(&entry->idxListItem, &vmciNotifyHT.entriesByIdx[bucket]); + VMCIList_Remove(&entry->idxListItem, &vmciNotifyHT.entriesByIdx[bucket]); notifyIdxCount--; if (entry->idx == maxNotifyIdx - 1) { /* @@ -589,16 +597,16 @@ static VMCINotifyHashEntry * VMCINotifyHashFindByIdx(uint32 idx, // IN uint32 *hashBucket) // IN/OUT: hash value for idx { - ListItem *iter; + VMCIListItem *iter; uint32 bucket = VMCI_NOTIF_HASH(idx); if (hashBucket) { *hashBucket = bucket; } - LIST_SCAN(iter, vmciNotifyHT.entriesByIdx[bucket]) { + VMCIList_Scan(iter, &vmciNotifyHT.entriesByIdx[bucket]) { VMCINotifyHashEntry *cur = - LIST_CONTAINER(iter, VMCINotifyHashEntry, idxListItem); + VMCIList_Entry(iter, VMCINotifyHashEntry, idxListItem); if (cur->idx == idx) { return cur; } @@ -631,16 +639,16 @@ VMCINotifyHashFindByHandle(VMCIHandle handle, // IN Bool doorbell, // IN uint32 *hashBucket) // IN/OUT: hash value for handle { - ListItem *iter; + VMCIListItem *iter; uint32 bucket = VMCI_NOTIF_HASH(handle.resource); if (hashBucket) { *hashBucket = bucket; } - LIST_SCAN(iter, vmciNotifyHT.entriesByHandle[bucket]) { + VMCIList_Scan(iter, &vmciNotifyHT.entriesByHandle[bucket]) { VMCINotifyHashEntry *cur = - LIST_CONTAINER(iter, VMCINotifyHashEntry, handleListItem); + VMCIList_Entry(iter, VMCINotifyHashEntry, handleListItem); if (VMCI_HANDLE_EQUAL(cur->handle, handle) && cur->doorbell == doorbell) { return cur; } @@ -698,13 +706,13 @@ static void VMCINotifyHashFireEntries(uint32 notifyIdx) // IN { VMCILockFlags flags; - ListItem *iter; + VMCIListItem *iter; int bucket = VMCI_NOTIF_HASH(notifyIdx); VMCI_GrabLock_BH(&vmciNotifyHT.lock, &flags); - LIST_SCAN(iter, vmciNotifyHT.entriesByIdx[bucket]) { - VMCINotifyHashEntry *cur = LIST_CONTAINER(iter, VMCINotifyHashEntry, + VMCIList_Scan(iter, &vmciNotifyHT.entriesByIdx[bucket]) { + VMCINotifyHashEntry *cur = VMCIList_Entry(iter, VMCINotifyHashEntry, idxListItem); if (cur->idx == notifyIdx && cur->notifyCB) { if (cur->runDelayed) { @@ -868,6 +876,8 @@ VMCINotificationRegister(VMCIHandle *handle, // IN entry->notifyCB = NULL; // Wait with this until link is established in hypervisor entry->callbackData = callbackData; entry->refCount = 0; + VMCIList_InitEntry(&entry->handleListItem); + VMCIList_InitEntry(&entry->idxListItem); result = VMCINotifyHashAddEntry(entry); if (result != VMCI_SUCCESS) { VMCI_FreeKernelMem(entry, sizeof *entry); diff --git a/open-vm-tools/modules/linux/vmci/vmciQPair.c b/open-vm-tools/modules/linux/vmci/vmciQPair.c index bfa0fcd52..c29289a12 100644 --- a/open-vm-tools/modules/linux/vmci/vmciQPair.c +++ b/open-vm-tools/modules/linux/vmci/vmciQPair.c @@ -71,9 +71,6 @@ #include "vm_assert.h" #include "vmci_handle_array.h" #include "vmci_defs.h" -#ifndef VMKERNEL -# include "circList.h" -#endif #if defined VMKERNEL || !defined VMX86_TOOLS # include "vmciQueuePair.h" #else diff --git a/open-vm-tools/modules/linux/vmci/vmciQueuePair.c b/open-vm-tools/modules/linux/vmci/vmciQueuePair.c index f138d869e..1a15b5a60 100644 --- a/open-vm-tools/modules/linux/vmci/vmciQueuePair.c +++ b/open-vm-tools/modules/linux/vmci/vmciQueuePair.c @@ -41,27 +41,26 @@ #include "vmciKernelAPI.h" #include "vmciQueuePairInt.h" #include "vmciUtil.h" -#include "circList.h" #define LGPFX "VMCIQueuePair: " typedef struct QueuePairEntry { - VMCIHandle handle; - VMCIId peer; - uint32 flags; - uint64 produceSize; - uint64 consumeSize; - uint64 numPPNs; - PPNSet ppnSet; - void *produceQ; - void *consumeQ; - uint32 refCount; - Bool hibernateFailure; - ListItem listItem; + VMCIHandle handle; + VMCIId peer; + uint32 flags; + uint64 produceSize; + uint64 consumeSize; + uint64 numPPNs; + PPNSet ppnSet; + void *produceQ; + void *consumeQ; + uint32 refCount; + Bool hibernateFailure; + VMCIListItem listItem; } QueuePairEntry; typedef struct QueuePairList { - ListItem *head; + VMCIList head; Atomic_uint32 hibernate; VMCIMutex mutex; } QueuePairList; @@ -203,7 +202,7 @@ QueuePairList_Unlock(void) void VMCIQueuePair_Init(void) { - queuePairList.head = NULL; + VMCIList_Init(&queuePairList.head); Atomic_Write(&queuePairList.hibernate, 0); QueuePairLock_Init(); hibernateFailedList = VMCIHandleArray_Create(0); @@ -319,14 +318,14 @@ VMCIQueuePair_Sync(void) static QueuePairEntry * QueuePairList_FindEntry(VMCIHandle handle) // IN: { - ListItem *next; + VMCIListItem *next; if (VMCI_HANDLE_INVALID(handle)) { return NULL; } - LIST_SCAN(next, queuePairList.head) { - QueuePairEntry *entry = LIST_CONTAINER(next, QueuePairEntry, listItem); + VMCIList_Scan(next, &queuePairList.head) { + QueuePairEntry *entry = VMCIList_Entry(next, QueuePairEntry, listItem); if (VMCI_HANDLE_EQUAL(entry->handle, handle)) { return entry; @@ -358,7 +357,7 @@ static void QueuePairList_AddEntry(QueuePairEntry *entry) // IN: { if (entry) { - LIST_QUEUE(&entry->listItem, &queuePairList.head); + VMCIList_Insert(&entry->listItem, &queuePairList.head); } } @@ -384,7 +383,7 @@ static void QueuePairList_RemoveEntry(QueuePairEntry *entry) // IN: { if (entry) { - LIST_DEL(&entry->listItem, &queuePairList.head); + VMCIList_Remove(&entry->listItem, &queuePairList.head); } } @@ -409,10 +408,10 @@ QueuePairList_RemoveEntry(QueuePairEntry *entry) // IN: static QueuePairEntry * QueuePairList_GetHead(void) { - ListItem *first = LIST_FIRST(queuePairList.head); + VMCIListItem *first = VMCIList_First(&queuePairList.head); if (first) { - QueuePairEntry *entry = LIST_CONTAINER(first, QueuePairEntry, listItem); + QueuePairEntry *entry = VMCIList_Entry(first, QueuePairEntry, listItem); return entry; } @@ -601,7 +600,7 @@ QueuePairEntryCreate(VMCIHandle handle, // IN: entry->produceQ = produceQ; entry->consumeQ = consumeQ; entry->refCount = 0; - INIT_LIST_ITEM(&entry->listItem); + VMCIList_InitEntry(&entry->listItem); } return entry; } @@ -1206,12 +1205,12 @@ VMCIQueuePair_Convert(Bool toLocal, // IN Bool deviceReset) // IN { if (toLocal) { - ListItem *next; + VMCIListItem *next; QueuePairList_Lock(); - LIST_SCAN(next, queuePairList.head) { - QueuePairEntry *entry = LIST_CONTAINER(next, QueuePairEntry, listItem); + VMCIList_Scan(next, &queuePairList.head) { + QueuePairEntry *entry = VMCIList_Entry(next, QueuePairEntry, listItem); if (!(entry->flags & VMCI_QPFLAG_LOCAL)) { VMCIQueue *prodQ; diff --git a/open-vm-tools/modules/linux/vmci/vmci_version.h b/open-vm-tools/modules/linux/vmci/vmci_version.h index bc50a6b76..948a657b7 100644 --- a/open-vm-tools/modules/linux/vmci/vmci_version.h +++ b/open-vm-tools/modules/linux/vmci/vmci_version.h @@ -25,8 +25,8 @@ #ifndef _VMCI_VERSION_H_ #define _VMCI_VERSION_H_ -#define VMCI_DRIVER_VERSION 9.1.4.0 -#define VMCI_DRIVER_VERSION_COMMAS 9,1,4,0 -#define VMCI_DRIVER_VERSION_STRING "9.1.4.0" +#define VMCI_DRIVER_VERSION 9.1.5.0 +#define VMCI_DRIVER_VERSION_COMMAS 9,1,5,0 +#define VMCI_DRIVER_VERSION_STRING "9.1.5.0" #endif /* _VMCI_VERSION_H_ */