X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fum%2Fdrivers%2Fmconsole_kern.c;fp=arch%2Fum%2Fdrivers%2Fmconsole_kern.c;h=6e85bbf251fd05952ca15295a15963180544d6fa;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=b414522f7686cadff6f4f0752c100bed57d8144a;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index b414522f7..6e85bbf25 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c @@ -20,9 +20,8 @@ #include "linux/namei.h" #include "linux/proc_fs.h" #include "linux/syscalls.h" -#include "linux/list.h" -#include "linux/mm.h" #include "linux/console.h" +#include "linux/vs_cvirt.h" #include "asm/irq.h" #include "asm/uaccess.h" #include "user_util.h" @@ -62,7 +61,7 @@ static void mc_work_proc(void *unused) unsigned long flags; while(!list_empty(&mc_requests)){ - local_irq_save(flags); + local_save_flags(flags); req = list_entry(mc_requests.next, struct mconsole_entry, list); list_del(&req->list); @@ -87,7 +86,7 @@ static irqreturn_t mconsole_interrupt(int irq, void *dev_id, if(req.cmd->context == MCONSOLE_INTR) (*req.cmd->handler)(&req); else { - new = kmalloc(sizeof(*new), GFP_NOWAIT); + new = kmalloc(sizeof(*new), GFP_ATOMIC); if(new == NULL) mconsole_reply(&req, "Out of memory", 1, 0); else { @@ -300,6 +299,8 @@ void mconsole_reboot(struct mc_request *req) machine_restart(NULL); } +extern void ctrl_alt_del(void); + void mconsole_cad(struct mc_request *req) { mconsole_reply(req, "", 0, 0); @@ -347,141 +348,6 @@ static struct mc_device *mconsole_find_dev(char *name) return(NULL); } -#define UNPLUGGED_PER_PAGE \ - ((PAGE_SIZE - sizeof(struct list_head)) / sizeof(unsigned long)) - -struct unplugged_pages { - struct list_head list; - void *pages[UNPLUGGED_PER_PAGE]; -}; - -static unsigned long long unplugged_pages_count = 0; -static struct list_head unplugged_pages = LIST_HEAD_INIT(unplugged_pages); -static int unplug_index = UNPLUGGED_PER_PAGE; - -static int mem_config(char *str) -{ - unsigned long long diff; - int err = -EINVAL, i, add; - char *ret; - - if(str[0] != '=') - goto out; - - str++; - if(str[0] == '-') - add = 0; - else if(str[0] == '+'){ - add = 1; - } - else goto out; - - str++; - diff = memparse(str, &ret); - if(*ret != '\0') - goto out; - - diff /= PAGE_SIZE; - - for(i = 0; i < diff; i++){ - struct unplugged_pages *unplugged; - void *addr; - - if(add){ - if(list_empty(&unplugged_pages)) - break; - - unplugged = list_entry(unplugged_pages.next, - struct unplugged_pages, list); - if(unplug_index > 0) - addr = unplugged->pages[--unplug_index]; - else { - list_del(&unplugged->list); - addr = unplugged; - unplug_index = UNPLUGGED_PER_PAGE; - } - - free_page((unsigned long) addr); - unplugged_pages_count--; - } - else { - struct page *page; - - page = alloc_page(GFP_ATOMIC); - if(page == NULL) - break; - - unplugged = page_address(page); - if(unplug_index == UNPLUGGED_PER_PAGE){ - list_add(&unplugged->list, &unplugged_pages); - unplug_index = 0; - } - else { - struct list_head *entry = unplugged_pages.next; - addr = unplugged; - - unplugged = list_entry(entry, - struct unplugged_pages, - list); - unplugged->pages[unplug_index++] = addr; - err = os_drop_memory(addr, PAGE_SIZE); - if(err) - printk("Failed to release memory - " - "errno = %d\n", err); - } - - unplugged_pages_count++; - } - } - - err = 0; -out: - return err; -} - -static int mem_get_config(char *name, char *str, int size, char **error_out) -{ - char buf[sizeof("18446744073709551615")]; - int len = 0; - - sprintf(buf, "%ld", uml_physmem); - CONFIG_CHUNK(str, size, len, buf, 1); - - return len; -} - -static int mem_id(char **str, int *start_out, int *end_out) -{ - *start_out = 0; - *end_out = 0; - - return 0; -} - -static int mem_remove(int n) -{ - return -EBUSY; -} - -static struct mc_device mem_mc = { - .name = "mem", - .config = mem_config, - .get_config = mem_get_config, - .id = mem_id, - .remove = mem_remove, -}; - -static int mem_mc_init(void) -{ - if(can_drop_memory()) - mconsole_register_dev(&mem_mc); - else printk("Can't release memory to the host - memory hotplug won't " - "be supported\n"); - return 0; -} - -__initcall(mem_mc_init); - #define CONFIG_BUF_SIZE 64 static void mconsole_get_config(int (*get_config)(char *, char *, int, @@ -613,7 +479,7 @@ static void console_write(struct console *console, const char *string, return; while(1){ - n = min((size_t) len, ARRAY_SIZE(console_buf) - console_index); + n = min(len, ARRAY_SIZE(console_buf) - console_index); strncpy(&console_buf[console_index], string, n); console_index += n; string += n; @@ -652,6 +518,7 @@ static void with_console(struct mc_request *req, void (*proc)(void *), struct mconsole_entry entry; unsigned long flags; + INIT_LIST_HEAD(&entry.list); entry.request = *req; list_add(&entry.list, &clients); spin_lock_irqsave(&console_lock, flags); @@ -777,7 +644,7 @@ static int mconsole_init(void) register_reboot_notifier(&reboot_notifier); err = um_request_irq(MCONSOLE_IRQ, sock, IRQ_READ, mconsole_interrupt, - IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, + SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, "mconsole", (void *)sock); if (err){ printk("Failed to get IRQ for management console\n"); @@ -896,8 +763,7 @@ static struct notifier_block panic_exit_notifier = { static int add_notifier(void) { - atomic_notifier_chain_register(&panic_notifier_list, - &panic_exit_notifier); + notifier_chain_register(&panic_notifier_list, &panic_exit_notifier); return(0); }