X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fum%2Fdrivers%2Fmconsole_kern.c;h=d8af1449e1a03bdefa6d187a6459bd1cf8785f36;hb=902d44426afe46356253fe93d8cef2b4d9f236f3;hp=3396ba4946aa17dc13940221ca0e69996c43ee1c;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 3396ba494..d8af1449e 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c @@ -51,26 +51,27 @@ static struct notifier_block reboot_notifier = { LIST_HEAD(mc_requests); -static void mc_work_proc(void *unused) +void mc_work_proc(void *unused) { struct mconsole_entry *req; unsigned long flags; + int done; - while(!list_empty(&mc_requests)){ + do { local_save_flags(flags); req = list_entry(mc_requests.next, struct mconsole_entry, list); list_del(&req->list); + done = list_empty(&mc_requests); local_irq_restore(flags); req->request.cmd->handler(&req->request); kfree(req); - } + } while(!done); } DECLARE_WORK(mconsole_work, mc_work_proc, NULL); -static irqreturn_t mconsole_interrupt(int irq, void *dev_id, - struct pt_regs *regs) +irqreturn_t mconsole_interrupt(int irq, void *dev_id, struct pt_regs *regs) { int fd; struct mconsole_entry *new; @@ -90,8 +91,7 @@ static irqreturn_t mconsole_interrupt(int irq, void *dev_id, } } } - if(!list_empty(&mc_requests)) - schedule_work(&mconsole_work); + if(!list_empty(&mc_requests)) schedule_work(&mconsole_work); reactivate_fd(fd, MCONSOLE_IRQ); return(IRQ_HANDLED); } @@ -374,8 +374,8 @@ void mconsole_sysrq(struct mc_request *req) ptr += strlen("sysrq"); while(isspace(*ptr)) ptr++; - mconsole_reply(req, "", 0, 0); handle_sysrq(*ptr, ¤t->thread.regs, NULL); + mconsole_reply(req, "", 0, 0); } #else void mconsole_sysrq(struct mc_request *req)