From: Julien Grall <julien.grall@arm.com>
To: Stefano Stabellini <sstabellini@kernel.org>
Cc: Philip Elcan <pelcan@codeaurora.org>,
Wei Liu <wei.liu2@citrix.com>, Wei Chen <Wei.Chen@arm.com>,
Vikram Sethi <vikrams@codeaurora.org>,
Steve Capper <Steve.Capper@arm.com>,
xen-devel <xen-devel@lists.xensource.com>,
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 11:11:29 +0100 [thread overview]
Message-ID: <574D6351.9090207@arm.com> (raw)
In-Reply-To: <alpine.DEB.2.10.1605311034590.3896@sstabellini-ThinkPad-X260>
Hi Stefano,
On 31/05/16 10:40, Stefano Stabellini wrote:
> On Mon, 30 May 2016, Julien Grall wrote:
>> 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?
>>
>>> +int gic_route_irq_to_guest(struct domain *d, unsigned int virq,
>>> + struct irq_desc *desc, unsigned int priority)
>>> +{
>>> + unsigned long flags;
>>> + int lock = 0, retval;
>>> + struct vgic_irq_rank *rank;
>>> +
>>> + /* Use vcpu0 to retrieve the pending_irq struct. Given that we only
>>> + * route SPIs to guests, it doesn't make any difference. */
>>> + rank = vgic_rank_irq(d->vcpu[0], virq);
>>> +
>>> + /* Take the rank spinlock unless it has already been taken by the
>>> + * caller. */
>>> + if ( !spin_is_locked(&rank->lock) ) {
>>
>> AFAICT, spin_is_locked only tell us that someone has locked the rank. So this
>> would be unsafe.
>
> The code is checking if the lock is already taken, and if it is not
> taken, it will take the lock. The purpose of this code is to
> allow gic_route_irq_to_guest to be called by both functions which
> already have the lock held and functions that do not. The same goal
> could be achieved by duplicating gic_route_irq_to_guest into two
> identical functions except for the lock taking. That would be
> admittedly a more obvious fix but also a particularly ugly one.
spin_is_locked does not work as you expect. The function will not tell
you if the lock was taken by the current CPU, but if the lock was taken
by *a* CPU.
It would be possible to have CPU A calling this function and have CPU B
with the lock taken. So the data structure would be accessed by 2 CPUs
concurrently, which is unsafe.
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-05-31 10:11 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
2016-05-31 9:40 ` Stefano Stabellini
2016-05-31 10:11 ` Julien Grall [this message]
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=574D6351.9090207@arm.com \
--to=julien.grall@arm.com \
--cc=Steve.Capper@arm.com \
--cc=Wei.Chen@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 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).