aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/drivers/mconsole_kern.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/drivers/mconsole_kern.c')
-rw-r--r--arch/um/drivers/mconsole_kern.c55
1 files changed, 31 insertions, 24 deletions
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
index 0f3c7d14a6e3..ebb265c07e4d 100644
--- a/arch/um/drivers/mconsole_kern.c
+++ b/arch/um/drivers/mconsole_kern.c
@@ -1,23 +1,25 @@
1/* 1/*
2 * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) 2 * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org)
3 * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 3 * Copyright (C) 2001 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com)
4 * Licensed under the GPL 4 * Licensed under the GPL
5 */ 5 */
6 6
7#include "linux/console.h" 7#include <linux/console.h>
8#include "linux/ctype.h" 8#include <linux/ctype.h>
9#include "linux/interrupt.h" 9#include <linux/interrupt.h>
10#include "linux/list.h" 10#include <linux/list.h>
11#include "linux/mm.h" 11#include <linux/mm.h>
12#include "linux/module.h" 12#include <linux/module.h>
13#include "linux/notifier.h" 13#include <linux/notifier.h>
14#include "linux/reboot.h" 14#include <linux/reboot.h>
15#include "linux/proc_fs.h" 15#include <linux/proc_fs.h>
16#include "linux/slab.h" 16#include <linux/slab.h>
17#include "linux/syscalls.h" 17#include <linux/syscalls.h>
18#include "linux/utsname.h" 18#include <linux/utsname.h>
19#include "linux/workqueue.h" 19#include <linux/workqueue.h>
20#include "asm/uaccess.h" 20#include <linux/mutex.h>
21#include <asm/uaccess.h>
22
21#include "init.h" 23#include "init.h"
22#include "irq_kern.h" 24#include "irq_kern.h"
23#include "irq_user.h" 25#include "irq_user.h"
@@ -305,7 +307,9 @@ void mconsole_stop(struct mc_request *req)
305 deactivate_fd(req->originating_fd, MCONSOLE_IRQ); 307 deactivate_fd(req->originating_fd, MCONSOLE_IRQ);
306 os_set_fd_block(req->originating_fd, 1); 308 os_set_fd_block(req->originating_fd, 1);
307 mconsole_reply(req, "stopped", 0, 0); 309 mconsole_reply(req, "stopped", 0, 0);
308 while (mconsole_get_request(req->originating_fd, req)) { 310 for (;;) {
311 if (!mconsole_get_request(req->originating_fd, req))
312 continue;
309 if (req->cmd->handler == mconsole_go) 313 if (req->cmd->handler == mconsole_go)
310 break; 314 break;
311 if (req->cmd->handler == mconsole_stop) { 315 if (req->cmd->handler == mconsole_stop) {
@@ -358,7 +362,7 @@ struct unplugged_pages {
358 void *pages[UNPLUGGED_PER_PAGE]; 362 void *pages[UNPLUGGED_PER_PAGE];
359}; 363};
360 364
361static DECLARE_MUTEX(plug_mem_mutex); 365static DEFINE_MUTEX(plug_mem_mutex);
362static unsigned long long unplugged_pages_count = 0; 366static unsigned long long unplugged_pages_count = 0;
363static LIST_HEAD(unplugged_pages); 367static LIST_HEAD(unplugged_pages);
364static int unplug_index = UNPLUGGED_PER_PAGE; 368static int unplug_index = UNPLUGGED_PER_PAGE;
@@ -394,7 +398,7 @@ static int mem_config(char *str, char **error_out)
394 398
395 diff /= PAGE_SIZE; 399 diff /= PAGE_SIZE;
396 400
397 down(&plug_mem_mutex); 401 mutex_lock(&plug_mem_mutex);
398 for (i = 0; i < diff; i++) { 402 for (i = 0; i < diff; i++) {
399 struct unplugged_pages *unplugged; 403 struct unplugged_pages *unplugged;
400 void *addr; 404 void *addr;
@@ -451,7 +455,7 @@ static int mem_config(char *str, char **error_out)
451 455
452 err = 0; 456 err = 0;
453out_unlock: 457out_unlock:
454 up(&plug_mem_mutex); 458 mutex_unlock(&plug_mem_mutex);
455out: 459out:
456 return err; 460 return err;
457} 461}
@@ -741,7 +745,6 @@ void mconsole_stack(struct mc_request *req)
741{ 745{
742 char *ptr = req->request.data; 746 char *ptr = req->request.data;
743 int pid_requested= -1; 747 int pid_requested= -1;
744 struct task_struct *from = NULL;
745 struct task_struct *to = NULL; 748 struct task_struct *to = NULL;
746 749
747 /* 750 /*
@@ -763,9 +766,7 @@ void mconsole_stack(struct mc_request *req)
763 return; 766 return;
764 } 767 }
765 768
766 from = current; 769 to = find_task_by_pid_ns(pid_requested, &init_pid_ns);
767
768 to = find_task_by_pid(pid_requested);
769 if ((to == NULL) || (pid_requested == 0)) { 770 if ((to == NULL) || (pid_requested == 0)) {
770 mconsole_reply(req, "Couldn't find that pid", 1, 0); 771 mconsole_reply(req, "Couldn't find that pid", 1, 0);
771 return; 772 return;
@@ -795,6 +796,8 @@ static int __init mconsole_init(void)
795 printk(KERN_ERR "Failed to initialize management console\n"); 796 printk(KERN_ERR "Failed to initialize management console\n");
796 return 1; 797 return 1;
797 } 798 }
799 if (os_set_fd_block(sock, 0))
800 goto out;
798 801
799 register_reboot_notifier(&reboot_notifier); 802 register_reboot_notifier(&reboot_notifier);
800 803
@@ -803,7 +806,7 @@ static int __init mconsole_init(void)
803 "mconsole", (void *)sock); 806 "mconsole", (void *)sock);
804 if (err) { 807 if (err) {
805 printk(KERN_ERR "Failed to get IRQ for management console\n"); 808 printk(KERN_ERR "Failed to get IRQ for management console\n");
806 return 1; 809 goto out;
807 } 810 }
808 811
809 if (notify_socket != NULL) { 812 if (notify_socket != NULL) {
@@ -819,6 +822,10 @@ static int __init mconsole_init(void)
819 printk(KERN_INFO "mconsole (version %d) initialized on %s\n", 822 printk(KERN_INFO "mconsole (version %d) initialized on %s\n",
820 MCONSOLE_VERSION, mconsole_socket_name); 823 MCONSOLE_VERSION, mconsole_socket_name);
821 return 0; 824 return 0;
825
826 out:
827 os_close_file(sock);
828 return 1;
822} 829}
823 830
824__initcall(mconsole_init); 831__initcall(mconsole_init);