|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv1 1/2] passthrough: use per-interrupt lock when injecting an interrupt
>>> On 23.10.15 at 13:05, <david.vrabel@xxxxxxxxxx> wrote:
> The use of the per-domain event_lock in hvm_dirq_assist() does not scale
> with many VCPUs or interrupts.
>
> Add a per-interrupt lock to reduce contention. When a interrupt for a
> passthrough device is being setup or teared down, we must take both
> the event_lock and this new lock.
>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
Konrad, could you please take a look too?
> @@ -245,11 +246,11 @@ int pt_irq_create_bind(
> * would have spun forever and would do the same thing (wait to flush out
> * outstanding hvm_dirq_assist calls.
> */
> - if ( pt_pirq_softirq_active(pirq_dpci) )
> + while ( pt_pirq_softirq_active(pirq_dpci) )
> {
> - spin_unlock(&d->event_lock);
> + spin_unlock(&pirq_dpci->lock);
> cpu_relax();
> - goto restart;
> + spin_lock(&pirq_dpci->lock);
> }
The comment ahead of pt_pirq_softirq_active() (mentioning
event_lock) will thus need updating.
> @@ -481,6 +489,8 @@ int pt_irq_destroy_bind(
> pirq = pirq_info(d, machine_gsi);
> pirq_dpci = pirq_dpci(pirq);
>
> + spin_lock(&pirq_dpci->lock);
Considering that code further down in this function checks
pirq_dpci to be non-NULL, this doesn't look safe (or else those
checks should go away, as after this addition they would be
likely to trigger e.g. Coverity warnings).
> @@ -621,7 +633,7 @@ int hvm_do_IRQ_dpci(struct domain *d, struct pirq *pirq)
> return 1;
> }
>
> -/* called with d->event_lock held */
> +/* called with pirq_dhci->lock held */
> static void __msi_pirq_eoi(struct hvm_pirq_dpci *pirq_dpci)
The fact that this is a safe change to the locking model imo needs
to be spelled out explicitly in the commit message. Afaict it's safe
only because desc_guest_eoi() uses pirq for nothing else than to
(atomically!) clear pirq->masked.
> @@ -675,7 +687,7 @@ static void hvm_dirq_assist(struct domain *d, struct
> hvm_pirq_dpci *pirq_dpci)
> {
> ASSERT(d->arch.hvm_domain.irq.dpci);
>
> - spin_lock(&d->event_lock);
> + spin_lock(&pirq_dpci->lock);
> if ( test_and_clear_bool(pirq_dpci->masked) )
> {
> struct pirq *pirq = dpci_pirq(pirq_dpci);
Along the same lines - it's not obvious that the uses of pirq here are
safe with event_lock no longer held. In particular I wonder about
send_guest_pirq() - despite the other use in __do_IRQ_guest() not
doing any locking either I'm not convinced this is correct.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |