X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fiface-console.c;h=936449670d25053778e38e438ae36327eea99441;hb=cbe14745457d9a646157633e1fa8eccffe035953;hp=c28fd4c41b2f31e5ccfbbf4dd1af5ef65917bfe9;hpb=791ea2f3e21cfbc9c47341efbb98995c33d86fcb;p=palacios.git diff --git a/linux_module/iface-console.c b/linux_module/iface-console.c index c28fd4c..9364496 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); }