From: Jacob Pan <jacob.jun.pan@linux.intel.com>
To: "Tian, Kevin" <kevin.tian@intel.com>
Cc: LKML <linux-kernel@vger.kernel.org>, X86 Kernel <x86@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
Thomas Gleixner <tglx@linutronix.de>,
Lu Baolu <baolu.lu@linux.intel.com>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"Hansen, Dave" <dave.hansen@intel.com>,
Joerg Roedel <joro@8bytes.org>, "H. Peter Anvin" <hpa@zytor.com>,
Borislav Petkov <bp@alien8.de>, Ingo Molnar <mingo@redhat.com>,
"Luse, Paul E" <paul.e.luse@intel.com>,
"Williams, Dan J" <dan.j.williams@intel.com>,
Jens Axboe <axboe@kernel.dk>, "Raj, Ashok" <ashok.raj@intel.com>,
"maz@kernel.org" <maz@kernel.org>,
"seanjc@google.com" <seanjc@google.com>,
Robin Murphy <robin.murphy@arm.com>,
"jim.harris@samsung.com" <jim.harris@samsung.com>,
"a.manzanares@samsung.com" <a.manzanares@samsung.com>,
Bjorn Helgaas <helgaas@kernel.org>,
"Zeng, Guang" <guang.zeng@intel.com>,
"robert.hoo.linux@gmail.com" <robert.hoo.linux@gmail.com>,
jacob.jun.pan@linux.intel.com
Subject: Re: [PATCH v2 07/13] x86/irq: Factor out calling ISR from common_interrupt
Date: Fri, 12 Apr 2024 09:50:22 -0700 [thread overview]
Message-ID: <20240412095022.592508c9@jacob-builder> (raw)
In-Reply-To: <BN9PR11MB52769DCDF70B551FCFF22DC58C042@BN9PR11MB5276.namprd11.prod.outlook.com>
Hi Kevin,
On Fri, 12 Apr 2024 09:21:45 +0000, "Tian, Kevin" <kevin.tian@intel.com>
wrote:
> > From: Jacob Pan <jacob.jun.pan@linux.intel.com>
> > Sent: Saturday, April 6, 2024 6:31 AM
> >
> > Prepare for calling external IRQ handlers directly from the posted MSI
> > demultiplexing loop. Extract the common code with common interrupt to
> > avoid code duplication.
> >
> > Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
> > ---
> > arch/x86/kernel/irq.c | 23 ++++++++++++++---------
> > 1 file changed, 14 insertions(+), 9 deletions(-)
> >
> > diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
> > index f39f6147104c..c54de9378943 100644
> > --- a/arch/x86/kernel/irq.c
> > +++ b/arch/x86/kernel/irq.c
> > @@ -242,18 +242,10 @@ static __always_inline void handle_irq(struct
> > irq_desc *desc,
> > __handle_irq(desc, regs);
> > }
> >
> > -/*
> > - * common_interrupt() handles all normal device IRQ's (the special SMP
> > - * cross-CPU interrupts have their own entry points).
> > - */
> > -DEFINE_IDTENTRY_IRQ(common_interrupt)
> > +static __always_inline void call_irq_handler(int vector, struct
> > pt_regs *regs) {
> > - struct pt_regs *old_regs = set_irq_regs(regs);
> > struct irq_desc *desc;
> >
> > - /* entry code tells RCU that we're not quiescent. Check it. */
> > - RCU_LOCKDEP_WARN(!rcu_is_watching(), "IRQ failed to wake up
> > RCU");
> > -
> > desc = __this_cpu_read(vector_irq[vector]);
> > if (likely(!IS_ERR_OR_NULL(desc))) {
> > handle_irq(desc, regs);
>
> the hidden lines has one problem:
>
> } else {
> apic_eoi();
>
> if (desc == VECTOR_UNUSED) {
> ...
>
> there will be two EOI's for unused vectors, adding the one
> in sysvec_posted_msi_notification().
Indeed this unlikely case could cause lost interrupt. Imagine we have:
- IDT vector N (MSI notification), O, and P (other high-priority
system vectors).
- Device MSI vector A which triggers N.
Action APIC IRR APIC ISR
---------------------------------------------------------
Device MSI A N
APIC accepts N - N
New IRQs arrive O,P N
handle_irq(A)
eoi() due to A's fault - O,P
eoi in post_msi - P
----------------------------------------------------------
The second EOI clears ISR for vector O but missed processing it.
Intel SDM 11.8.4 for background.
"The IRR contains the active interrupt requests that have been accepted,
but not yet dispatched to the processor for servicing. When the local APIC
accepts an interrupt, it sets the bit in the IRR that corresponds the
vector of the accepted interrupt. When the processor core is ready to
handle the next interrupt, the local APIC clears the highest priority IRR
bit that is set and sets the corresponding ISR bit. The vector for the
highest priority bit set in the ISR is then dispatched to the processor
core for servicing.
While the processor is servicing the highest priority interrupt, the local
APIC can send additional fixed interrupts by setting bits in the IRR. When
the interrupt service routine issues a write to the EOI register (see
Section 11.8.5, Signaling Interrupt Servicing Completion), the local APIC
responds by clearing the highest priority ISR bit that is set. It then
repeats the process of clearing the highest priority bit in the IRR and
setting the corresponding bit in the ISR. The processor core then begins
executing the service routing for the highest priority bit set in the ISR
"
I need to avoid the duplicated EOI in this case and at minimum cost for the
hot path.
Thanks,
Jacob
next prev parent reply other threads:[~2024-04-12 16:45 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-05 22:30 [PATCH v2 00/13] Coalesced Interrupt Delivery with posted MSI Jacob Pan
2024-04-05 22:30 ` [PATCH v2 01/13] x86/irq: Move posted interrupt descriptor out of vmx code Jacob Pan
2024-04-17 0:34 ` Sean Christopherson
2024-04-17 18:33 ` Jacob Pan
2024-04-05 22:30 ` [PATCH v2 02/13] x86/irq: Unionize PID.PIR for 64bit access w/o casting Jacob Pan
2024-04-05 22:31 ` [PATCH v2 03/13] x86/irq: Remove bitfields in posted interrupt descriptor Jacob Pan
2024-04-17 0:39 ` Sean Christopherson
2024-04-17 18:01 ` Jacob Pan
2024-04-18 17:30 ` Thomas Gleixner
2024-04-18 18:10 ` Jacob Pan
2024-04-05 22:31 ` [PATCH v2 04/13] x86/irq: Add a Kconfig option for posted MSI Jacob Pan
2024-04-05 22:31 ` [PATCH v2 05/13] x86/irq: Reserve a per CPU IDT vector for posted MSIs Jacob Pan
2024-04-11 16:51 ` Thomas Gleixner
2024-04-15 18:53 ` Jacob Pan
2024-04-15 20:43 ` Jacob Pan
2024-04-19 4:00 ` Thomas Gleixner
2024-04-19 20:07 ` Arnaldo Carvalho de Melo
2024-04-22 22:32 ` Jacob Pan
2024-04-12 9:14 ` Tian, Kevin
2024-04-12 14:27 ` Sean Christopherson
2024-04-16 3:45 ` Tian, Kevin
2024-04-05 22:31 ` [PATCH v2 06/13] x86/irq: Set up per host CPU posted interrupt descriptors Jacob Pan
2024-04-12 9:16 ` Tian, Kevin
2024-04-12 17:54 ` Jacob Pan
2024-04-05 22:31 ` [PATCH v2 07/13] x86/irq: Factor out calling ISR from common_interrupt Jacob Pan
2024-04-12 9:21 ` Tian, Kevin
2024-04-12 16:50 ` Jacob Pan [this message]
2024-04-05 22:31 ` [PATCH v2 08/13] x86/irq: Install posted MSI notification handler Jacob Pan
2024-04-11 7:52 ` Tian, Kevin
2024-04-11 17:38 ` Jacob Pan
2024-04-11 16:54 ` Thomas Gleixner
2024-04-11 18:29 ` Jacob Pan
2024-04-05 22:31 ` [PATCH v2 09/13] x86/irq: Factor out common code for checking pending interrupts Jacob Pan
2024-04-05 22:31 ` [PATCH v2 10/13] x86/irq: Extend checks for pending vectors to posted interrupts Jacob Pan
2024-04-12 9:25 ` Tian, Kevin
2024-04-12 18:23 ` Jacob Pan
2024-04-16 3:47 ` Tian, Kevin
2024-04-05 22:31 ` [PATCH v2 11/13] iommu/vt-d: Make posted MSI an opt-in cmdline option Jacob Pan
2024-04-06 4:31 ` Robert Hoo
2024-04-08 23:33 ` Jacob Pan
2024-04-13 10:59 ` Robert Hoo
2024-04-12 9:31 ` Tian, Kevin
2024-04-15 23:20 ` Jacob Pan
2024-04-05 22:31 ` [PATCH v2 12/13] iommu/vt-d: Add an irq_chip for posted MSIs Jacob Pan
2024-04-12 9:36 ` Tian, Kevin
2024-04-16 22:15 ` Jacob Pan
2024-04-05 22:31 ` [PATCH v2 13/13] iommu/vt-d: Enable posted mode for device MSIs Jacob Pan
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=20240412095022.592508c9@jacob-builder \
--to=jacob.jun.pan@linux.intel.com \
--cc=a.manzanares@samsung.com \
--cc=ashok.raj@intel.com \
--cc=axboe@kernel.dk \
--cc=baolu.lu@linux.intel.com \
--cc=bp@alien8.de \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@intel.com \
--cc=guang.zeng@intel.com \
--cc=helgaas@kernel.org \
--cc=hpa@zytor.com \
--cc=iommu@lists.linux.dev \
--cc=jim.harris@samsung.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=mingo@redhat.com \
--cc=paul.e.luse@intel.com \
--cc=peterz@infradead.org \
--cc=robert.hoo.linux@gmail.com \
--cc=robin.murphy@arm.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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