From 2ee375a6e7f1659ba9f444600e5c940ebdec528c Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 14 Aug 2015 10:25:33 -0700 Subject: [PATCH] remove 4.1 xen-events-fifo-handle-linked-events-when-closing-a-port.patch --- queue-4.1/series | 1 - ...le-linked-events-when-closing-a-port.patch | 198 ------------------ 2 files changed, 199 deletions(-) delete mode 100644 queue-4.1/xen-events-fifo-handle-linked-events-when-closing-a-port.patch diff --git a/queue-4.1/series b/queue-4.1/series index d137b1d3e51..e033ab47fa8 100644 --- a/queue-4.1/series +++ b/queue-4.1/series @@ -49,7 +49,6 @@ asoc-dapm-lock-during-userspace-access.patch asoc-dapm-don-t-add-prefix-to-widget-stream-name.patch x86-xen-probe-target-addresses-in-set_aliased_prot-before-the-hypercall.patch xen-gntdevt-fix-race-condition-in-gntdev_release.patch -xen-events-fifo-handle-linked-events-when-closing-a-port.patch hwrng-core-correct-error-check-of-kthread_run-call.patch crypto-qat-fix-invalid-synchronization-between-register-unregister-sym-algs.patch crypto-ixp4xx-remove-bogus-bug_on-on-scattered-dst-buffer.patch diff --git a/queue-4.1/xen-events-fifo-handle-linked-events-when-closing-a-port.patch b/queue-4.1/xen-events-fifo-handle-linked-events-when-closing-a-port.patch deleted file mode 100644 index daa7f50e35a..00000000000 --- a/queue-4.1/xen-events-fifo-handle-linked-events-when-closing-a-port.patch +++ /dev/null @@ -1,198 +0,0 @@ -From fcdf31a7c162de0c93a2bee51df4688ab0a348f8 Mon Sep 17 00:00:00 2001 -From: Ross Lagerwall -Date: Fri, 31 Jul 2015 14:30:42 +0100 -Subject: xen/events/fifo: Handle linked events when closing a port - -From: Ross Lagerwall - -commit fcdf31a7c162de0c93a2bee51df4688ab0a348f8 upstream. - -An event channel bound to a CPU that was offlined may still be linked -on that CPU's queue. If this event channel is closed and reused, -subsequent events will be lost because the event channel is never -unlinked and thus cannot be linked onto the correct queue. - -When a channel is closed and the event is still linked into a queue, -ensure that it is unlinked before completing. - -If the CPU to which the event channel bound is online, spin until the -event is handled by that CPU. If that CPU is offline, it can't handle -the event, so clear the event queue during the close, dropping the -events. - -This fixes the missing interrupts (and subsequent disk stalls etc.) -when offlining a CPU. - -Signed-off-by: Ross Lagerwall -Signed-off-by: David Vrabel -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/xen/events/events_base.c | 10 ++++--- - drivers/xen/events/events_fifo.c | 45 +++++++++++++++++++++++++++++++---- - drivers/xen/events/events_internal.h | 7 +++++ - 3 files changed, 53 insertions(+), 9 deletions(-) - ---- a/drivers/xen/events/events_base.c -+++ b/drivers/xen/events/events_base.c -@@ -452,10 +452,12 @@ static void xen_free_irq(unsigned irq) - irq_free_desc(irq); - } - --static void xen_evtchn_close(unsigned int port) -+static void xen_evtchn_close(unsigned int port, unsigned int cpu) - { - struct evtchn_close close; - -+ xen_evtchn_op_close(port, cpu); -+ - close.port = port; - if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0) - BUG(); -@@ -544,7 +546,7 @@ out: - - err: - pr_err("irq%d: Failed to set port to irq mapping (%d)\n", irq, rc); -- xen_evtchn_close(evtchn); -+ xen_evtchn_close(evtchn, NR_CPUS); - return 0; - } - -@@ -565,7 +567,7 @@ static void shutdown_pirq(struct irq_dat - return; - - mask_evtchn(evtchn); -- xen_evtchn_close(evtchn); -+ xen_evtchn_close(evtchn, cpu_from_evtchn(evtchn)); - xen_irq_info_cleanup(info); - } - -@@ -609,7 +611,7 @@ static void __unbind_from_irq(unsigned i - if (VALID_EVTCHN(evtchn)) { - unsigned int cpu = cpu_from_irq(irq); - -- xen_evtchn_close(evtchn); -+ xen_evtchn_close(evtchn, cpu); - - switch (type_from_irq(irq)) { - case IRQT_VIRQ: ---- a/drivers/xen/events/events_fifo.c -+++ b/drivers/xen/events/events_fifo.c -@@ -255,6 +255,12 @@ static void evtchn_fifo_unmask(unsigned - } - } - -+static bool evtchn_fifo_is_linked(unsigned port) -+{ -+ event_word_t *word = event_word_from_port(port); -+ return sync_test_bit(EVTCHN_FIFO_BIT(LINKED, word), BM(word)); -+} -+ - static uint32_t clear_linked(volatile event_word_t *word) - { - event_word_t new, old, w; -@@ -281,7 +287,8 @@ static void handle_irq_for_port(unsigned - - static void consume_one_event(unsigned cpu, - struct evtchn_fifo_control_block *control_block, -- unsigned priority, unsigned long *ready) -+ unsigned priority, unsigned long *ready, -+ bool drop) - { - struct evtchn_fifo_queue *q = &per_cpu(cpu_queue, cpu); - uint32_t head; -@@ -313,13 +320,15 @@ static void consume_one_event(unsigned c - if (head == 0) - clear_bit(priority, ready); - -- if (evtchn_fifo_is_pending(port) && !evtchn_fifo_is_masked(port)) -- handle_irq_for_port(port); -+ if (evtchn_fifo_is_pending(port) && !evtchn_fifo_is_masked(port)) { -+ if (likely(!drop)) -+ handle_irq_for_port(port); -+ } - - q->head[priority] = head; - } - --static void evtchn_fifo_handle_events(unsigned cpu) -+static void __evtchn_fifo_handle_events(unsigned cpu, bool drop) - { - struct evtchn_fifo_control_block *control_block; - unsigned long ready; -@@ -331,11 +340,16 @@ static void evtchn_fifo_handle_events(un - - while (ready) { - q = find_first_bit(&ready, EVTCHN_FIFO_MAX_QUEUES); -- consume_one_event(cpu, control_block, q, &ready); -+ consume_one_event(cpu, control_block, q, &ready, drop); - ready |= xchg(&control_block->ready, 0); - } - } - -+static void evtchn_fifo_handle_events(unsigned cpu) -+{ -+ __evtchn_fifo_handle_events(cpu, false); -+} -+ - static void evtchn_fifo_resume(void) - { - unsigned cpu; -@@ -371,6 +385,26 @@ static void evtchn_fifo_resume(void) - event_array_pages = 0; - } - -+static void evtchn_fifo_close(unsigned port, unsigned int cpu) -+{ -+ if (cpu == NR_CPUS) -+ return; -+ -+ get_online_cpus(); -+ if (cpu_online(cpu)) { -+ if (WARN_ON(irqs_disabled())) -+ goto out; -+ -+ while (evtchn_fifo_is_linked(port)) -+ cpu_relax(); -+ } else { -+ __evtchn_fifo_handle_events(cpu, true); -+ } -+ -+out: -+ put_online_cpus(); -+} -+ - static const struct evtchn_ops evtchn_ops_fifo = { - .max_channels = evtchn_fifo_max_channels, - .nr_channels = evtchn_fifo_nr_channels, -@@ -384,6 +418,7 @@ static const struct evtchn_ops evtchn_op - .unmask = evtchn_fifo_unmask, - .handle_events = evtchn_fifo_handle_events, - .resume = evtchn_fifo_resume, -+ .close = evtchn_fifo_close, - }; - - static int evtchn_fifo_alloc_control_block(unsigned cpu) ---- a/drivers/xen/events/events_internal.h -+++ b/drivers/xen/events/events_internal.h -@@ -68,6 +68,7 @@ struct evtchn_ops { - bool (*test_and_set_mask)(unsigned port); - void (*mask)(unsigned port); - void (*unmask)(unsigned port); -+ void (*close)(unsigned port, unsigned cpu); - - void (*handle_events)(unsigned cpu); - void (*resume)(void); -@@ -145,6 +146,12 @@ static inline void xen_evtchn_resume(voi - evtchn_ops->resume(); - } - -+static inline void xen_evtchn_op_close(unsigned port, unsigned cpu) -+{ -+ if (evtchn_ops->close) -+ return evtchn_ops->close(port, cpu); -+} -+ - void xen_evtchn_2l_init(void); - int xen_evtchn_fifo_init(void); - -- 2.47.2