xen/events: switch user event channels to lateeoi model
authorJuergen Gross <jgross@suse.com>
Mon, 7 Sep 2020 13:47:29 +0000 (15:47 +0200)
committerJuergen Gross <jgross@suse.com>
Tue, 20 Oct 2020 08:22:11 +0000 (10:22 +0200)
Instead of disabling the irq when an event is received and enabling
it again when handled by the user process use the lateeoi model.

This is part of XSA-332.

Cc: stable@vger.kernel.org
Reported-by: Julien Grall <julien@xen.org>
Signed-off-by: Juergen Gross <jgross@suse.com>
Tested-by: Stefano Stabellini <sstabellini@kernel.org>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Wei Liu <wl@xen.org>
drivers/xen/evtchn.c

index 6e0b1dd..5dc016d 100644 (file)
@@ -167,7 +167,6 @@ static irqreturn_t evtchn_interrupt(int irq, void *data)
             "Interrupt for port %u, but apparently not enabled; per-user %p\n",
             evtchn->port, u);
 
-       disable_irq_nosync(irq);
        evtchn->enabled = false;
 
        spin_lock(&u->ring_prod_lock);
@@ -293,7 +292,7 @@ static ssize_t evtchn_write(struct file *file, const char __user *buf,
                evtchn = find_evtchn(u, port);
                if (evtchn && !evtchn->enabled) {
                        evtchn->enabled = true;
-                       enable_irq(irq_from_evtchn(port));
+                       xen_irq_lateeoi(irq_from_evtchn(port), 0);
                }
        }
 
@@ -393,8 +392,8 @@ static int evtchn_bind_to_user(struct per_user_data *u, evtchn_port_t port)
        if (rc < 0)
                goto err;
 
-       rc = bind_evtchn_to_irqhandler(port, evtchn_interrupt, 0,
-                                      u->name, evtchn);
+       rc = bind_evtchn_to_irqhandler_lateeoi(port, evtchn_interrupt, 0,
+                                              u->name, evtchn);
        if (rc < 0)
                goto err;