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.


deallocation of devices
[palacios.git] / palacios / src / devices / lnx_virtio_vnet.c
index c35250d..9e10784 100644 (file)
@@ -125,7 +125,8 @@ static int get_desc_count(struct virtio_queue * q, int index) {
 
 
 
-static int handle_cmd_kick(struct guest_info * core, struct virtio_vnet_state * vnet_state) {
+static int handle_cmd_kick(struct guest_info * core, 
+                          struct virtio_vnet_state * vnet_state) {
     struct virtio_queue * q = &(vnet_state->queue[0]);
     
     PrintDebug("VNET Bridge: Handling command  queue\n");
@@ -222,12 +223,13 @@ static int handle_cmd_kick(struct guest_info * core, struct virtio_vnet_state *
 }
 
 
-static int vnet_pkt_input_cb(struct v3_vm_info * vm,  struct v3_vnet_pkt *pkt, void * private_data){
+static int vnet_pkt_input_cb(struct v3_vm_info * vm,  
+                            struct v3_vnet_pkt * pkt, 
+                            void * private_data){
     struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
     struct virtio_queue * q = &(vnet_state->queue[RECV_QUEUE]);
     int ret_val = -1;
     unsigned long flags;
-    uint16_t sent;
 
     flags = v3_lock_irqsave(vnet_state->lock);
        
@@ -280,18 +282,8 @@ exit:
     return ret_val;
 }
 
-static int vnet_pkt_input_xcall(void *data){
-    struct v3_vnet_bridge_xcall_args *args = (struct v3_vnet_bridge_xcall_args *)data;
-    int i = 0;
-
-    for(i = 0; i < args->pkt_num; i++) {
-       vnet_pkt_input_cb(args->vm, args->vnet_pkts[i], args->private_data);
-    }
-       
-    return 0;
-}
-
-static int handle_pkt_kick(struct guest_info *core, struct virtio_vnet_state * vnet_state) 
+static int handle_pkt_kick(struct guest_info * core, 
+                          struct virtio_vnet_state * vnet_state) 
 {
     struct virtio_queue * q = &(vnet_state->queue[XMIT_QUEUE]);
     int recvd = 0;
@@ -347,7 +339,7 @@ static int handle_pkt_kick(struct guest_info *core, struct virtio_vnet_state * v
     return 0;
 }
 
-static void vnet_virtio_poll(struct v3_vm_info * vm, void *private_data){
+static void vnet_virtio_poll(struct v3_vm_info * vm, void * private_data){
     struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
 
     if(vm == vnet_state->vm){  
@@ -355,14 +347,17 @@ static void vnet_virtio_poll(struct v3_vm_info * vm, void *private_data){
     }
 }
 
-static int handle_rx_kick(struct guest_info *core, struct virtio_vnet_state * vnet_state) 
+static int handle_rx_kick(struct guest_info *core, 
+                         struct virtio_vnet_state * vnet_state) 
 {
     //v3_vnet_enable_bridge();
        
     return 0;
 }
 
-static int vnet_virtio_io_write(struct guest_info * core, uint16_t port, void * src, uint_t length, void * private_data) {
+static int vnet_virtio_io_write(struct guest_info * core, 
+                               uint16_t port, void * src, 
+                               uint_t length, void * private_data) {
     struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
     int port_idx = port % vnet_state->io_range_size;
 
@@ -496,7 +491,9 @@ static int vnet_virtio_io_write(struct guest_info * core, uint16_t port, void *
 }
 
 
-static int vnet_virtio_io_read(struct guest_info * core, uint16_t port, void * dst, uint_t length, void * private_data) {
+static int vnet_virtio_io_read(struct guest_info * core, 
+                              uint16_t port, void * dst, 
+                              uint_t length, void * private_data) {
 
     struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
     int port_idx = port % vnet_state->io_range_size;
@@ -565,12 +562,17 @@ static int vnet_virtio_io_read(struct guest_info * core, uint16_t port, void * d
 }
 
 
+static int virtio_free(struct virtio_vnet_state * vnet_state) {
+
+    // unregister from PCI
+
+    V3_Free(vnet_state);
+    return 0;
+}
+
 
 static struct v3_device_ops dev_ops = {
-    .free = NULL,
-    .reset = NULL,
-    .start = NULL,
-    .stop = NULL,
+    .free = (int (*)(void *))virtio_free,
 };
 
 static int dev_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
@@ -591,10 +593,11 @@ static int dev_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
        
     vnet_state->vm = vm;
 
-    struct vm_device * dev = v3_allocate_device(name, &dev_ops, vnet_state);
+    struct vm_device * dev = v3_add_device(vm, name, &dev_ops, vnet_state);
 
-    if (v3_attach_device(vm, dev) == -1) {
+    if (dev == NULL) {
        PrintError("Could not attach device %s\n", name);
+       V3_Free(vnet_state);
        return -1;
     }
 
@@ -638,6 +641,7 @@ static int dev_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
 
        if (!pci_dev) {
            PrintError("Could not register PCI Device\n");
+           v3_remove_device(dev);
            return -1;
        }
        
@@ -659,11 +663,11 @@ static int dev_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
 
     struct v3_vnet_bridge_ops brg_ops;
     brg_ops.input = vnet_pkt_input_cb;
-    brg_ops.polling_pkt = vnet_virtio_poll;
-    brg_ops.xcall_input = vnet_pkt_input_xcall;
+    brg_ops.poll = vnet_virtio_poll;
 
     V3_Print("Registering Virtio device as vnet bridge\n");
-    v3_vnet_add_bridge(vm, &brg_ops, (void *)vnet_state);
+
+    v3_vnet_add_bridge(vm, &brg_ops, CTL_VM_BRIDGE, (void *)vnet_state);
 
     return 0;
 }