From: Oleg Drokin Here is UML's part. arch/um/drivers/line.c | 17 ++++++++++------- arch/um/drivers/mconsole_kern.c | 3 ++- arch/um/drivers/net_kern.c | 5 +++-- arch/um/drivers/port_kern.c | 9 ++++++--- arch/um/drivers/ubd_kern.c | 4 +++- arch/um/drivers/xterm_kern.c | 7 ++++--- arch/um/include/line.h | 5 +++-- arch/um/kernel/irq.c | 4 ++-- arch/um/kernel/sigio_kern.c | 6 ++++-- arch/um/kernel/time_kern.c | 3 ++- include/asm-um/irq.h | 4 +++- 11 files changed, 42 insertions(+), 25 deletions(-) diff -puN arch/um/drivers/line.c~irqreturn-uml arch/um/drivers/line.c --- 25/arch/um/drivers/line.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/drivers/line.c 2003-04-24 05:17:10.000000000 -0700 @@ -6,8 +6,8 @@ #include "linux/sched.h" #include "linux/slab.h" #include "linux/list.h" +#include "linux/interrupt.h" #include "linux/devfs_fs_kernel.h" -#include "asm/irq.h" #include "asm/uaccess.h" #include "chan_kern.h" #include "irq_user.h" @@ -19,13 +19,14 @@ #define LINE_BUFSIZE 4096 -void line_interrupt(int irq, void *data, struct pt_regs *unused) +irqreturn_t line_interrupt(int irq, void *data, struct pt_regs *unused) { struct line *dev = data; if(dev->count > 0) chan_interrupt(&dev->chan_list, &dev->task, dev->tty, irq, dev); + return IRQ_HANDLED; } void line_timer_cb(void *arg) @@ -136,20 +137,20 @@ int line_write(struct line *lines, struc return(len); } -void line_write_interrupt(int irq, void *data, struct pt_regs *unused) +irqreturn_t line_write_interrupt(int irq, void *data, struct pt_regs *unused) { struct line *dev = data; struct tty_struct *tty = dev->tty; int err; err = flush_buffer(dev); - if(err == 0) return; + if(err == 0) return IRQ_NONE; else if(err < 0){ dev->head = dev->buffer; dev->tail = dev->buffer; } - if(tty == NULL) return; + if(tty == NULL) return IRQ_NONE; if(test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && (tty->ldisc.write_wakeup != NULL)) @@ -164,6 +165,7 @@ void line_write_interrupt(int irq, void if (waitqueue_active(&tty->write_wait)) wake_up_interruptible(&tty->write_wait); + return IRQ_HANDLED; } int line_write_room(struct tty_struct *tty) @@ -476,7 +478,7 @@ struct winch { struct line *line; }; -void winch_interrupt(int irq, void *data, struct pt_regs *unused) +irqreturn_t winch_interrupt(int irq, void *data, struct pt_regs *unused) { struct winch *winch = data; struct tty_struct *tty; @@ -491,7 +493,7 @@ void winch_interrupt(int irq, void *data printk("fd %d is losing SIGWINCH support\n", winch->tty_fd); free_irq(irq, data); - return; + return IRQ_HANDLED; } goto out; } @@ -504,6 +506,7 @@ void winch_interrupt(int irq, void *data } out: reactivate_fd(winch->fd, WINCH_IRQ); + return IRQ_HANDLED; } DECLARE_MUTEX(winch_handler_sem); diff -puN arch/um/drivers/mconsole_kern.c~irqreturn-uml arch/um/drivers/mconsole_kern.c --- 25/arch/um/drivers/mconsole_kern.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/drivers/mconsole_kern.c 2003-04-24 05:17:10.000000000 -0700 @@ -67,7 +67,7 @@ void mc_work_proc(void *unused) DECLARE_WORK(mconsole_work, mc_work_proc, NULL); -void 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; @@ -88,6 +88,7 @@ void mconsole_interrupt(int irq, void *d } if(!list_empty(&mc_requests)) schedule_work(&mconsole_work); reactivate_fd(fd, MCONSOLE_IRQ); + return IRQ_HANDLED; } void mconsole_version(struct mc_request *req) diff -puN arch/um/drivers/net_kern.c~irqreturn-uml arch/um/drivers/net_kern.c --- 25/arch/um/drivers/net_kern.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/drivers/net_kern.c 2003-04-24 05:17:10.000000000 -0700 @@ -61,14 +61,14 @@ static int uml_net_rx(struct net_device return pkt_len; } -void uml_net_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t uml_net_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct uml_net_private *lp = dev->priv; int err; if(!netif_running(dev)) - return; + return IRQ_NONE; spin_lock(&lp->lock); while((err = uml_net_rx(dev)) > 0) ; @@ -83,6 +83,7 @@ void uml_net_interrupt(int irq, void *de out: spin_unlock(&lp->lock); + return IRQ_HANDLED; } static int uml_net_open(struct net_device *dev) diff -puN arch/um/drivers/port_kern.c~irqreturn-uml arch/um/drivers/port_kern.c --- 25/arch/um/drivers/port_kern.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/drivers/port_kern.c 2003-04-24 05:17:10.000000000 -0700 @@ -6,6 +6,7 @@ #include "linux/list.h" #include "linux/sched.h" #include "linux/slab.h" +#include "linux/interrupt.h" #include "linux/irq.h" #include "linux/spinlock.h" #include "linux/errno.h" @@ -44,7 +45,7 @@ struct connection { struct port_list *port; }; -static void pipe_interrupt(int irq, void *data, struct pt_regs *regs) +static irqreturn_t pipe_interrupt(int irq, void *data, struct pt_regs *regs) { struct connection *conn = data; int fd; @@ -52,7 +53,7 @@ static void pipe_interrupt(int irq, void fd = os_rcv_fd(conn->socket[0], &conn->helper_pid); if(fd < 0){ if(fd == -EAGAIN) - return; + return IRQ_NONE; printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n", -fd); @@ -65,6 +66,7 @@ static void pipe_interrupt(int irq, void list_add(&conn->list, &conn->port->connections); up(&conn->port->sem); + return IRQ_HANDLED; } static int port_accept(struct port_list *port) @@ -138,12 +140,13 @@ void port_work_proc(void *unused) DECLARE_WORK(port_work, port_work_proc, NULL); -static void port_interrupt(int irq, void *data, struct pt_regs *regs) +static irqreturn_t port_interrupt(int irq, void *data, struct pt_regs *regs) { struct port_list *port = data; port->has_connection = 1; schedule_work(&port_work); + return IRQ_HANDLED; } void *port_data(int port_num) diff -puN arch/um/drivers/ubd_kern.c~irqreturn-uml arch/um/drivers/ubd_kern.c --- 25/arch/um/drivers/ubd_kern.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/drivers/ubd_kern.c 2003-04-24 05:17:10.000000000 -0700 @@ -18,6 +18,7 @@ #include "linux/blk.h" #include "linux/blkdev.h" #include "linux/hdreg.h" +#include "linux/interrupt.h" #include "linux/init.h" #include "linux/devfs_fs_kernel.h" #include "linux/cdrom.h" @@ -395,9 +396,10 @@ static void ubd_handler(void) do_ubd_request(&ubd_queue); } -static void ubd_intr(int irq, void *dev, struct pt_regs *unused) +static irqreturn_t ubd_intr(int irq, void *dev, struct pt_regs *unused) { ubd_handler(); + return IRQ_HANDLED; } /* Only changed by ubd_init, which is an initcall. */ diff -puN arch/um/drivers/xterm_kern.c~irqreturn-uml arch/um/drivers/xterm_kern.c --- 25/arch/um/drivers/xterm_kern.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/drivers/xterm_kern.c 2003-04-24 05:17:10.000000000 -0700 @@ -6,7 +6,7 @@ #include "linux/errno.h" #include "linux/slab.h" #include "asm/semaphore.h" -#include "asm/irq.h" +#include "linux/interrupt.h" #include "irq_user.h" #include "kern_util.h" #include "os.h" @@ -19,17 +19,18 @@ struct xterm_wait { int new_fd; }; -static void xterm_interrupt(int irq, void *data, struct pt_regs *regs) +static irqreturn_t xterm_interrupt(int irq, void *data, struct pt_regs *regs) { struct xterm_wait *xterm = data; int fd; fd = os_rcv_fd(xterm->fd, &xterm->pid); if(fd == -EAGAIN) - return; + return IRQ_NONE; xterm->new_fd = fd; up(&xterm->sem); + return IRQ_HANDLED; } int xterm_fd(int socket, int *pid_out) diff -puN arch/um/include/line.h~irqreturn-uml arch/um/include/line.h --- 25/arch/um/include/line.h~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/include/line.h 2003-04-24 05:17:10.000000000 -0700 @@ -9,6 +9,7 @@ #include "linux/list.h" #include "linux/workqueue.h" #include "linux/tty.h" +#include "linux/interrupt.h" #include "asm/semaphore.h" #include "chan_user.h" #include "mconsole_kern.h" @@ -67,8 +68,8 @@ struct lines { #define LINES_INIT(n) { num : n } -extern void line_interrupt(int irq, void *data, struct pt_regs *unused); -extern void line_write_interrupt(int irq, void *data, struct pt_regs *unused); +extern irqreturn_t line_interrupt(int irq, void *data, struct pt_regs *unused); +extern irqreturn_t line_write_interrupt(int irq, void *data, struct pt_regs *unused); extern void line_close(struct line *lines, struct tty_struct *tty); extern int line_open(struct line *lines, struct tty_struct *tty, struct chan_opts *opts); diff -puN arch/um/kernel/irq.c~irqreturn-uml arch/um/kernel/irq.c --- 25/arch/um/kernel/irq.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/kernel/irq.c 2003-04-24 05:17:10.000000000 -0700 @@ -380,7 +380,7 @@ out: */ int request_irq(unsigned int irq, - void (*handler)(int, void *, struct pt_regs *), + irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, void *dev_id) @@ -426,7 +426,7 @@ int request_irq(unsigned int irq, } int um_request_irq(unsigned int irq, int fd, int type, - void (*handler)(int, void *, struct pt_regs *), + irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, void *dev_id) { diff -puN arch/um/kernel/sigio_kern.c~irqreturn-uml arch/um/kernel/sigio_kern.c --- 25/arch/um/kernel/sigio_kern.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/kernel/sigio_kern.c 2003-04-24 05:17:10.000000000 -0700 @@ -6,7 +6,8 @@ #include "linux/kernel.h" #include "linux/list.h" #include "linux/slab.h" -#include "asm/irq.h" +#include "linux/signal.h" +#include "linux/interrupt.h" #include "init.h" #include "sigio.h" #include "irq_user.h" @@ -14,10 +15,11 @@ /* Protected by sigio_lock() called from write_sigio_workaround */ static int sigio_irq_fd = -1; -void sigio_interrupt(int irq, void *data, struct pt_regs *unused) +irqreturn_t sigio_interrupt(int irq, void *data, struct pt_regs *unused) { read_sigio_fd(sigio_irq_fd); reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ); + return IRQ_HANDLED; } int write_sigio_irq(int fd) diff -puN arch/um/kernel/time_kern.c~irqreturn-uml arch/um/kernel/time_kern.c --- 25/arch/um/kernel/time_kern.c~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/arch/um/kernel/time_kern.c 2003-04-24 05:17:10.000000000 -0700 @@ -55,12 +55,13 @@ void boot_timer_handler(int sig) do_timer(®s); } -void um_timer(int irq, void *dev, struct pt_regs *regs) +irqreturn_t um_timer(int irq, void *dev, struct pt_regs *regs) { do_timer(regs); write_seqlock(&xtime_lock); timer(); write_sequnlock(&xtime_lock); + return IRQ_HANDLED; } long um_time(int * tloc) diff -puN include/asm-um/irq.h~irqreturn-uml include/asm-um/irq.h --- 25/include/asm-um/irq.h~irqreturn-uml 2003-04-24 05:17:10.000000000 -0700 +++ 25-akpm/include/asm-um/irq.h 2003-04-24 05:17:10.000000000 -0700 @@ -6,6 +6,8 @@ */ struct task_struct; +struct irqreturn; + #include "asm/ptrace.h" #undef NR_IRQS @@ -29,7 +31,7 @@ struct task_struct; #define NR_IRQS (LAST_IRQ + 1) extern int um_request_irq(unsigned int irq, int fd, int type, - void (*handler)(int, void *, struct pt_regs *), + struct irqreturn (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, void *dev_id); #endif _