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.


Linux kernel compatability enhancements (through 3.19)
[palacios.git] / linux_module / palacios-vnet-ctrl.c
index f45abb4..6dae6bb 100644 (file)
@@ -544,10 +544,10 @@ static int inject_route(struct vnet_route_iter * route) {
     
     route->idx = v3_vnet_add_route(route->route);
 
-    spin_lock_irqsave(&(vnet_ctrl_s.lock), flags);
+    palacios_spinlock_lock_irqsave(&(vnet_ctrl_s.lock), flags);
     list_add(&(route->node), &(vnet_ctrl_s.route_list));
     vnet_ctrl_s.num_routes ++;
-    spin_unlock_irqrestore(&(vnet_ctrl_s.lock), flags);
+    palacios_spinlock_unlock_irqrestore(&(vnet_ctrl_s.lock), flags);
 
     INFO("VNET Control: One route added to VNET core\n");
 
@@ -560,10 +560,10 @@ static void delete_route(struct vnet_route_iter * route) {
 
     v3_vnet_del_route(route->idx);
 
-    spin_lock_irqsave(&(vnet_ctrl_s.lock), flags);
+    palacios_spinlock_lock_irqsave(&(vnet_ctrl_s.lock), flags);
     list_del(&(route->node));
     vnet_ctrl_s.num_routes --;
-    spin_unlock_irqrestore(&(vnet_ctrl_s.lock), flags);
+    palacios_spinlock_unlock_irqrestore(&(vnet_ctrl_s.lock), flags);
 
     INFO("VNET Control: Route %d deleted from VNET\n", route->idx);
 
@@ -672,10 +672,10 @@ static void delete_link(struct vnet_link_iter * link){
 
     vnet_brg_delete_link(link->idx);
 
-    spin_lock_irqsave(&(vnet_ctrl_s.lock), flags);
+    palacios_spinlock_lock_irqsave(&(vnet_ctrl_s.lock), flags);
     list_del(&(link->node));
     vnet_ctrl_s.num_links --;
-    spin_unlock_irqrestore(&(vnet_ctrl_s.lock), flags);
+    palacios_spinlock_unlock_irqrestore(&(vnet_ctrl_s.lock), flags);
 
     palacios_free(link);
     link = NULL;
@@ -715,11 +715,12 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) {
        return -EFAULT;
     }
 
+    link_buf[size] = '\0';
+    INFO("Link written: %s\n", link_buf);
+
     while ((link_iter = skip_lines(&line_str))) {
-       DEBUG("Link written: %s\n", link_buf);
        
        token = skip_blank(&link_iter);
-       
        if (!token) {
            return -EFAULT;
        }
@@ -767,13 +768,14 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) {
            link->proto = d_proto;
            link->idx = link_idx;
 
-           spin_lock_irqsave(&(vnet_ctrl_s.lock), flags);
+           palacios_spinlock_lock_irqsave(&(vnet_ctrl_s.lock), flags);
            list_add(&(link->node), &(vnet_ctrl_s.link_iter_list));
            vnet_ctrl_s.num_links ++;
-           spin_unlock_irqrestore(&(vnet_ctrl_s.lock), flags);
+           palacios_spinlock_unlock_irqrestore(&(vnet_ctrl_s.lock), flags);
        } else if (strnicmp("DEL", token, strlen("DEL")) == 0) {
            char * idx_str = NULL;
            uint32_t d_idx;
+           struct vnet_link_iter * link = NULL;
            
            idx_str = skip_blank(&link_iter);
            
@@ -784,9 +786,17 @@ link_write(struct file * file, const char * buf, size_t size, loff_t * ppos) {
 
            d_idx = simple_strtoul(idx_str, &idx_str, 10);
 
-           vnet_brg_delete_link(d_idx);
-               
+           INFO("VNET: deleting link %d\n", d_idx);
+
+           list_for_each_entry(link, &(vnet_ctrl_s.link_iter_list), node) {
+               if (link->idx == d_idx) {
+                   delete_link(link);
+                   break;
+               }
+           }
+
            DEBUG("VNET Control: One link deleted\n");          
+
        } else {
            WARNING("Invalid Link command string\n");
        }
@@ -915,34 +925,33 @@ static int init_proc_files(void) {
        return -1;
     }
 
-    route_entry = create_proc_entry("routes", 0, vnet_root);
+    
+    PAL_PROC_CREATE(route_entry,"routes",0644, vnet_root,&route_fops);
+
     if (route_entry == NULL) {
        remove_proc_entry("vnet", NULL);
        return -1;
     }
-    route_entry->proc_fops = &route_fops;
        
+    PAL_PROC_CREATE(link_entry,"links", 0644, vnet_root,&link_fops);
 
-    link_entry = create_proc_entry("links", 0, vnet_root);
     if (link_entry == NULL) {
        remove_proc_entry("routes", vnet_root);
        remove_proc_entry("vnet", NULL);
        return -1;
     }
-    link_entry->proc_fops = &link_fops;
-       
 
-    stat_entry = create_proc_entry("stats", 0, vnet_root);
+    PAL_PROC_CREATE(stat_entry,"stats", 0644, vnet_root, &stat_fops);
+
     if(stat_entry == NULL) {
        remove_proc_entry("links", vnet_root);
        remove_proc_entry("routes", vnet_root);
        remove_proc_entry("vnet", NULL);
        return -1;
     }
-    stat_entry->proc_fops = &stat_fops;
 
+    PAL_PROC_CREATE(debug_entry,"debug", 0644, vnet_root,&debug_fops);
 
-    debug_entry = create_proc_entry("debug", 0, vnet_root);
     if(debug_entry == NULL) {
        remove_proc_entry("links", vnet_root);
        remove_proc_entry("routes", vnet_root);
@@ -950,7 +959,6 @@ static int init_proc_files(void) {
        remove_proc_entry("vnet", NULL);
        return -1;
     }
-    debug_entry->proc_fops = &debug_fops;
 
     vnet_ctrl_s.vnet_proc_root = vnet_root;
 
@@ -965,7 +973,7 @@ static void destroy_proc_files(void) {
     remove_proc_entry("links", vnet_root);
     remove_proc_entry("routes", vnet_root);
     remove_proc_entry("stats", vnet_root);
-    remove_proc_entry("vnet", NULL);   
+    remove_proc_entry("vnet", palacios_get_procdir()); 
 }
 
 
@@ -979,7 +987,7 @@ int vnet_ctrl_init(void) {
 
     INIT_LIST_HEAD(&(vnet_ctrl_s.link_iter_list));
     INIT_LIST_HEAD(&(vnet_ctrl_s.route_list));
-    spin_lock_init(&(vnet_ctrl_s.lock));
+    palacios_spinlock_init(&(vnet_ctrl_s.lock));
 
     init_proc_files();
        
@@ -1000,6 +1008,8 @@ void vnet_ctrl_deinit(void){
 
     vnet_ctrl_s.status = 0;
 
+    palacios_spinlock_deinit(&(vnet_ctrl_s.lock));
+
     INFO("VNET Control Deinit Finished\n");
 }