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.


ported streams over to new extension framework
Jack Lange [Wed, 8 Jun 2011 20:19:58 +0000 (15:19 -0500)]
linux_module/palacios-dev.c
linux_module/palacios-stream.c
linux_module/palacios-vm.c

index cc4553d..1f73de1 100644 (file)
@@ -21,7 +21,6 @@
 #include "palacios.h"
 #include "palacios-mm.h"
 #include "palacios-vm.h"
-#include "palacios-stream.h"
 #include "palacios-serial.h"
 #include "palacios-socket.h"
 #include "palacios-vnet.h"
@@ -138,7 +137,6 @@ static long v3_dev_ioctl(struct file * filp,
            INIT_LIST_HEAD(&(guest->exts));
 
 
-           INIT_LIST_HEAD(&(guest->streams));
            INIT_LIST_HEAD(&(guest->sockets));
 #ifdef V3_CONFIG_HOST_DEVICE
            INIT_LIST_HEAD(&(guest->hostdev.devs));
@@ -261,9 +259,6 @@ static int __init v3_init(void) {
 
 
 
-#ifdef V3_CONFIG_STREAM
-    palacios_init_stream();
-#endif
 
 #ifdef V3_CONFIG_KEYED_STREAMS
     palacios_init_keyed_streams();
@@ -341,9 +336,6 @@ static void __exit v3_exit(void) {
 #endif
 
 
-#ifdef V3_CONFIG_STREAM
-    palacios_deinit_stream();
-#endif
 
 #ifdef V3_CONFIG_SOCKET
     palacios_socket_deinit();
index 340d27f..411c119 100644 (file)
@@ -6,12 +6,38 @@
 #include <linux/errno.h>
 #include <linux/percpu.h>
 #include <linux/sched.h>
+#include <linux/uaccess.h>
+
 
 #include <interfaces/vmm_stream.h>
-#include "palacios-stream.h"
+#include "linux-exts.h"
+#include "palacios-ringbuffer.h"
+#include "palacios-vm.h"
+
+#define STREAM_BUF_SIZE 1024
+#define STREAM_NAME_LEN 128
+
+
 
 static struct list_head global_streams;
 
+struct stream_buffer {
+    char name[STREAM_NAME_LEN];
+    struct ringbuf * buf;
+
+    wait_queue_head_t intr_queue;
+    spinlock_t lock;
+
+    struct v3_guest * guest;
+    struct list_head stream_node;
+};
+
+
+// Currently just the list of open streams
+struct vm_stream_state {
+    struct list_head open_streams;
+};
+
 static int stream_enqueue(struct stream_buffer * stream, char * buf, int len) {
     int bytes = 0;
 
@@ -21,7 +47,7 @@ static int stream_enqueue(struct stream_buffer * stream, char * buf, int len) {
 }
 
 
-int stream_dequeue(struct stream_buffer * stream, char * buf, int len) {
+static int stream_dequeue(struct stream_buffer * stream, char * buf, int len) {
     int bytes = 0;
 
     bytes = ringbuf_read(stream->buf, buf, len);
@@ -29,25 +55,31 @@ int stream_dequeue(struct stream_buffer * stream, char * buf, int len) {
     return bytes;
 }
 
-int stream_datalen(struct stream_buffer * stream){
+static int stream_datalen(struct stream_buffer * stream){
     return ringbuf_data_len(stream->buf);
 }
 
 
-int open_stream(const char * name) {
-    return -1;
-}
 
 
 
-struct stream_buffer * find_stream_by_name(struct v3_guest * guest, const char * name) {
+static struct stream_buffer * find_stream_by_name(struct v3_guest * guest, const char * name) {
     struct stream_buffer * stream = NULL;
     struct list_head * stream_list = NULL;
+    struct vm_stream_state * vm_state = NULL;
+
 
     if (guest == NULL) {
        stream_list = &global_streams;
     } else {
-       stream_list = &(guest->streams);
+       vm_state = get_vm_ext_data(guest, "STREAM_INTERFACE");
+
+       if (vm_state == NULL) {
+           printk("ERROR: Could not locate vm stream state for extension STREAM_INTERFACE\n");
+           return NULL;
+       }
+
+       stream_list = &(vm_state->open_streams);
     }
 
     list_for_each_entry(stream,  stream_list, stream_node) {
@@ -63,6 +95,16 @@ struct stream_buffer * find_stream_by_name(struct v3_guest * guest, const char *
 static void * palacios_stream_open(const char * name, void * private_data) {
     struct v3_guest * guest = (struct v3_guest *)private_data;
     struct stream_buffer * stream = NULL;
+    struct vm_stream_state * vm_state = NULL;
+
+    if (guest != NULL) {
+       vm_state = get_vm_ext_data(guest, "STREAM_INTERFACE");
+
+       if (vm_state == NULL) {
+           printk("ERROR: Could not locate vm stream state for extension STREAM_INTERFACE\n");
+           return NULL;
+       }
+    }
 
     if (find_stream_by_name(guest, name) != NULL) {
        printk("Stream already exists\n");
@@ -82,7 +124,7 @@ static void * palacios_stream_open(const char * name, void * private_data) {
     if (guest == NULL) {
        list_add(&(stream->stream_node), &(global_streams));
     } else {
-       list_add(&(stream->stream_node), &(guest->streams));
+       list_add(&(stream->stream_node), &(vm_state->open_streams));
     } 
 
     return stream;
@@ -112,21 +154,75 @@ static void palacios_stream_close(void * stream_ptr) {
 
 }
 
-struct v3_stream_hooks palacios_stream_hooks = {
+static struct v3_stream_hooks palacios_stream_hooks = {
     .open = palacios_stream_open,
     .write = palacios_stream_write,
     .close = palacios_stream_close,
 };
 
 
-void palacios_init_stream() {
+static int stream_init( void ) {
     INIT_LIST_HEAD(&(global_streams));
     V3_Init_Stream(&palacios_stream_hooks);
+    
+    return 0;
 }
 
 
-void palacios_deinit_stream() {
+static int stream_deinit( void ) {
     if (!list_empty(&(global_streams))) {
        printk("Error removing module with open streams\n");
     }
+
+    return 0;
 }
+
+static int stream_connect(struct v3_guest * guest, unsigned int cmd, unsigned long arg, void * priv_data) {
+    void __user * argp = (void __user *)arg;
+    char path_name[STREAM_NAME_LEN];
+    
+    if (copy_from_user(path_name, argp, STREAM_NAME_LEN)) {
+       printk("%s(%d): copy from user error...\n", __FILE__, __LINE__);
+       return -EFAULT;
+    }
+    
+    printk("ERROR: Opening Streams is currently not implemented...\n");
+
+    return -EFAULT;
+}
+
+
+static int guest_stream_init(struct v3_guest * guest, void ** vm_data) {
+    struct vm_stream_state * state = kmalloc(sizeof(struct vm_stream_state), GFP_KERNEL);
+
+    INIT_LIST_HEAD(&(state->open_streams));
+    *vm_data = state;
+
+
+    add_guest_ctrl(guest, V3_VM_STREAM_CONNECT, stream_connect, state);
+
+    return 0;
+}
+
+
+static int guest_stream_deinit(struct v3_guest * guest, void * vm_data) {
+    struct vm_stream_state * state = vm_data;
+    if (!list_empty(&(state->open_streams))) {
+       printk("Error shutting down VM with open streams\n");
+    }
+
+    return 0;
+}
+
+
+
+static struct linux_ext stream_ext = {
+    .name = "STREAM_INTERFACE",
+    .init = stream_init,
+    .deinit = stream_deinit,
+    .guest_init = guest_stream_init,
+    .guest_deinit = guest_stream_deinit
+};
+
+
+register_extension(&stream_ext);
index 715d626..b50714e 100644 (file)
@@ -112,10 +112,6 @@ static struct vm_ctrl * get_ctrl(struct v3_guest * guest, unsigned int cmd) {
 }
 
 
-#ifdef V3_CONFIG_STREAM
-#include "palacios-stream.h"
-#endif
-
 
 #ifdef V3_CONFIG_EXT_INSPECTOR
 #include "palacios-inspector.h"
@@ -131,7 +127,7 @@ static struct vm_ctrl * get_ctrl(struct v3_guest * guest, unsigned int cmd) {
 #endif
 
 extern struct class * v3_class;
-#define STREAM_NAME_LEN 128
+
 
 static long v3_vm_ioctl(struct file * filp,
                        unsigned int ioctl, unsigned long arg) {
@@ -149,23 +145,6 @@ static long v3_vm_ioctl(struct file * filp,
        }
 
 
-       case V3_VM_STREAM_CONNECT: {
-#ifdef V3_CONFIG_STREAM
-           void __user * argp = (void __user *)arg;
-           char path_name[STREAM_NAME_LEN];
-
-           if (copy_from_user(path_name, argp, STREAM_NAME_LEN)) {
-               printk("%s(%d): copy from user error...\n", __FILE__, __LINE__);
-               return -EFAULT;
-           }
-
-           return open_stream(path_name);
-#else
-           printk("Stream support Not available\n");
-           return -EFAULT;
-#endif
-           break;
-       }
 
        case V3_VM_HOST_DEV_CONNECT: {
 #ifdef V3_CONFIG_HOST_DEVICE