X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fiface-console.c;h=0f5bd23e360ae7f912180ba41f6c9613ffdf74f2;hb=da0b4bb80de755529f47b9ca57ccb0c2cefae15b;hp=c28fd4c41b2f31e5ccfbbf4dd1af5ef65917bfe9;hpb=791ea2f3e21cfbc9c47341efbb98995c33d86fcb;p=palacios.git diff --git a/linux_module/iface-console.c b/linux_module/iface-console.c index c28fd4c..0f5bd23 100644 --- a/linux_module/iface-console.c +++ b/linux_module/iface-console.c @@ -113,11 +113,11 @@ console_read(struct file * filp, char __user * buf, size_t size, loff_t * offset } - kfree(msg); + palacios_free(msg); - spin_lock_irqsave(&(cons->queue->lock), flags); + palacios_spinlock_lock_irqsave(&(cons->queue->lock), flags); entries = cons->queue->num_entries; - spin_unlock_irqrestore(&(cons->queue->lock), flags); + palacios_spinlock_unlock_irqrestore(&(cons->queue->lock), flags); if (entries > 0) { wake_up_interruptible(&(cons->intr_queue)); @@ -163,9 +163,9 @@ console_poll(struct file * filp, struct poll_table_struct * poll_tb) { poll_wait(filp, &(cons->intr_queue), poll_tb); - spin_lock_irqsave(&(cons->queue->lock), flags); + palacios_spinlock_lock_irqsave(&(cons->queue->lock), flags); entries = cons->queue->num_entries; - spin_unlock_irqrestore(&(cons->queue->lock), flags); + palacios_spinlock_unlock_irqrestore(&(cons->queue->lock), flags); if (entries > 0) { // DEBUG("Returning from POLL\n"); @@ -183,12 +183,12 @@ static int console_release(struct inode * i, struct file * filp) { DEBUG("Releasing the Console File desc\n"); - spin_lock_irqsave(&(cons->queue->lock), flags); + palacios_spinlock_lock_irqsave(&(cons->queue->lock), flags); cons->connected = 0; - spin_unlock_irqrestore(&(cons->queue->lock), flags); + palacios_spinlock_unlock_irqrestore(&(cons->queue->lock), flags); while ((msg = dequeue(cons->queue))) { - kfree(msg); + palacios_free(msg); } return 0; @@ -216,12 +216,12 @@ static int console_connect(struct v3_guest * guest, unsigned int cmd, return -1; } - spin_lock_irqsave(&(cons->lock), flags); + palacios_spinlock_lock_irqsave(&(cons->lock), flags); if (cons->connected == 0) { cons->connected = 1; acquired = 1; } - spin_unlock_irqrestore(&(cons->lock), flags); + palacios_spinlock_unlock_irqrestore(&(cons->lock), flags); if (acquired == 0) { ERROR("Console already connected\n"); @@ -247,23 +247,30 @@ static int console_connect(struct v3_guest * guest, unsigned int cmd, static void * palacios_tty_open(void * private_data, unsigned int width, unsigned int height) { struct v3_guest * guest = (struct v3_guest *)private_data; - struct palacios_console * cons = kmalloc(sizeof(struct palacios_console), GFP_KERNEL); + struct palacios_console * cons = palacios_alloc(sizeof(struct palacios_console)); + + if (!cons) { + ERROR("Cannot allocate memory for console\n"); + return NULL; + } INFO("Guest initialized virtual console (Guest=%s)\n", guest->name); if (guest == NULL) { ERROR("ERROR: Cannot open a console on a NULL guest\n"); + palacios_free(cons); return NULL; } if (cons->open == 1) { ERROR("Console already open\n"); + palacios_free(cons); return NULL; } cons->queue = create_queue(CONSOLE_QUEUE_LEN); - spin_lock_init(&(cons->lock)); + palacios_spinlock_init(&(cons->lock)); init_waitqueue_head(&(cons->intr_queue)); cons->guest = guest; @@ -301,7 +308,12 @@ static int palacios_tty_cursor_set(void * console, int x, int y) { return 0; } - msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL); + msg = palacios_alloc(sizeof(struct cons_msg)); + + if (!msg) { + ERROR("Cannot allocate cursor set message in console\n"); + return -1; + } msg->op = CONSOLE_CURS_SET; msg->cursor.x = x; @@ -318,7 +330,12 @@ static int palacios_tty_character_set(void * console, int x, int y, char c, unsi return 0; } - msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL); + msg = palacios_alloc(sizeof(struct cons_msg)); + + if (!msg) { + ERROR("Cannot allocate character set message in console\n"); + return -1; + } msg->op = CONSOLE_CHAR_SET; msg->character.x = x; @@ -338,7 +355,12 @@ static int palacios_tty_scroll(void * console, int lines) { return 0; } - msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL); + msg = palacios_alloc(sizeof(struct cons_msg)); + + if (!msg) { + ERROR("Cannot allocate scroll message in console\n"); + return -1; + } msg->op = CONSOLE_SCROLL; msg->scroll.lines = lines; @@ -354,7 +376,12 @@ static int palacios_set_text_resolution(void * console, int cols, int rows) { return 0; } - msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL); + msg = palacios_alloc(sizeof(struct cons_msg)); + + if (!msg) { + ERROR("Cannot allocate text resolution message in console\n"); + return -1; + } msg->op = CONSOLE_RESOLUTION; msg->resolution.cols = cols; @@ -371,7 +398,12 @@ static int palacios_tty_update(void * console) { return 0; } - msg = kmalloc(sizeof(struct cons_msg), GFP_KERNEL); + msg = palacios_alloc(sizeof(struct cons_msg)); + + if (!msg) { + ERROR("Cannot allocate update message in console\n"); + return -1; + } msg->op = CONSOLE_UPDATE; @@ -382,6 +414,13 @@ static void palacios_tty_close(void * console) { struct palacios_console * cons = (struct palacios_console *) console; cons->open = 0; + + remove_guest_ctrl(cons->guest, V3_VM_CONSOLE_CONNECT); + deinit_queue(cons->queue); + + palacios_spinlock_deinit(&(cons->lock)); + + palacios_free(cons); } @@ -407,13 +446,18 @@ static int console_init( void ) { return 0; } +static int console_deinit(void) +{ + // nothing to do + return 0; +} static struct linux_ext console_ext = { .name = "CONSOLE", .init = console_init, - .deinit = NULL, + .deinit = console_deinit, .guest_init = NULL, .guest_deinit = NULL };