From: Jack Lange Date: Wed, 8 Jun 2011 20:19:58 +0000 (-0500) Subject: ported streams over to new extension framework X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=fcb418e3ef916356ef80c1f1436adfa1e6878d4f ported streams over to new extension framework --- diff --git a/linux_module/palacios-dev.c b/linux_module/palacios-dev.c index cc4553d..1f73de1 100644 --- a/linux_module/palacios-dev.c +++ b/linux_module/palacios-dev.c @@ -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(); diff --git a/linux_module/palacios-stream.c b/linux_module/palacios-stream.c index 340d27f..411c119 100644 --- a/linux_module/palacios-stream.c +++ b/linux_module/palacios-stream.c @@ -6,12 +6,38 @@ #include #include #include +#include + #include -#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); diff --git a/linux_module/palacios-vm.c b/linux_module/palacios-vm.c index 715d626..b50714e 100644 --- a/linux_module/palacios-vm.c +++ b/linux_module/palacios-vm.c @@ -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