xen/netback: fix spurious event detection for common event case
authorJuergen Gross <jgross@suse.com>
Thu, 11 Feb 2021 10:16:12 +0000 (11:16 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Feb 2021 22:47:00 +0000 (14:47 -0800)
In case of a common event for rx and tx queue the event should be
regarded to be spurious if no rx and no tx requests are pending.

Unfortunately the condition for testing that is wrong causing to
decide a event being spurious if no rx OR no tx requests are
pending.

Fix that plus using local variables for rx/tx pending indicators in
order to split function calls and if condition.

Fixes: 23025393dbeb3b ("xen/netback: use lateeoi irq binding")
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Paul Durrant <paul@xen.org>
Reviewed-by: Wei Liu <wl@xen.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/xen-netback/interface.c

index 08b0e3d0b7eb77acf3b886d50eeee424b44a2275..8e36542fe24dd524603081eb9859cdbf86b21d44 100644 (file)
@@ -162,13 +162,15 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id)
 {
        struct xenvif_queue *queue = dev_id;
        int old;
+       bool has_rx, has_tx;
 
        old = atomic_fetch_or(NETBK_COMMON_EOI, &queue->eoi_pending);
        WARN(old, "Interrupt while EOI pending\n");
 
-       /* Use bitwise or as we need to call both functions. */
-       if ((!xenvif_handle_tx_interrupt(queue) |
-            !xenvif_handle_rx_interrupt(queue))) {
+       has_tx = xenvif_handle_tx_interrupt(queue);
+       has_rx = xenvif_handle_rx_interrupt(queue);
+
+       if (!has_rx && !has_tx) {
                atomic_andnot(NETBK_COMMON_EOI, &queue->eoi_pending);
                xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS);
        }