From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Robert Hodaszi <Robert.Hodaszi@digi.com>,
Thomas Gleixner <tglx@linutronix.de>,
Marc Zyngier <marc.zyngier@arm.com>
Subject: [PATCH 5.2 10/21] x86/ioapic: Implement irq_get_irqchip_state() callback
Date: Thu, 18 Jul 2019 12:01:28 +0900 [thread overview]
Message-ID: <20190718030032.662554163@linuxfoundation.org> (raw)
In-Reply-To: <20190718030030.456918453@linuxfoundation.org>
From: Thomas Gleixner <tglx@linutronix.de>
commit dfe0cf8b51b07e56ded571e3de0a4a9382517231 upstream.
When an interrupt is shut down in free_irq() there might be an inflight
interrupt pending in the IO-APIC remote IRR which is not yet serviced. That
means the interrupt has been sent to the target CPUs local APIC, but the
target CPU is in a state which delays the servicing.
So free_irq() would proceed to free resources and to clear the vector
because synchronize_hardirq() does not see an interrupt handler in
progress.
That can trigger a spurious interrupt warning, which is harmless and just
confuses users, but it also can leave the remote IRR in a stale state
because once the handler is invoked the interrupt resources might be freed
already and therefore acknowledgement is not possible anymore.
Implement the irq_get_irqchip_state() callback for the IO-APIC irq chip. The
callback is invoked from free_irq() via __synchronize_hardirq(). Check the
remote IRR bit of the interrupt and return 'in flight' if it is set and the
interrupt is configured in level mode. For edge mode the remote IRR has no
meaning.
As this is only meaningful for level triggered interrupts this won't cure
the potential spurious interrupt warning for edge triggered interrupts, but
the edge trigger case does not result in stale hardware state. This has to
be addressed at the vector/interrupt entry level seperately.
Fixes: 464d12309e1b ("x86/vector: Switch IOAPIC to global reservation mode")
Reported-by: Robert Hodaszi <Robert.Hodaszi@digi.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Link: https://lkml.kernel.org/r/20190628111440.370295517@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/x86/kernel/apic/io_apic.c | 46 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1893,6 +1893,50 @@ static int ioapic_set_affinity(struct ir
return ret;
}
+/*
+ * Interrupt shutdown masks the ioapic pin, but the interrupt might already
+ * be in flight, but not yet serviced by the target CPU. That means
+ * __synchronize_hardirq() would return and claim that everything is calmed
+ * down. So free_irq() would proceed and deactivate the interrupt and free
+ * resources.
+ *
+ * Once the target CPU comes around to service it it will find a cleared
+ * vector and complain. While the spurious interrupt is harmless, the full
+ * release of resources might prevent the interrupt from being acknowledged
+ * which keeps the hardware in a weird state.
+ *
+ * Verify that the corresponding Remote-IRR bits are clear.
+ */
+static int ioapic_irq_get_chip_state(struct irq_data *irqd,
+ enum irqchip_irq_state which,
+ bool *state)
+{
+ struct mp_chip_data *mcd = irqd->chip_data;
+ struct IO_APIC_route_entry rentry;
+ struct irq_pin_list *p;
+
+ if (which != IRQCHIP_STATE_ACTIVE)
+ return -EINVAL;
+
+ *state = false;
+ raw_spin_lock(&ioapic_lock);
+ for_each_irq_pin(p, mcd->irq_2_pin) {
+ rentry = __ioapic_read_entry(p->apic, p->pin);
+ /*
+ * The remote IRR is only valid in level trigger mode. It's
+ * meaning is undefined for edge triggered interrupts and
+ * irrelevant because the IO-APIC treats them as fire and
+ * forget.
+ */
+ if (rentry.irr && rentry.trigger) {
+ *state = true;
+ break;
+ }
+ }
+ raw_spin_unlock(&ioapic_lock);
+ return 0;
+}
+
static struct irq_chip ioapic_chip __read_mostly = {
.name = "IO-APIC",
.irq_startup = startup_ioapic_irq,
@@ -1902,6 +1946,7 @@ static struct irq_chip ioapic_chip __rea
.irq_eoi = ioapic_ack_level,
.irq_set_affinity = ioapic_set_affinity,
.irq_retrigger = irq_chip_retrigger_hierarchy,
+ .irq_get_irqchip_state = ioapic_irq_get_chip_state,
.flags = IRQCHIP_SKIP_SET_WAKE,
};
@@ -1914,6 +1959,7 @@ static struct irq_chip ioapic_ir_chip __
.irq_eoi = ioapic_ir_ack_level,
.irq_set_affinity = ioapic_set_affinity,
.irq_retrigger = irq_chip_retrigger_hierarchy,
+ .irq_get_irqchip_state = ioapic_irq_get_chip_state,
.flags = IRQCHIP_SKIP_SET_WAKE,
};
next prev parent reply other threads:[~2019-07-18 3:26 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-18 3:01 [PATCH 5.2 00/21] 5.2.2-stable review Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 01/21] Revert "e1000e: fix cyclic resets at link up with active tx" Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 02/21] e1000e: start network tx queue only when link is up Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 03/21] Input: synaptics - enable SMBUS on T480 thinkpad trackpad Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 04/21] nilfs2: do not use unexported cpu_to_le32()/le32_to_cpu() in uapi header Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 05/21] drivers: base: cacheinfo: Ensure cpu hotplug work is done before Intel RDT Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 06/21] firmware: improve LSM/IMA security behaviour Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 07/21] genirq: Delay deactivation in free_irq() Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 08/21] genirq: Fix misleading synchronize_irq() documentation Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 09/21] genirq: Add optional hardware synchronization for shutdown Greg Kroah-Hartman
2019-07-18 3:01 ` Greg Kroah-Hartman [this message]
2019-07-18 3:01 ` [PATCH 5.2 11/21] x86/irq: Handle spurious interrupt after shutdown gracefully Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 12/21] x86/irq: Seperate unused system vectors from spurious entry again Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 13/21] ARC: hide unused function unw_hdr_alloc Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 14/21] s390/ipl: Fix detection of has_secure attribute Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 15/21] s390: fix stfle zero padding Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 16/21] s390/qdio: (re-)initialize tiqdio list entries Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 17/21] s390/qdio: dont touch the dsci in tiqdio_add_input_queues() Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 18/21] crypto: talitos - move struct talitos_edesc into talitos.h Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 19/21] crypto: talitos - fix hash on SEC1 Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 20/21] crypto/NX: Set receive window credits to max number of CRBs in RxFIFO Greg Kroah-Hartman
2019-07-18 3:01 ` [PATCH 5.2 21/21] x86/entry/32: Fix ENDPROC of common_spurious Greg Kroah-Hartman
2019-07-18 9:21 ` [PATCH 5.2 00/21] 5.2.2-stable review Jon Hunter
2019-07-18 9:37 ` Greg Kroah-Hartman
2019-07-18 12:42 ` Naresh Kamboju
2019-07-19 3:46 ` Greg Kroah-Hartman
2019-07-18 19:49 ` Guenter Roeck
2019-07-19 3:46 ` Greg Kroah-Hartman
2019-07-18 20:58 ` Kelsey Skunberg
2019-07-19 3:47 ` Greg Kroah-Hartman
2019-07-19 17:33 ` kernelci.org bot
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=20190718030032.662554163@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=Robert.Hodaszi@digi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=marc.zyngier@arm.com \
--cc=stable@vger.kernel.org \
--cc=tglx@linutronix.de \
/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).