um: Remove IRQ_NONE type
authorJohannes Berg <johannes.berg@intel.com>
Wed, 2 Dec 2020 11:59:55 +0000 (12:59 +0100)
committerRichard Weinberger <richard@nod.at>
Sun, 13 Dec 2020 21:22:29 +0000 (22:22 +0100)
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.

Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/drivers/random.c
arch/um/drivers/virtio_uml.c
arch/um/include/shared/irq_kern.h
arch/um/include/shared/irq_user.h
arch/um/include/shared/os.h
arch/um/kernel/irq.c
arch/um/os-Linux/irq.c
arch/um/os-Linux/sigio.c

index bd3059a..433a3f8 100644 (file)
@@ -79,7 +79,7 @@ static int __init rng_init (void)
        if (err < 0)
                goto err_out_cleanup_hw;
 
-       sigio_broken(random_fd, 1);
+       sigio_broken(random_fd);
        hwrng.name = RNG_MODULE_NAME;
        hwrng.read = rng_dev_read;
        hwrng.quality = 1024;
index 94b1127..27e92d3 100644 (file)
 #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) \
index 7c04a0f..7807de5 100644 (file)
@@ -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
index 5e975a9..07239e8 100644 (file)
@@ -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);
index f467d28..e2bb7e4 100644 (file)
@@ -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);
index 93eb742..9e8f776 100644 (file)
@@ -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;
 
index d508310..aa90a05 100644 (file)
@@ -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;
index f91fd16..79cd6d6 100644 (file)
@@ -338,7 +338,7 @@ out_close1:
        close(l_write_sigio_fds[1]);
 }
 
-void sigio_broken(int fd, int read)
+void sigio_broken(int fd)
 {
        int err;
 
@@ -354,7 +354,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();
@@ -362,17 +362,16 @@ out:
 
 /* 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)
@@ -516,19 +515,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) &&
@@ -538,7 +524,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 */