From: Zenghui Yu <yuzenghui@huawei.com>
To: Alexandru Elisei <alexandru.elisei@arm.com>
Cc: Marc Zyngier <maz@kernel.org>, kvmarm@lists.cs.columbia.edu
Subject: Re: kvm-unit-tests: Question about the "no interrupt when timer is disabled" case
Date: Sat, 25 Jul 2020 12:50:48 +0800 [thread overview]
Message-ID: <fea5457f-379d-4077-6b1d-022f13e16891@huawei.com> (raw)
In-Reply-To: <195f5f7b-b1a4-8c82-c5e3-aac950737ff5@arm.com>
Hi Alex,
[+cc Nianyao]
On 2020/7/24 19:08, Alexandru Elisei wrote:
> Hi Zenghui,
>
> I don't believe this issue can be triggered by a Linux guest. Details below.
>
> On 7/23/20 9:56 AM, Zenghui Yu wrote:
>> Hi Alexandru,
>>
>> I've noticed that the timer case will fail in the -stable 4.19 kernel.
>> The log is as follows:
>>
>> FAIL: vtimer-busy-loop: no interrupt when timer is disabled
>> FAIL: vtimer-busy-loop: interrupt signal no longer pending
>>
>> And it's because the related fix [16e604a437c8, "KVM: arm/arm64: vgic:
>> Reevaluate level sensitive interrupts on enable"] hasn't been backported
>> to the stable tree.
>
> This is not an actual fix (hence no "Fixes" tag), this is more like an improvement
> of the behaviour of the GIC. Like the patch description says, this can happen even
> on hardware if the GIC hasn't sampled the device interrupt state (or the device
> itself hasn't updated it) before the CPU re-enables the interrupt.
Fair enough.
>>
>> Just out of curiosity, _without_ this fix, had you actually seen the
>> guest getting into trouble due to an un-retired level-sensitive
>> interrupt and your patch fixed it? Or this was found by code inspection?
>
> This issue was found when running kvm-unit-tests on the model.
>
>>
>> Take the exact vtimer case as an example, is it possible that the Linux
>> guest would disable the vtimer (the input interrupt line is driven to 0
>> but the old KVM doesn't take this into account) and potentially hit this
>> issue? I'm not familiar with it.
>
> To trigger this, a guest has to do the following steps:
>
> 1. Disable the timer interrupt at the Redistributor level.
> 2. Trigger the timer interrupt in the timer.
> 3. Disable the timer entirely (CNT{P,V}_CTL_EL0.ENABLE = 0), which also disables
> the timer interrupt.
> 4. Enable the timer interrupt at the Redistributor level.
>
> I believe there are two reasons why this will never happen for a Linux guest:
>
> - This isn't the way Linux handles interrupts. Furthermore, I don't believe Linux
> will ever disable a specific interrupt at the irqchip level.
This can at least happen in arch_timer_stop() [arm_arch_timer.c], where
the disable_percpu_irq() API will disable the interrupt (via irq_mask()
callback which will in turn disable the interrupt at GIC level by
programming the ICENABLER0).
What I'm worried is something like:
1. Disable the timer interrupt (at RDist level by poking the ICENABLER0,
or at CPU level by masking PSTATE.I)
[ timer interrupt is made pending, and remains pending in (v)GIC. ]
2. Disable the timer
3. Enable the timer interrupt (at RDist level by poking the ISENABLER0,
or at CPU level by unmasking PSTATE.I)
[ The interrupt is forwarded to (v)CPU, and we end-up re-enabling the
timer inside the timer IRQ handler, which may not be as expected. ]
I'm just not sure if this will be a possible scenario in the Linux, and
is it harmful if this would happen.
> - The timer IRQ handler checks the ISTATUS flag in the timer control register
> before handling the interrupt. The flag is unset if the timer is disabled.
This actually doesn't match the spec. Arm ARM D13.8.25 has a description
about the ISTATUS field as below,
"When the value of the ENABLE bit is 0, the ISTATUS field is UNKNOWN."
I guess what Nianyao had posted [*] may address the concern above...
[*]
http://lore.kernel.org/r/1595584037-6877-1-git-send-email-zhangshaokun@hisilicon.com/
>
> I hope my explanation made sense, please chime in if I missed something or you
> want more details.
Thanks Alex,
Zenghui
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
next prev parent reply other threads:[~2020-07-25 4:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-23 8:56 kvm-unit-tests: Question about the "no interrupt when timer is disabled" case Zenghui Yu
2020-07-24 11:08 ` Alexandru Elisei
2020-07-25 4:50 ` Zenghui Yu [this message]
2020-07-27 11:27 ` Alexandru Elisei
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=fea5457f-379d-4077-6b1d-022f13e16891@huawei.com \
--to=yuzenghui@huawei.com \
--cc=alexandru.elisei@arm.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=maz@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).