From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: Juergen Gross <jgross@suse.com>,
xen-devel@lists.xenproject.org, Wei Liu <wl@xen.org>,
Andrew Cooper <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH for-4.13 2/2] x86/ioapic: don't use raw entry reads/writes in clear_IO_APIC_pin
Date: Thu, 7 Nov 2019 16:46:32 +0100 [thread overview]
Message-ID: <20191107154632.GA17494@Air-de-Roger> (raw)
In-Reply-To: <df702a74-0941-3491-fb18-165f7fb592b0@suse.com>
On Thu, Nov 07, 2019 at 04:28:56PM +0100, Jan Beulich wrote:
> On 07.11.2019 16:06, Roger Pau Monne wrote:
> > clear_IO_APIC_pin can be called after the iommu has been enabled, and
> > using raw entry reads and writes will result in a misconfiguration of
> > the entries already setup to use the interrupt remapping table.
>
> I'm afraid I don't understand this: Raw reads and writes don't even
> go to the IOMMU interrupt remapping code, so how would the assertion
> be triggered?
Because the code does something like:
memset(&rte, 0, ...);
...
__ioapic_write_entry(apic, pin, true, rte);
At which point you misconfigure an ioapic entry that was already setup
to point to an interrupt remapping entry, and the AMD IOMMU code
chokes in the assert below.
>
> > (XEN) [ 10.082154] ENABLING IO-APIC IRQs
> > (XEN) [ 10.087789] -> Using new ACK method
> > (XEN) [ 10.093738] Assertion 'get_rte_index(rte) == offset' failed at iommu_intr.c:328
> >
> > Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
>
> "Reported-by: Sergey ..." ahead of this?
Oh yes.
> > --- a/xen/arch/x86/io_apic.c
> > +++ b/xen/arch/x86/io_apic.c
> > @@ -514,13 +514,13 @@ static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
> > entry.mask = 1;
> > __ioapic_write_entry(apic, pin, false, entry);
> > }
> > - entry = __ioapic_read_entry(apic, pin, true);
> > + entry = __ioapic_read_entry(apic, pin, false);
> >
> > if (entry.irr) {
> > /* Make sure the trigger mode is set to level. */
> > if (!entry.trigger) {
> > entry.trigger = 1;
> > - __ioapic_write_entry(apic, pin, true, entry);
> > + __ioapic_write_entry(apic, pin, false, entry);
> > }
>
> All we do here is set the trigger bit. No translation back and forth
> of the RTE should be needed.
>
> > @@ -530,9 +530,9 @@ static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
> > */
> > memset(&entry, 0, sizeof(entry));
> > entry.mask = 1;
> > - __ioapic_write_entry(apic, pin, true, entry);
> > + __ioapic_write_entry(apic, pin, false, entry);
>
> I may be able to understand why this one can't use raw mode, but as
> per above a better overall description is needed.
Yes, this is the one that's actually incorrect, but see my reasoning
below.
>
> > - entry = __ioapic_read_entry(apic, pin, true);
> > + entry = __ioapic_read_entry(apic, pin, false);
> > if (entry.irr)
> > printk(KERN_ERR "IO-APIC%02x-%u: Unable to reset IRR\n",
> > IO_APIC_ID(apic), pin);
>
> This read again shouldn't need conversion, as the IRR bit doesn't
> get touched (I think) by the interrupt remapping code during the
> translation it does.
TBH, I think raw mode should only be used by the iommu code in order
to setup the entries to point to the interrupt remapping table,
everything else shouldn't be using raw mode. While it's true that some
of the cases here are safe to use raw mode I would discourage it's
usage as it can lead to issues, and this is not a performance critical
path anyway.
Thanks, Roger.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-11-07 15:46 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-07 15:06 [Xen-devel] [PATCH for-4.13 0/2] x86/ioapic: fix clear_IO_APIC_pin when using interrupt remapping Roger Pau Monne
2019-11-07 15:06 ` [Xen-devel] [PATCH for-4.13 1/2] x86/ioapic: remove usage of TRUE and FALSE in clear_IO_APIC_pin Roger Pau Monne
2019-11-07 15:13 ` Andrew Cooper
2019-11-07 15:20 ` Jan Beulich
2019-11-07 15:06 ` [Xen-devel] [PATCH for-4.13 2/2] x86/ioapic: don't use raw entry reads/writes " Roger Pau Monne
2019-11-07 15:28 ` Jan Beulich
2019-11-07 15:46 ` Roger Pau Monné [this message]
2019-11-07 15:51 ` Roger Pau Monné
2019-11-07 15:56 ` Jan Beulich
2019-11-08 9:27 ` Roger Pau Monné
2019-11-08 10:16 ` Jan Beulich
2019-11-08 16:07 ` Roger Pau Monné
2019-11-08 16:51 ` Jan Beulich
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=20191107154632.GA17494@Air-de-Roger \
--to=roger.pau@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=jgross@suse.com \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.