#define EXPORT_SYMTAB
+#include <asm/atomic.h>
#include <asm/io.h>
#include <linux/file.h>
*/
static Bool guestDeviceInit;
+static atomic_t guestDeviceActive;
static Bool hostDeviceInit;
/*
vmci_dev.exclusive_vectors = FALSE;
spin_lock_init(&vmci_dev.dev_spinlock);
vmci_dev.enabled = FALSE;
+ atomic_set(&guestDeviceActive, 0);
data_buffer = vmalloc(data_buffer_size);
if (!data_buffer) {
printk(KERN_INFO "Registered vmci device.\n");
+ atomic_inc(&guestDeviceActive);
+
compat_mutex_unlock(&vmci_dev.lock);
/* Enable specific interrupt bits. */
printk(KERN_INFO "Removing vmci device\n");
+ atomic_dec(&guestDeviceActive);
+
VMCIQPGuestEndpoints_Exit();
VMCIUtil_Exit();
Bool
VMCI_DeviceEnabled(void)
{
- Bool retval;
-
- if (!guestDeviceInit) {
- return FALSE;
- }
-
- compat_mutex_lock(&vmci_dev.lock);
- retval = vmci_dev.enabled;
- compat_mutex_unlock(&vmci_dev.lock);
-
- return retval;
+ return VMCI_HasGuestDevice() || VMCI_HasHostDevice();
}
Bool
VMCI_HasGuestDevice(void)
{
- return VMCI_DeviceEnabled();
+ return guestDeviceInit && atomic_read(&guestDeviceActive) > 0;
}