Commit a3daf3d3 authored by Juergen Gross's avatar Juergen Gross Committed by David S. Miller

xen/netback: fix spurious event detection for common event case

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: 23025393 ("xen/netback: use lateeoi irq binding")
Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
Reviewed-by: default avatarJan Beulich <jbeulich@suse.com>
Reviewed-by: default avatarPaul Durrant <paul@xen.org>
Reviewed-by: default avatarWei Liu <wl@xen.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6f199552
...@@ -162,13 +162,15 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id) ...@@ -162,13 +162,15 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id)
{ {
struct xenvif_queue *queue = dev_id; struct xenvif_queue *queue = dev_id;
int old; int old;
bool has_rx, has_tx;
old = atomic_fetch_or(NETBK_COMMON_EOI, &queue->eoi_pending); old = atomic_fetch_or(NETBK_COMMON_EOI, &queue->eoi_pending);
WARN(old, "Interrupt while EOI pending\n"); WARN(old, "Interrupt while EOI pending\n");
/* Use bitwise or as we need to call both functions. */ has_tx = xenvif_handle_tx_interrupt(queue);
if ((!xenvif_handle_tx_interrupt(queue) | has_rx = xenvif_handle_rx_interrupt(queue);
!xenvif_handle_rx_interrupt(queue))) {
if (!has_rx && !has_tx) {
atomic_andnot(NETBK_COMMON_EOI, &queue->eoi_pending); atomic_andnot(NETBK_COMMON_EOI, &queue->eoi_pending);
xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS); xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment