[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v10 11/32] ARM: GICv3: forward pending LPIs to guests
On Tue, 30 May 2017, Julien Grall wrote: > Hi Andre, > > On 26/05/17 18:35, Andre Przywara wrote: > > Upon receiving an LPI on the host, we need to find the right VCPU and > > virtual IRQ number to get this IRQ injected. > > Iterate our two-level LPI table to find the domain ID and the virtual > > LPI number quickly when the host takes an LPI. We then look up the > > right VCPU in the struct pending_irq. > > We use the existing injection function to let the GIC emulation deal > > with this interrupt. > > This introduces a do_LPI() as a hardware gic_ops. > > > > Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx> > > --- > > xen/arch/arm/gic-v2.c | 7 ++++ > > xen/arch/arm/gic-v3-lpi.c | 76 > > ++++++++++++++++++++++++++++++++++++++-- > > xen/arch/arm/gic-v3.c | 1 + > > xen/arch/arm/gic.c | 8 ++++- > > xen/include/asm-arm/domain.h | 3 +- > > xen/include/asm-arm/gic.h | 2 ++ > > xen/include/asm-arm/gic_v3_its.h | 8 +++++ > > 7 files changed, 101 insertions(+), 4 deletions(-) > > > > diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c > > index 270a136..ffbe47c 100644 > > --- a/xen/arch/arm/gic-v2.c > > +++ b/xen/arch/arm/gic-v2.c > > @@ -1217,6 +1217,12 @@ static int __init gicv2_init(void) > > return 0; > > } > > > > +static void gicv2_do_LPI(unsigned int lpi) > > +{ > > + /* No LPIs in a GICv2 */ > > + BUG(); > > +} > > + > > const static struct gic_hw_operations gicv2_ops = { > > .info = &gicv2_info, > > .init = gicv2_init, > > @@ -1244,6 +1250,7 @@ const static struct gic_hw_operations gicv2_ops = { > > .make_hwdom_madt = gicv2_make_hwdom_madt, > > .map_hwdom_extra_mappings = gicv2_map_hwdown_extra_mappings, > > .iomem_deny_access = gicv2_iomem_deny_access, > > + .do_LPI = gicv2_do_LPI, > > }; > > > > /* Set up the GIC */ > > diff --git a/xen/arch/arm/gic-v3-lpi.c b/xen/arch/arm/gic-v3-lpi.c > > index 292f2d0..438bbfe 100644 > > --- a/xen/arch/arm/gic-v3-lpi.c > > +++ b/xen/arch/arm/gic-v3-lpi.c > > @@ -47,7 +47,6 @@ union host_lpi { > > struct { > > uint32_t virt_lpi; > > uint16_t dom_id; > > - uint16_t vcpu_id; > > You don't explain why you remove vcpu_id from host_lpi. This likely require a > separate patch anyway. > > Also, I would prefer if you make the padding in the structure explicit (i.e > using pad0). > > > }; > > }; > > > > @@ -136,6 +135,80 @@ uint64_t gicv3_get_redist_address(unsigned int cpu, > > bool use_pta) > > return per_cpu(lpi_redist, cpu).redist_id << 16; > > } > > > > +static void vgic_vcpu_inject_lpi(struct domain *d, unsigned int virq) > > +{ > > + struct pending_irq *p = irq_to_pending(d->vcpu[0], virq); > > + struct vcpu *v = NULL; > > + > > + if ( !p ) > > + return; > > + > > + if ( p->lpi_vcpu_id < d->max_vcpus ) > > + v = d->vcpu[read_atomic(&p->lpi_vcpu_id)]; > > Hmmm, what does prevent lpi_vcpu_id to change between the check and the read? Supposedly we are going to set lpi_vcpu_id only to good values? Meaning that we are going to do the lpi_vcpu_id checks at the time of setting lpi_vcpu_id. Thus, even if lpi_vcpu_id changes, it is not a problem. In fact, if that is true, can we even drop the if ( p->lpi_vcpu_id < d->max_vcpus ) test here? > > + > > + if ( v ) > > v will always be valid if you read d->vcpu[....] and the way you wrote the > code is very confusing. > > It would be clearer if you do: > > if ( p->lpi_vcpu_id >= d->max_vcpus ) > return; > > v = .... > vgic_vcpu_inject_irq(v, irq); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |