#endif
#if defined(_WIN32)
-#include <ntddk.h>
+# include <ntddk.h>
#endif
#if defined(linux) && !defined(VMKERNEL)
#ifdef __APPLE__
# include <IOKit/IOLib.h>
-#include <mach/task.h>
-#include <mach/semaphore.h>
+# include <mach/task.h>
+# include <mach/semaphore.h>
#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
#include "vm_basic_types.h"
#include "vmci_defs.h"
-#if defined(__APPLE__)
+#if defined(VMKERNEL)
+# include "list.h"
+#else
# include "dbllnklst.h"
#endif
# 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_
#else
# include "vmciDriver.h"
#endif
-#include "circList.h" /* Must come after vmciVmkInt.h. */
#define LGPFX "VMCIEvent: "
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);
#endif
-static ListItem *subscriberArray[VMCI_EVENT_MAX] = {NULL};
+static VMCIList subscriberArray[VMCI_EVENT_MAX];
static VMCILock subscriberLock;
typedef struct VMCIDelayedEventInfo {
void
VMCIEvent_Init(void)
{
+ int i;
+
+ for (i = 0; i < VMCI_EVENT_MAX; i++) {
+ VMCIList_Init(&subscriberArray[i]);
+ }
VMCIEventInitLock(&subscriberLock, "VMCIEventSubscriberLock");
}
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;
/*
*/
ASSERT(FALSE);
- cur = LIST_CONTAINER(iter, VMCISubscription, subscriberListItem);
+ cur = VMCIList_Entry(iter, VMCISubscription, subscriberListItem);
VMCI_FreeKernelMem(cur, sizeof *cur);
}
}
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;
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);
sub->event = event;
sub->callback = callback;
sub->callbackData = callbackData;
+ VMCIList_InitEntry(&sub->subscriberListItem);
VMCIEventGrabLock(&subscriberLock, &lockFlags);
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;
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);
#include "vmci_call_defs.h"
#include "vmciInt.h"
#include "vmciUtil.h"
-#include "circList.h"
#define LGPFX "VMCINotifications: "
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;
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;
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;
/*
*/
ASSERT(FALSE);
- cur = LIST_CONTAINER(iter, VMCINotifyHashEntry, idxListItem);
+ cur = VMCIList_Entry(iter, VMCINotifyHashEntry, idxListItem);
VMCI_FreeKernelMem(cur, sizeof *cur);
}
}
{
VMCILockFlags flags;
uint32 bucket;
- ListItem *iter;
+ VMCIListItem *iter;
if (enterHibernate) {
/*
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 "
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
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);
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) {
/*
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;
}
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;
}
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) {
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);
#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
#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;
void
VMCIQueuePair_Init(void)
{
- queuePairList.head = NULL;
+ VMCIList_Init(&queuePairList.head);
Atomic_Write(&queuePairList.hibernate, 0);
QueuePairLock_Init();
hibernateFailedList = VMCIHandleArray_Create(0);
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;
QueuePairList_AddEntry(QueuePairEntry *entry) // IN:
{
if (entry) {
- LIST_QUEUE(&entry->listItem, &queuePairList.head);
+ VMCIList_Insert(&entry->listItem, &queuePairList.head);
}
}
QueuePairList_RemoveEntry(QueuePairEntry *entry) // IN:
{
if (entry) {
- LIST_DEL(&entry->listItem, &queuePairList.head);
+ VMCIList_Remove(&entry->listItem, &queuePairList.head);
}
}
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;
}
entry->produceQ = produceQ;
entry->consumeQ = consumeQ;
entry->refCount = 0;
- INIT_LIST_ITEM(&entry->listItem);
+ VMCIList_InitEntry(&entry->listItem);
}
return entry;
}
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;
#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_ */