| From ad55736c540fa5e9618ac85c62d9d0e1cb7c4068 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 11 Feb 2021 11:16:12 +0100 |
| Subject: xen/netback: fix spurious event detection for common event case |
| |
| From: Juergen Gross <jgross@suse.com> |
| |
| [ Upstream commit a3daf3d39132b405781be8d9ede0c449b244b64e ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/xen-netback/interface.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c |
| index 007600b7b8686..8ec25a5f1ee92 100644 |
| --- a/drivers/net/xen-netback/interface.c |
| +++ b/drivers/net/xen-netback/interface.c |
| @@ -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); |
| } |
| -- |
| 2.27.0 |
| |