And I obviously commented on the wrong version :/.I will replicate the
command on v10.
Sorry for the inconvenience.
On 06/02/2017 06:24 PM, Julien Grall wrote:
Hi Andre,
On 05/11/2017 06:53 PM, Andre Przywara wrote:
+ do
+ {
+ nr_lpis =
radix_tree_gang_lookup(&its->d->arch.vgic.pend_lpi_tree,
+ (void **)pirqs, vlpi,
+ ARRAY_SIZE(pirqs));
+
+ for ( i = 0; i < nr_lpis; i++ )
+ {
+ /* We only care about LPIs on our VCPU. */
+ if ( pirqs[i]->lpi_vcpu_id != vcpu->vcpu_id )
+ continue;
+
+ vlpi = pirqs[i]->irq;
+ /* If that fails for a single LPI, carry on to handle the
rest. */
+ ret = update_lpi_property(its->d, pirqs[i]);
+ if ( !ret )
+ update_lpi_vgic_status(vcpu, pirqs[i]);
+ }
+ /*
+ * Loop over the next gang of pending_irqs until we reached the
end of
+ * a (fully populated) tree or the lookup function returns less
LPIs than
+ * it has been asked for.
+ */
+ } while ( (++vlpi < its->d->arch.vgic.nr_lpis) &&
+ (nr_lpis == ARRAY_SIZE(pirqs)) );
+
+ read_unlock(&its->d->arch.vgic.pend_lpi_tree_lock);
+ spin_unlock_irqrestore(&vcpu->arch.vgic.lock, flags);
+
+ return ret;
The implementation looks good. However, one question. ret would be equal
to the latest LPI updated. So even if all LPIs have failed but the
latest, you will still return 0. Is it what you want?
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel