[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v7 22/28] xen/arm: ITS: Allocate irq descriptors for LPIs
Hi Vijay, On 18/09/15 14:09, vijay.kilari@xxxxxxxxx wrote: > From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> > > Allocate dynamically irq descriptors for LPIs This patch is the best example why we should only use nr_lpis to setup the number of ID bits in the GICv3. Here you are using gic_is_lpi to know if the IRQ is an LPIs. This function is using the number of IRQ (gic_nr_irq_ids()). Although, you allocate the LPIs using nr_lpis... > Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> > --- > v6: - Add separate patch for irq_pending structures > - renamed and moved is_domain_lpi to vgic > - Updated __irq_to_domain > --- > xen/arch/arm/gic-v3-its.c | 4 ++++ > xen/arch/arm/irq.c | 34 +++++++++++++++++++++++++++++++++- > xen/include/asm-arm/irq.h | 1 + > 3 files changed, 38 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c > index f3346d3..4875b0f 100644 > --- a/xen/arch/arm/gic-v3-its.c > +++ b/xen/arch/arm/gic-v3-its.c > @@ -1490,6 +1490,10 @@ int __init its_init(struct rdist_prop *rdists) > its_alloc_lpi_tables(); > its_lpi_init(rdists->id_bits); > > + /* Allocate irq descriptors for LPIs */ > + if ( init_lpi() ) > + return -ENOMEM; > + > its = list_first_entry(&its_nodes, struct its_node, entry); > /* > * As per vITS design spec, Xen exposes only one virtual ITS per domain. > diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c > index 3a01f46..32c3b53 100644 > --- a/xen/arch/arm/irq.c > +++ b/xen/arch/arm/irq.c > @@ -31,6 +31,8 @@ > static unsigned int local_irqs_type[NR_LOCAL_IRQS]; > static DEFINE_SPINLOCK(local_irqs_type_lock); > > +static irq_desc_t *irq_desc_lpi; > + > /* Number of LPIs supported by Xen. > * > * The LPI identifier starts from 8192. Given that the hardware is > @@ -73,7 +75,15 @@ static DEFINE_PER_CPU(irq_desc_t[NR_LOCAL_IRQS], > local_irq_desc); > irq_desc_t *__irq_to_desc(int irq) > { > if (irq < NR_LOCAL_IRQS) return &this_cpu(local_irq_desc)[irq]; > - return &irq_desc[irq-NR_LOCAL_IRQS]; > + else if ( gic_is_lpi(irq) ) > + { > + ASSERT(irq_desc_lpi != NULL); > + return &irq_desc_lpi[irq - FIRST_GIC_LPI]; > + } > + else > + return &irq_desc[irq - NR_LOCAL_IRQS]; > + > + return NULL; > } > > int __init arch_init_one_irq_desc(struct irq_desc *desc) > @@ -123,6 +133,28 @@ static int __cpuinit init_local_irq_data(void) > return 0; > } > > +int init_lpi(void) > +{ > + struct irq_desc *desc; > + unsigned int i; > + > + /* Allocate LPI irq descriptors */ > + irq_desc_lpi = xzalloc_array(struct irq_desc, nr_lpis); Please use gic_nr_irq_ids() > + if ( !irq_desc_lpi ) > + return -ENOSPC; We can't allocate memory so the proper errno is ENOMEM. > + > + for ( i = 0; i < nr_lpis; i++ ) Same here. > + { > + desc = &irq_desc_lpi[i]; > + init_one_irq_desc(desc); > + desc->irq = FIRST_GIC_LPI + i; > + desc->arch.type = DT_IRQ_TYPE_EDGE_BOTH; > + desc->action = NULL; > + } > + > + return 0; > +} > + > void __init init_IRQ(void) > { > int irq; Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |