From: Shannon Zhao <zhaoshenglong@huawei.com>
To: Julien Grall <julien.grall@arm.com>,
Stefano Stabellini <sstabellini@kernel.org>
Cc: xen-devel <xen-devel@lists.xensource.com>,
Wei Liu <wei.liu2@citrix.com>, Wei Chen <Wei.Chen@arm.com>,
Vikram Sethi <vikrams@codeaurora.org>,
Steve Capper <Steve.Capper@arm.com>,
Philip Elcan <pelcan@codeaurora.org>,
Shannon Zhao <shannon.zhao@linaro.org>,
Shanker Donthineni <shankerd@codeaurora.org>
Subject: Re: [PATCH] arm/acpi: Fix the deadlock in function vgic_lock_rank()
Date: Tue, 31 May 2016 08:55:10 +0800 [thread overview]
Message-ID: <574CE0EE.1060600@huawei.com> (raw)
In-Reply-To: <1918c496-c33d-bed4-feec-b8b4f6dd404b@arm.com>
On 2016/5/31 3:45, Julien Grall wrote:
> (CC Wei Liu)
>
> Hi Stefano,
>
> On 30/05/2016 14:16, Stefano Stabellini wrote:
>> On Fri, 27 May 2016, Julien Grall wrote:
>>> Hello Shanker,
>>>
>>> On 27/05/16 01:39, Shanker Donthineni wrote:
>>>> Commit 9d77b3c01d1261c (Configure SPI interrupt type and route to
>>>> Dom0 dynamically) causing dead loop inside the spinlock function.
>>>> Note that spinlocks in XEN are not recursive. Re-acquiring a spinlock
>>>> that has already held by calling CPU leads to deadlock. This happens
>>>> whenever dom0 does writes to GICD regs ISENABLER/ICENABLER.
>>>
>>> Thank you for spotting it, I have not noticed it while I was
>>> reviewing, only
>>> tested on a model without any SPIs.
>>>
>>>> The following call trace explains the problem.
>>>>
>>>> DOM0 writes GICD_ISENABLER/GICD_ICENABLER
>>>> vgic_v3_distr_common_mmio_write()
>>>> vgic_lock_rank() --> acquiring first time
>>>> vgic_enable_irqs()
>>>> route_irq_to_guest()
>>>> gic_route_irq_to_guest()
>>>> vgic_get_target_vcpu()
>>>> vgic_lock_rank() --> attemping acquired lock
>>>>
>>>> The simple fix release spinlock before calling vgic_enable_irqs()
>>>> and vgic_disable_irqs().
>>>
>>> You should explain why you think it is valid to release the lock
>>> earlier.
>>>
>>> In this case, I think the fix is not correct because the lock is
>>> protecting
>>> both the register value and the internal state in Xen (modified by
>>> vgic_enable_irqs). By releasing the lock earlier, they may become
>>> inconsistent
>>> if another vCPU is disabling the IRQs at the same time.
>>
>> I agree, the vgic_enable_irqs call need to stay within the
>> vgic_lock_rank/vgic_unlock_rank region.
>>
>>
>>> I cannot find an easy fix which does not involve release the lock.
>>> When I was
>>> reviewing this patch, I suggested to split the IRQ configuration from
>>> the
>>> routing.
>>
>> Yes, the routing doesn't need to be done from vgic_enable_irqs. It is
>> not nice. That would be the ideal fix, but it is not trivial.
>>
>> For 4.7 we could consider reverting 9d77b3c01d1261c. The only other
>> thing that I can come up with which is simple would be improving
>> gic_route_irq_to_guest to cope with callers that have the vgic rank lock
>> already held (see below, untested) but it's pretty ugly.
>
> We are close to release Xen 4.7, so I think we should avoid to touch the
> common interrupt code (i.e not only used by ACPI).
>
> ACPI can only be enabled in expert mode and will be a tech-preview for
> Xen 4.7. So I would revert the patch. SPIs will not be routed, but it
> is better than a deadlock.
>
> I would also replace the patch with a warning until the issue will be
> fixed in Xen 4.8.
>
> Any opinions?
I agree and I'm so sorry for this problem.
Thanks,
--
Shannon
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-05-31 0:55 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-27 0:39 [PATCH] arm/acpi: Fix the deadlock in function vgic_lock_rank() Shanker Donthineni
2016-05-27 13:56 ` Julien Grall
2016-05-30 13:16 ` Stefano Stabellini
2016-05-30 19:45 ` Julien Grall
2016-05-31 0:55 ` Shannon Zhao [this message]
2016-05-31 9:40 ` Stefano Stabellini
2016-05-31 10:11 ` Julien Grall
2016-06-01 9:54 ` Stefano Stabellini
2016-06-01 10:49 ` Julien Grall
2016-06-01 13:55 ` Shannon Zhao
2016-05-31 11:37 ` Wei Liu
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=574CE0EE.1060600@huawei.com \
--to=zhaoshenglong@huawei.com \
--cc=Steve.Capper@arm.com \
--cc=Wei.Chen@arm.com \
--cc=julien.grall@arm.com \
--cc=pelcan@codeaurora.org \
--cc=shankerd@codeaurora.org \
--cc=shannon.zhao@linaro.org \
--cc=sstabellini@kernel.org \
--cc=vikrams@codeaurora.org \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xensource.com \
/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.