Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Guest control cleanup
[palacios.git] / linux_module / iface-host-dev.c
index 6edc26b..680d753 100644 (file)
@@ -301,6 +301,10 @@ static unsigned int host_dev_poll(struct file * filp,
 
     palacios_spinlock_lock_irqsave(&(dev->lock),f);
 
+
+    // register ourselves on the user wait queue
+    poll_wait(filp, &(dev->user_wait_queue), poll_tb);
+
     if (dev->waiting) { 
        // Yes, we have a request if you want it!
        palacios_spinlock_unlock_irqrestore(&(dev->lock),f);
@@ -310,9 +314,6 @@ static unsigned int host_dev_poll(struct file * filp,
 
     // No request yet, so we need to wait for one to show up.
 
-    // register ourselves on the user wait queue
-    poll_wait(filp, &(dev->user_wait_queue), poll_tb);
-
     palacios_spinlock_unlock_irqrestore(&(dev->lock),f);
 
     DEEP_DEBUG_PRINT("palacios: hostdev: poll delayed\n");
@@ -839,6 +840,8 @@ static int palacios_host_dev_close(v3_host_dev_t hostdev)
     palacios_spinlock_unlock_irqrestore(&(dev->lock),f2);
     palacios_spinlock_unlock_irqrestore(&(host_dev->lock),f1);
     
+    palacios_spinlock_deinit(&(dev->lock));
+
     palacios_host_dev_user_free(dev);
 
     return 0;
@@ -1320,6 +1323,11 @@ static int host_dev_init( void ) {
 }
 
 
+static int host_dev_deinit(void) { 
+    // nothing to do
+    return 0;
+}
+
 static int host_dev_guest_init(struct v3_guest * guest, void ** vm_data ) {
     struct palacios_host_dev * host_dev = palacios_alloc(sizeof(struct palacios_host_dev));
 
@@ -1343,7 +1351,10 @@ static int host_dev_guest_init(struct v3_guest * guest, void ** vm_data ) {
 
 static int host_dev_guest_deinit(struct v3_guest * guest, void * vm_data) {
 
-    palacios_free(vm_data);
+    struct palacios_host_dev * host_dev = (struct palacios_host_dev *) vm_data;
+    remove_guest_ctrl(guest, V3_VM_HOST_DEV_CONNECT);
+    palacios_spinlock_deinit(&(host_dev->lock));
+    palacios_free(host_dev);
     return 0;
 }
 
@@ -1353,7 +1364,7 @@ static int host_dev_guest_deinit(struct v3_guest * guest, void * vm_data) {
 static struct linux_ext host_dev_ext = {
     .name = "HOST_DEVICE_INTERFACE",
     .init = host_dev_init,
-    .deinit = NULL,
+    .deinit = host_dev_deinit,
     .guest_init = host_dev_guest_init,
     .guest_deinit = host_dev_guest_deinit
 };