|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH 01/10] ARM: vGIC: remove rank lock from IRQ routing functions
Hi Stefano, On 09/05/17 01:47, Stefano Stabellini wrote: On Mon, 8 May 2017, Julien Grall wrote:Hi Stefano, On 08/05/2017 22:53, Stefano Stabellini wrote:On Mon, 8 May 2017, Julien Grall wrote:Hi Andre, On 08/05/17 10:15, Andre Przywara wrote:On 04/05/17 16:53, Julien Grall wrote:Hi Andre, On 04/05/17 16:31, Andre Przywara wrote:gic_route_irq_to_guest() and gic_remove_irq_from_guest() take the rank lock, however never actually access the rank structure. Avoid taking the lock in those two functions and remove some more unneeded code on the way.The rank is here to protect p->desc when checking that the virtual interrupt was not yet routed to another physical interrupt.Really? To me that sounds quite surprising. My understanding is that the VGIC VCPU lock protected the pending_irq (and thus the desc pointer?) so far, and the desc itself has its own lock. According to the comment in the struct irq_rank declaration the lock protects the members of this struct only. Looking briefly at users of pending_irq->desc (for instance gicv[23]_update_lr() or gic_update_one_lr()) I can't see any hint that they care about the lock. So should that be fixed or at least documented?My understanding is this rank lock is preventing race between two updates of p->desc. This can happen if gic_route_irq_to_guest(...) is called concurrently with the same vIRQ but different pIRQ. If you drop this lock, nothing will protect that anymore.The desc->lock in route_irq_to_guest is protecting against concurrent changes to the same physical irq. The vgic_lock_rank in gic_route_irq_to_guest is protecting against concurrent changes to the same virtual irq. In other words, the current code does: 1) lock physical irq 2) lock virtual irq 3) establish mapping virtual irq - physical irq Andre, sorry for not seeing this earlier.Without this locking, you can have two concurrent call of gic_route_irq_to_guest that will update the same virtual interrupt but with different physical interrupts. You would have to replace the rank lock by the per-pending_irq lock to keep the code safe.That indeed sounds reasonable. Yes. It would work, but it would establish a new locking order constraint: desc->lock first, then d->arch.vgic.lock, which is a bit unnatural. For example, the d->arch.vgic.lock is taken by vgic-v2 and vgic-v3 in response to guest MMIO traps. Today, they don't do much, but it is easy to imagine that in the future you might want to take the desc->lock after the d->arch.vgic.lock, the same way we take the desc->lock after the rank lock today. Well, IHMO the domain vgic lock should only be taken when you modify a global configuration (such as enabling/disabling the distributor, routing new IRQs...). This is what is already done today and we should avoid to use for more than that as it will not scale. So suggesting this lock ordering sounds good to me as you will unlikely have to take the desc->lock when you get the domain vgic lock. On the other end, if we take the pending_irq lock before desc->lock we don't add any new order constraints. That's my preference But this would require to take pending_irq in route_irq_to_guest where I think we are making the line more blur between irq.c and gic.c If possible I'd like to keep the irq.c agnostic to what we do in the vGIC. But maybe I misunderstood and you meant to suggest taking the d->arch.vgic.lock before the desc->lock in route_irq_to_guest? I guess that would work too. See my answer just above. Cheers, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |