mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
xen/netback: fix spurious event detection for common event case
[ Upstream commita3daf3d391
] 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:23025393db
("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>
This commit is contained in:
parent
5c54aaed07
commit
fef6f594ea
1 changed files with 5 additions and 3 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue