Message ID | 20201123205446.25ab707e972c.Id467f02803b7fb8edf0255d7588e63a01ca9c1e8@changeid |
---|---|
State | Changes Requested |
Headers | show |
Series | [1/7] um: support dynamic IRQ allocation | expand |
On 23/11/2020 19:56, Johannes Berg wrote: > From: Johannes Berg <johannes.berg@intel.com> > > We don't actually use this in um_request_irq(), so it can > never be assigned. It's also not clear what that would be > useful for, so just remove it. > > This results in quite a number of cleanups, all the way to > removing the "SIGIO on close" startup check, since the data > it assigns (pty_close_sigio) is not used anymore. > > While at it, also make this an enum so we get a minimum of > type checking, and remove the IRQ_NONE hack in virtio since > we now no longer have the name twice. > > Signed-off-by: Johannes Berg <johannes.berg@intel.com> > --- > arch/um/drivers/random.c | 2 +- > arch/um/drivers/virtio_uml.c | 5 ----- > arch/um/include/shared/irq_kern.h | 7 ++++--- > arch/um/include/shared/irq_user.h | 9 +++++---- > arch/um/include/shared/os.h | 6 +++--- > arch/um/kernel/irq.c | 15 +++++++-------- > arch/um/os-Linux/irq.c | 2 +- > arch/um/os-Linux/sigio.c | 25 +++++-------------------- > 8 files changed, 26 insertions(+), 45 deletions(-) > > diff --git a/arch/um/drivers/random.c b/arch/um/drivers/random.c > index 385cb08d7ec2..efbf88ec48ac 100644 > --- a/arch/um/drivers/random.c > +++ b/arch/um/drivers/random.c > @@ -132,7 +132,7 @@ static int __init rng_init (void) > if (err < 0) > goto err_out_cleanup_hw; > > - sigio_broken(random_fd, 1); > + sigio_broken(random_fd); > > err = misc_register (&rng_miscdev); > if (err) { > diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c > index 94b112749d5b..27e92d3881ff 100644 > --- a/arch/um/drivers/virtio_uml.c > +++ b/arch/um/drivers/virtio_uml.c > @@ -33,11 +33,6 @@ > #include <os.h> > #include "vhost_user.h" > > -/* Workaround due to a conflict between irq_user.h and irqreturn.h */ > -#ifdef IRQ_NONE > -#undef IRQ_NONE > -#endif > - > #define MAX_SUPPORTED_QUEUE_SIZE 256 > > #define to_virtio_uml_device(_vdev) \ > diff --git a/arch/um/include/shared/irq_kern.h b/arch/um/include/shared/irq_kern.h > index 7c04a0fd3a27..7807de593bda 100644 > --- a/arch/um/include/shared/irq_kern.h > +++ b/arch/um/include/shared/irq_kern.h > @@ -8,11 +8,12 @@ > > #include <linux/interrupt.h> > #include <asm/ptrace.h> > +#include "irq_user.h" > > #define UM_IRQ_ALLOC -1 > > -int um_request_irq(int irq, int fd, int type, irq_handler_t handler, > - unsigned long irqflags, const char * devname, > - void *dev_id); > +int um_request_irq(int irq, int fd, enum um_irq_type type, > + irq_handler_t handler, unsigned long irqflags, > + const char *devname, void *dev_id); > void um_free_irq(int irq, void *dev_id); > #endif > diff --git a/arch/um/include/shared/irq_user.h b/arch/um/include/shared/irq_user.h > index 5e975a9e8354..07239e801a5b 100644 > --- a/arch/um/include/shared/irq_user.h > +++ b/arch/um/include/shared/irq_user.h > @@ -9,10 +9,11 @@ > #include <sysdep/ptrace.h> > #include <stdbool.h> > > -#define IRQ_READ 0 > -#define IRQ_WRITE 1 > -#define IRQ_NONE 2 > -#define NUM_IRQ_TYPES (IRQ_NONE + 1) > +enum um_irq_type { > + IRQ_READ, > + IRQ_WRITE, > + NUM_IRQ_TYPES, > +}; > > struct siginfo; > extern void sigio_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs); > diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h > index f467d28fc0b4..e2bb7e488d59 100644 > --- a/arch/um/include/shared/os.h > +++ b/arch/um/include/shared/os.h > @@ -299,7 +299,7 @@ extern void reboot_skas(void); > extern int os_waiting_for_events_epoll(void); > extern void *os_epoll_get_data_pointer(int index); > extern int os_epoll_triggered(int index, int events); > -extern int os_event_mask(int irq_type); > +extern int os_event_mask(enum um_irq_type irq_type); > extern int os_setup_epoll(void); > extern int os_add_epoll_fd(int events, int fd, void *data); > extern int os_mod_epoll_fd(int events, int fd, void *data); > @@ -310,8 +310,8 @@ extern void os_close_epoll_fd(void); > /* sigio.c */ > extern int add_sigio_fd(int fd); > extern int ignore_sigio_fd(int fd); > -extern void maybe_sigio_broken(int fd, int read); > -extern void sigio_broken(int fd, int read); > +extern void maybe_sigio_broken(int fd); > +extern void sigio_broken(int fd); > > /* prctl.c */ > extern int os_arch_prctl(int pid, int option, unsigned long *arg2); > diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c > index 93eb742ecafe..9e8f776bb43a 100644 > --- a/arch/um/kernel/irq.c > +++ b/arch/um/kernel/irq.c > @@ -32,7 +32,7 @@ extern void free_irqs(void); > > struct irq_reg { > void *id; > - int type; > + enum um_irq_type type; > int irq; > int events; > bool active; > @@ -96,7 +96,7 @@ void sigio_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs) > } > > for (i = 0; i < n ; i++) { > - /* Epoll back reference is the entry with 3 irq_reg > + /* Epoll back reference is the entry with 2 irq_reg > * leaves - one for each irq type. > */ > irq_entry = (struct irq_entry *) > @@ -139,7 +139,7 @@ static int assign_epoll_events_to_irq(struct irq_entry *irq_entry) > > > > -static int activate_fd(int irq, int fd, int type, void *dev_id) > +static int activate_fd(int irq, int fd, enum um_irq_type type, void *dev_id) > { > struct irq_reg *new_fd; > struct irq_entry *irq_entry; > @@ -217,7 +217,7 @@ static int activate_fd(int irq, int fd, int type, void *dev_id) > /* Turn back IO on with the correct (new) IO event mask */ > assign_epoll_events_to_irq(irq_entry); > spin_unlock_irqrestore(&irq_lock, flags); > - maybe_sigio_broken(fd, (type != IRQ_NONE)); > + maybe_sigio_broken(fd); > > return 0; > out_unlock: > @@ -444,10 +444,9 @@ void um_free_irq(int irq, void *dev) > } > EXPORT_SYMBOL(um_free_irq); > > -int um_request_irq(int irq, int fd, int type, > - irq_handler_t handler, > - unsigned long irqflags, const char * devname, > - void *dev_id) > +int um_request_irq(int irq, int fd, enum um_irq_type type, > + irq_handler_t handler, unsigned long irqflags, > + const char *devname, void *dev_id) > { > int err; > > diff --git a/arch/um/os-Linux/irq.c b/arch/um/os-Linux/irq.c > index d508310ee5e1..aa90a05b3d78 100644 > --- a/arch/um/os-Linux/irq.c > +++ b/arch/um/os-Linux/irq.c > @@ -45,7 +45,7 @@ int os_epoll_triggered(int index, int events) > * access to the right includes/defines for EPOLL constants. > */ > > -int os_event_mask(int irq_type) > +int os_event_mask(enum um_irq_type irq_type) > { > if (irq_type == IRQ_READ) > return EPOLLIN | EPOLLPRI; > diff --git a/arch/um/os-Linux/sigio.c b/arch/um/os-Linux/sigio.c > index 75558080d0bf..233b2b2212f1 100644 > --- a/arch/um/os-Linux/sigio.c > +++ b/arch/um/os-Linux/sigio.c > @@ -336,7 +336,7 @@ static void write_sigio_workaround(void) > close(l_write_sigio_fds[1]); > } > > -void sigio_broken(int fd, int read) > +void sigio_broken(int fd) > { > int err; > > @@ -352,7 +352,7 @@ void sigio_broken(int fd, int read) > > all_sigio_fds.poll[all_sigio_fds.used++] = > ((struct pollfd) { .fd = fd, > - .events = read ? POLLIN : POLLOUT, > + .events = POLLIN, > .revents = 0 }); > out: > sigio_unlock(); > @@ -360,17 +360,16 @@ void sigio_broken(int fd, int read) > > /* Changed during early boot */ > static int pty_output_sigio; > -static int pty_close_sigio; > > -void maybe_sigio_broken(int fd, int read) > +void maybe_sigio_broken(int fd) > { > if (!isatty(fd)) > return; > > - if ((read || pty_output_sigio) && (!read || pty_close_sigio)) > + if (pty_output_sigio) > return; > > - sigio_broken(fd, read); > + sigio_broken(fd); > } > > static void sigio_cleanup(void) > @@ -514,19 +513,6 @@ static void tty_output(int master, int slave) > printk(UM_KERN_CONT "tty_output : read failed, err = %d\n", n); > } > > -static void tty_close(int master, int slave) > -{ > - printk(UM_KERN_INFO "Checking that host ptys support SIGIO on " > - "close..."); > - > - close(slave); > - if (got_sigio) { > - printk(UM_KERN_CONT "Yes\n"); > - pty_close_sigio = 1; > - } else > - printk(UM_KERN_CONT "No, enabling workaround\n"); > -} > - > static void __init check_sigio(void) > { > if ((access("/dev/ptmx", R_OK) < 0) && > @@ -536,7 +522,6 @@ static void __init check_sigio(void) > return; > } > check_one_sigio(tty_output); > - check_one_sigio(tty_close); > } > > /* Here because it only does the SIGIO testing for now */ > Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com>
diff --git a/arch/um/drivers/random.c b/arch/um/drivers/random.c index 385cb08d7ec2..efbf88ec48ac 100644 --- a/arch/um/drivers/random.c +++ b/arch/um/drivers/random.c @@ -132,7 +132,7 @@ static int __init rng_init (void) if (err < 0) goto err_out_cleanup_hw; - sigio_broken(random_fd, 1); + sigio_broken(random_fd); err = misc_register (&rng_miscdev); if (err) { diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c index 94b112749d5b..27e92d3881ff 100644 --- a/arch/um/drivers/virtio_uml.c +++ b/arch/um/drivers/virtio_uml.c @@ -33,11 +33,6 @@ #include <os.h> #include "vhost_user.h" -/* Workaround due to a conflict between irq_user.h and irqreturn.h */ -#ifdef IRQ_NONE -#undef IRQ_NONE -#endif - #define MAX_SUPPORTED_QUEUE_SIZE 256 #define to_virtio_uml_device(_vdev) \ diff --git a/arch/um/include/shared/irq_kern.h b/arch/um/include/shared/irq_kern.h index 7c04a0fd3a27..7807de593bda 100644 --- a/arch/um/include/shared/irq_kern.h +++ b/arch/um/include/shared/irq_kern.h @@ -8,11 +8,12 @@ #include <linux/interrupt.h> #include <asm/ptrace.h> +#include "irq_user.h" #define UM_IRQ_ALLOC -1 -int um_request_irq(int irq, int fd, int type, irq_handler_t handler, - unsigned long irqflags, const char * devname, - void *dev_id); +int um_request_irq(int irq, int fd, enum um_irq_type type, + irq_handler_t handler, unsigned long irqflags, + const char *devname, void *dev_id); void um_free_irq(int irq, void *dev_id); #endif diff --git a/arch/um/include/shared/irq_user.h b/arch/um/include/shared/irq_user.h index 5e975a9e8354..07239e801a5b 100644 --- a/arch/um/include/shared/irq_user.h +++ b/arch/um/include/shared/irq_user.h @@ -9,10 +9,11 @@ #include <sysdep/ptrace.h> #include <stdbool.h> -#define IRQ_READ 0 -#define IRQ_WRITE 1 -#define IRQ_NONE 2 -#define NUM_IRQ_TYPES (IRQ_NONE + 1) +enum um_irq_type { + IRQ_READ, + IRQ_WRITE, + NUM_IRQ_TYPES, +}; struct siginfo; extern void sigio_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs); diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index f467d28fc0b4..e2bb7e488d59 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -299,7 +299,7 @@ extern void reboot_skas(void); extern int os_waiting_for_events_epoll(void); extern void *os_epoll_get_data_pointer(int index); extern int os_epoll_triggered(int index, int events); -extern int os_event_mask(int irq_type); +extern int os_event_mask(enum um_irq_type irq_type); extern int os_setup_epoll(void); extern int os_add_epoll_fd(int events, int fd, void *data); extern int os_mod_epoll_fd(int events, int fd, void *data); @@ -310,8 +310,8 @@ extern void os_close_epoll_fd(void); /* sigio.c */ extern int add_sigio_fd(int fd); extern int ignore_sigio_fd(int fd); -extern void maybe_sigio_broken(int fd, int read); -extern void sigio_broken(int fd, int read); +extern void maybe_sigio_broken(int fd); +extern void sigio_broken(int fd); /* prctl.c */ extern int os_arch_prctl(int pid, int option, unsigned long *arg2); diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 93eb742ecafe..9e8f776bb43a 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c @@ -32,7 +32,7 @@ extern void free_irqs(void); struct irq_reg { void *id; - int type; + enum um_irq_type type; int irq; int events; bool active; @@ -96,7 +96,7 @@ void sigio_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs) } for (i = 0; i < n ; i++) { - /* Epoll back reference is the entry with 3 irq_reg + /* Epoll back reference is the entry with 2 irq_reg * leaves - one for each irq type. */ irq_entry = (struct irq_entry *) @@ -139,7 +139,7 @@ static int assign_epoll_events_to_irq(struct irq_entry *irq_entry) -static int activate_fd(int irq, int fd, int type, void *dev_id) +static int activate_fd(int irq, int fd, enum um_irq_type type, void *dev_id) { struct irq_reg *new_fd; struct irq_entry *irq_entry; @@ -217,7 +217,7 @@ static int activate_fd(int irq, int fd, int type, void *dev_id) /* Turn back IO on with the correct (new) IO event mask */ assign_epoll_events_to_irq(irq_entry); spin_unlock_irqrestore(&irq_lock, flags); - maybe_sigio_broken(fd, (type != IRQ_NONE)); + maybe_sigio_broken(fd); return 0; out_unlock: @@ -444,10 +444,9 @@ void um_free_irq(int irq, void *dev) } EXPORT_SYMBOL(um_free_irq); -int um_request_irq(int irq, int fd, int type, - irq_handler_t handler, - unsigned long irqflags, const char * devname, - void *dev_id) +int um_request_irq(int irq, int fd, enum um_irq_type type, + irq_handler_t handler, unsigned long irqflags, + const char *devname, void *dev_id) { int err; diff --git a/arch/um/os-Linux/irq.c b/arch/um/os-Linux/irq.c index d508310ee5e1..aa90a05b3d78 100644 --- a/arch/um/os-Linux/irq.c +++ b/arch/um/os-Linux/irq.c @@ -45,7 +45,7 @@ int os_epoll_triggered(int index, int events) * access to the right includes/defines for EPOLL constants. */ -int os_event_mask(int irq_type) +int os_event_mask(enum um_irq_type irq_type) { if (irq_type == IRQ_READ) return EPOLLIN | EPOLLPRI; diff --git a/arch/um/os-Linux/sigio.c b/arch/um/os-Linux/sigio.c index 75558080d0bf..233b2b2212f1 100644 --- a/arch/um/os-Linux/sigio.c +++ b/arch/um/os-Linux/sigio.c @@ -336,7 +336,7 @@ static void write_sigio_workaround(void) close(l_write_sigio_fds[1]); } -void sigio_broken(int fd, int read) +void sigio_broken(int fd) { int err; @@ -352,7 +352,7 @@ void sigio_broken(int fd, int read) all_sigio_fds.poll[all_sigio_fds.used++] = ((struct pollfd) { .fd = fd, - .events = read ? POLLIN : POLLOUT, + .events = POLLIN, .revents = 0 }); out: sigio_unlock(); @@ -360,17 +360,16 @@ void sigio_broken(int fd, int read) /* Changed during early boot */ static int pty_output_sigio; -static int pty_close_sigio; -void maybe_sigio_broken(int fd, int read) +void maybe_sigio_broken(int fd) { if (!isatty(fd)) return; - if ((read || pty_output_sigio) && (!read || pty_close_sigio)) + if (pty_output_sigio) return; - sigio_broken(fd, read); + sigio_broken(fd); } static void sigio_cleanup(void) @@ -514,19 +513,6 @@ static void tty_output(int master, int slave) printk(UM_KERN_CONT "tty_output : read failed, err = %d\n", n); } -static void tty_close(int master, int slave) -{ - printk(UM_KERN_INFO "Checking that host ptys support SIGIO on " - "close..."); - - close(slave); - if (got_sigio) { - printk(UM_KERN_CONT "Yes\n"); - pty_close_sigio = 1; - } else - printk(UM_KERN_CONT "No, enabling workaround\n"); -} - static void __init check_sigio(void) { if ((access("/dev/ptmx", R_OK) < 0) && @@ -536,7 +522,6 @@ static void __init check_sigio(void) return; } check_one_sigio(tty_output); - check_one_sigio(tty_close); } /* Here because it only does the SIGIO testing for now */