linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org,
	linux-rt-users <linux-rt-users@vger.kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Carsten Emde <C.Emde@osadl.org>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	John Kacur <jkacur@redhat.com>,
	Paul Gortmaker <paul.gortmaker@windriver.com>,
	Julia Cartwright <julia@ni.com>,
	Daniel Wagner <daniel.wagner@siemens.com>,
	tom.zanussi@linux.intel.com
Subject: [PATCH RT 13/22] x86/ioapic: Dont let setaffinity unmask threaded EOI interrupt too early
Date: Wed, 05 Sep 2018 08:28:07 -0400	[thread overview]
Message-ID: <20180905122836.475141226@goodmis.org> (raw)
In-Reply-To: 20180905122754.443196118@goodmis.org

4.14.63-rt41-rc1 stable review patch.
If anyone has any objections, please let me know.

------------------

From: Thomas Gleixner <tglx@linutronix.de>

[ Upstream commit ac14002317721910204b82b9d8611dadb1cec2bb ]

There is an issue with threaded interrupts which are marked ONESHOT
and using the fasteoi handler.

    if (IS_ONESHOT())
        mask_irq();

    ....
    ....

    cond_unmask_eoi_irq()
        chip->irq_eoi();

So if setaffinity is pending then the interrupt will be moved and then
unmasked, which is wrong as it should be kept masked up to the point where
the threaded handler finished. It's not a real problem, the interrupt will
just be able to fire before the threaded handler has finished, though the irq
masked state will be wrong for a bit.

The patch below should cure the issue. It also renames the horribly
misnomed functions so it becomes clear what they are supposed to do.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
[bigeasy: add the body of the patch, use the same functions in both
          ifdef paths (spotted by Andy Shevchenko)]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 arch/x86/kernel/apic/io_apic.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 5832a9d657f2..c9af5afebc4a 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1688,20 +1688,20 @@ static bool io_apic_level_ack_pending(struct mp_chip_data *data)
 	return false;
 }
 
-static inline bool ioapic_irqd_mask(struct irq_data *data)
+static inline bool ioapic_prepare_move(struct irq_data *data)
 {
 	/* If we are moving the irq we need to mask it */
-	if (unlikely(irqd_is_setaffinity_pending(data) &&
-		     !irqd_irq_inprogress(data))) {
-		mask_ioapic_irq(data);
+	if (unlikely(irqd_is_setaffinity_pending(data))) {
+		if (!irqd_irq_masked(data))
+			mask_ioapic_irq(data);
 		return true;
 	}
 	return false;
 }
 
-static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked)
+static inline void ioapic_finish_move(struct irq_data *data, bool moveit)
 {
-	if (unlikely(masked)) {
+	if (unlikely(moveit)) {
 		/* Only migrate the irq if the ack has been received.
 		 *
 		 * On rare occasions the broadcast level triggered ack gets
@@ -1730,15 +1730,17 @@ static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked)
 		 */
 		if (!io_apic_level_ack_pending(data->chip_data))
 			irq_move_masked_irq(data);
-		unmask_ioapic_irq(data);
+		/* If the irq is masked in the core, leave it */
+		if (!irqd_irq_masked(data))
+			unmask_ioapic_irq(data);
 	}
 }
 #else
-static inline bool ioapic_irqd_mask(struct irq_data *data)
+static inline bool ioapic_prepare_move(struct irq_data *data)
 {
 	return false;
 }
-static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked)
+static inline void ioapic_finish_move(struct irq_data *data, bool moveit)
 {
 }
 #endif
@@ -1747,11 +1749,11 @@ static void ioapic_ack_level(struct irq_data *irq_data)
 {
 	struct irq_cfg *cfg = irqd_cfg(irq_data);
 	unsigned long v;
-	bool masked;
+	bool moveit;
 	int i;
 
 	irq_complete_move(cfg);
-	masked = ioapic_irqd_mask(irq_data);
+	moveit = ioapic_prepare_move(irq_data);
 
 	/*
 	 * It appears there is an erratum which affects at least version 0x11
@@ -1806,7 +1808,7 @@ static void ioapic_ack_level(struct irq_data *irq_data)
 		eoi_ioapic_pin(cfg->vector, irq_data->chip_data);
 	}
 
-	ioapic_irqd_unmask(irq_data, masked);
+	ioapic_finish_move(irq_data, moveit);
 }
 
 static void ioapic_ir_ack_level(struct irq_data *irq_data)
-- 
2.18.0



  parent reply	other threads:[~2018-09-05 12:29 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-05 12:27 [PATCH RT 00/22] Linux 4.14.63-rt41-rc1 Steven Rostedt
2018-09-05 12:27 ` [PATCH RT 01/22] sched/fair: Fix CFS bandwidth control lockdep DEADLOCK report Steven Rostedt
2018-09-05 12:27 ` [PATCH RT 02/22] locallock: provide {get,put}_locked_ptr() variants Steven Rostedt
2018-09-05 12:27 ` [PATCH RT 03/22] squashfs: make use of local lock in multi_cpu decompressor Steven Rostedt
2018-09-05 12:27 ` [PATCH RT 04/22] PM / suspend: Prevent might sleep splats (updated) Steven Rostedt
2018-09-05 12:27 ` [PATCH RT 05/22] PM / wakeup: Make events_lock a RAW_SPINLOCK Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 06/22] PM / s2idle: Make s2idle_wait_head swait based Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 07/22] seqlock: provide the same ordering semantics as mainline Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 08/22] Revert "x86: UV: raw_spinlock conversion" Steven Rostedt
2018-09-06  7:35   ` Sebastian Andrzej Siewior
2018-09-06  8:38     ` Mike Galbraith
2018-09-06 12:58       ` Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 09/22] Revert "timer: delay waking softirqs from the jiffy tick" Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 10/22] irqchip/gic-v3-its: Make its_lock a raw_spin_lock_t Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 11/22] irqchip/gic-v3-its: Move ITS ->pend_page allocation into an early CPU up hook Steven Rostedt
2018-09-06  7:40   ` Sebastian Andrzej Siewior
2018-09-07 19:28     ` Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 12/22] sched/migrate_disable: fallback to preempt_disable() instead barrier() Steven Rostedt
2018-09-05 12:28 ` Steven Rostedt [this message]
2018-09-05 12:28 ` [PATCH RT 14/22] efi: Allow efi=runtime Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 15/22] efi: Disable runtime services on RT Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 16/22] crypto: cryptd - add a lock instead preempt_disable/local_bh_disable Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 17/22] crypto: scompress - serialize RT percpu scratch buffer access with a local lock Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 18/22] sched/core: Avoid __schedule() being called twice in a row Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 19/22] Revert "arm64/xen: Make XEN depend on !RT" Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 20/22] sched: Allow pinned user tasks to be awakened to the CPU they pinned Steven Rostedt
2018-09-05 12:28 ` [PATCH RT 22/22] Linux 4.14.63-rt41-rc1 Steven Rostedt
     [not found] ` <20180905122837.830614967@goodmis.org>
2018-09-05 12:34   ` [PATCH RT 21/22] Drivers: hv: vmbus: include header for get_irq_regs() Steven Rostedt
2018-09-06  7:54 ` [PATCH RT 00/22] Linux 4.14.63-rt41-rc1 Sebastian Andrzej Siewior
2018-09-06 16:43   ` Steven Rostedt
2018-09-06 19:30     ` Sebastian Andrzej Siewior

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180905122836.475141226@goodmis.org \
    --to=rostedt@goodmis.org \
    --cc=C.Emde@osadl.org \
    --cc=bigeasy@linutronix.de \
    --cc=daniel.wagner@siemens.com \
    --cc=jkacur@redhat.com \
    --cc=julia@ni.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=paul.gortmaker@windriver.com \
    --cc=tglx@linutronix.de \
    --cc=tom.zanussi@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).