From 91f01d22fdfef6d1e7f15a794067691326e4d6a2 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 8 Jul 2021 20:32:04 +0200 Subject: [PATCH] 4.4-stable patches added patches: xen-events-reset-active-flag-for-lateeoi-events-later.patch --- queue-4.4/series | 1 + ...active-flag-for-lateeoi-events-later.patch | 69 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 queue-4.4/xen-events-reset-active-flag-for-lateeoi-events-later.patch diff --git a/queue-4.4/series b/queue-4.4/series index e64b0cf3fb0..1f135223a8d 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -1,2 +1,3 @@ scsi-sr-return-appropriate-error-code-when-disk-is-e.patch drm-nouveau-fix-dma_address-check-for-cpu-gpu-sync.patch +xen-events-reset-active-flag-for-lateeoi-events-later.patch diff --git a/queue-4.4/xen-events-reset-active-flag-for-lateeoi-events-later.patch b/queue-4.4/xen-events-reset-active-flag-for-lateeoi-events-later.patch new file mode 100644 index 00000000000..c315de9bdb6 --- /dev/null +++ b/queue-4.4/xen-events-reset-active-flag-for-lateeoi-events-later.patch @@ -0,0 +1,69 @@ +From 3de218ff39b9e3f0d453fe3154f12a174de44b25 Mon Sep 17 00:00:00 2001 +From: Juergen Gross +Date: Wed, 23 Jun 2021 15:09:13 +0200 +Subject: xen/events: reset active flag for lateeoi events later + +From: Juergen Gross + +commit 3de218ff39b9e3f0d453fe3154f12a174de44b25 upstream. + +In order to avoid a race condition for user events when changing +cpu affinity reset the active flag only when EOI-ing the event. + +This is working fine as all user events are lateeoi events. Note that +lateeoi_ack_mask_dynirq() is not modified as there is no explicit call +to xen_irq_lateeoi() expected later. + +Cc: stable@vger.kernel.org +Reported-by: Julien Grall +Fixes: b6622798bc50b62 ("xen/events: avoid handling the same event on two cpus at the same time") +Tested-by: Julien Grall +Signed-off-by: Juergen Gross +Reviewed-by: Boris Ostrovsky +Link: https://lore.kernel.org/r/20210623130913.9405-1-jgross@suse.com +Signed-off-by: Juergen Gross +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/xen/events/events_base.c | 23 +++++++++++++++++++---- + 1 file changed, 19 insertions(+), 4 deletions(-) + +--- a/drivers/xen/events/events_base.c ++++ b/drivers/xen/events/events_base.c +@@ -533,6 +533,9 @@ static void xen_irq_lateeoi_locked(struc + } + + info->eoi_time = 0; ++ ++ /* is_active hasn't been reset yet, do it now. */ ++ smp_store_release(&info->is_active, 0); + do_unmask(info, EVT_MASK_REASON_EOI_PENDING); + } + +@@ -1777,10 +1780,22 @@ static void lateeoi_ack_dynirq(struct ir + struct irq_info *info = info_for_irq(data->irq); + evtchn_port_t evtchn = info ? info->evtchn : 0; + +- if (VALID_EVTCHN(evtchn)) { +- do_mask(info, EVT_MASK_REASON_EOI_PENDING); +- ack_dynirq(data); +- } ++ if (!VALID_EVTCHN(evtchn)) ++ return; ++ ++ do_mask(info, EVT_MASK_REASON_EOI_PENDING); ++ ++ if (unlikely(irqd_is_setaffinity_pending(data)) && ++ likely(!irqd_irq_disabled(data))) { ++ do_mask(info, EVT_MASK_REASON_TEMPORARY); ++ ++ clear_evtchn(evtchn); ++ ++ irq_move_masked_irq(data); ++ ++ do_unmask(info, EVT_MASK_REASON_TEMPORARY); ++ } else ++ clear_evtchn(evtchn); + } + + static void lateeoi_mask_ack_dynirq(struct irq_data *data) -- 2.47.2