From: Paolo Bonzini <pbonzini@redhat.com>
To: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
Steve Rutherford <srutherford@google.com>,
stable@vger.kernel.org
Subject: Re: [PATCH 2/2] KVM: x86: fix edge EOI and IOAPIC reconfig race
Date: Wed, 7 Oct 2015 11:31:07 +0200 [thread overview]
Message-ID: <5614E65B.1080801@redhat.com> (raw)
In-Reply-To: <20151006203338.GB4508@potion.brq.redhat.com>
On 06/10/2015 22:33, Radim Krčmář wrote:
> 2015-08-15 02:00+0200, Paolo Bonzini:
>> On 14/08/2015 10:38, Radim Krčmář wrote:
>>>> How do you reproduce the bug?
>>> I run rhel4 (2.6.9) kernel on 2 VCPUs and frequently alternate
>>> smp_affinity of "timer". The bug is hit within seconds.
>>
>> Nice, I'll try to make a unit test for it on the plane. :)
>
> (Time on planes is best spent by sleeping ;])
That's what I ended up doing. :)
> What do you think about the series?
I had just a few small comments. I had all but forgotten it, sorry.
The unit test makes the bug clear, thanks. What's the issue with
handle_irq?
Paolo
> I made a prototype kvm-unit-test ...
> (Reproduces with APICv or split irqchip builds.)
> ---8<---
> x86: test IO-APIC dest_id modification before
>
> Regression test for kvm commit $TODO.
> Run with '-smp 2'.
>
> I had problems with handle_irq so this version uses asm workaround;
> will fix that in final version. Initialization also presumes that
> everything will work as it did on my machines :)
> ---
> x86/ioapic.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 45 insertions(+), 2 deletions(-)
>
> diff --git a/x86/ioapic.c b/x86/ioapic.c
> index 1fe1ccc9eadd..55f8eea03496 100644
> --- a/x86/ioapic.c
> +++ b/x86/ioapic.c
> @@ -4,21 +4,27 @@
> #include "smp.h"
> #include "desc.h"
> #include "isr.h"
> +#include "io.h"
>
> #define EDGE_TRIGGERED 0
> #define LEVEL_TRIGGERED 1
>
> -static void set_ioapic_redir(unsigned line, unsigned vec, unsigned trig_mode)
> +static void __set_ioapic_redir(unsigned line, u8 vec, bool trig_mode, u8 dest_id)
> {
> ioapic_redir_entry_t e = {
> .vector = vec,
> - .delivery_mode = 0,
> .trig_mode = trig_mode,
> + .dest_id = dest_id,
> };
>
> ioapic_write_redir(line, e);
> }
>
> +static void set_ioapic_redir(unsigned line, unsigned vec, unsigned trig_mode)
> +{
> + __set_ioapic_redir(line, vec, trig_mode, 0);
> +}
> +
> static void set_irq_line(unsigned line, int val)
> {
> asm volatile("out %0, %1" : : "a"((u8)val), "d"((u16)(0x2000 + line)));
> @@ -298,6 +304,41 @@ static void test_ioapic_level_retrigger_mask(void)
> set_mask(0x0e, false);
> }
>
> +static volatile int pit_working = -1;
> +
> +static void __attribute__((used)) pit_isr_fn(void)
> +{
> + if (!pit_working++);
> + __set_ioapic_redir(0x2, 0x84, EDGE_TRIGGERED, 1);
> + eoi();
> +}
> +
> +void pit_isr(void);
> +asm (
> + "pit_isr: \n"
> + " call pit_isr_fn \n"
> +#ifndef __x86_64__
> + " iret"
> +#else
> + " iretq"
> +#endif
> + );
> +
> +static void test_ioapic_eoi_bug(void)
> +{
> + if (cpu_count() < 2)
> + return;
> +
> + set_idt_entry(0x84, pit_isr, 0);
> + __set_ioapic_redir(0x2, 0x84, EDGE_TRIGGERED, 0);
> +
> + outb(0x34, 0x43);
> +
> + for (unsigned loops = 100000000; loops && pit_working < 1; loops--)
> + asm volatile ("nop");
> +
> + report("dest_id reconfiguration before EOI", pit_working >= 1);
> +}
>
> int main(void)
> {
> @@ -325,5 +366,7 @@ int main(void)
> test_ioapic_level_mask();
> test_ioapic_level_retrigger_mask();
>
> + test_ioapic_eoi_bug();
> +
> return report_summary();
> }
>
next prev parent reply other threads:[~2015-10-07 9:31 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-13 13:46 [PATCH 0/2] KVM: x86: fix edge EOI and IOAPIC reconfig race Radim Krčmář
2015-08-13 13:46 ` [PATCH 1/2] KVM: x86: return bool from x86_ops.sync_pir_to_irr Radim Krčmář
2015-08-13 13:46 ` [PATCH 2/2] KVM: x86: fix edge EOI and IOAPIC reconfig race Radim Krčmář
2015-08-13 14:53 ` Paolo Bonzini
2015-08-14 8:38 ` Radim Krčmář
2015-08-15 0:00 ` Paolo Bonzini
2015-10-06 20:33 ` Radim Krčmář
2015-10-07 9:31 ` Paolo Bonzini [this message]
2015-10-07 15:05 ` Radim Krčmář
2015-10-07 9:29 ` Paolo Bonzini
2015-10-07 15:01 ` Radim Krčmář
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=5614E65B.1080801@redhat.com \
--to=pbonzini@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rkrcmar@redhat.com \
--cc=srutherford@google.com \
--cc=stable@vger.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;
as well as URLs for NNTP newsgroup(s).