[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 1/4] xen/arm: make is_espi() a pure range predicate


  • To: "Orzel, Michal" <michal.orzel@xxxxxxx>
  • From: Mykola Kvach <mykola_kvach@xxxxxxxx>
  • Date: Wed, 23 Sep 2026 11:43:31 +0300
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=n64lJMbCAgVr7AruNYNLVvzSp1ZgFlsjaz/G2tQ6xVk=; b=Hxk2otKgTElviO4vIyNToxxp/xGV4L7pn9gxDh3wXjFZFu2L/3UnB04Zf4wwNljrTCyc5dZfmU77NqnIrNSlZN1pPfufbONvUbHJcbwUh4nGKNdTBn8x4IooCaKK7cLHTTyJXDJ7pJQaMjO95Dc99K77kQzU4wdQ6N6OwsshLX+9o1FnkThmhHTBrwlrE3hH3En5lUolvXOvFKk2iHVYT1MqybUlg5l/m/o/CjZdPO4TA340DTxFFtEWExOSTMFmYbrOXazVXTS7GhJjVvGB4thvyALO7g5IjlmmTgBLS8OLLY43gguT+DOY7Jy5KMPdd8YW4/PG7l4yDkE2n3T4pQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UHlOvASWQf/r+mYyjBc9XNX23NQzvBDsVBdd0GyVfVwhpQoSwuA7jdNWOMv+y4HRbsgs3G6sa39m3/Zn/HqHyO09FKDx/SC5vbnTHGkA9WPy7n+PZzgLx/y9503sk3GIKPObjRuYzTO4QIePYpeeFWcnpur+P7Aj5JOoZQG57ChtgTRW0sX+loGD7PH0/NDoEPZ6sAwmNBCAjOIr5cXz6mKgFFAXQSjqAUv3xw+vWHTjaizqiEX/PEemN6SA+hjPFja8oXJ41x1jIg8YHb4QVeSPHlbJ7Wtsz8UApykfvhBmvwyGxxzi0vJ3aDeZq3WFcZQJMjAowHVnXZZ9A9vPEA==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=epam.com header.i="@epam.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Wed, 23 Sep 2026 08:43:58 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Mail-followup-to: "Orzel, Michal" <michal.orzel@xxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>

Hi Michal,

Thank you for the review.

On Tue, Sep 22, 2026 at 01:19:57PM +0200, Orzel, Michal wrote:
> 
> 
> On 22-Sep-26 08:39, Mykola Kvach wrote:
> > is_espi() currently changes its result according to CONFIG_GICV3_ESPI.
> > Without eSPI support, it returns false, and its assertion fails if
> > an eSPI INTID is passed. Callers therefore use it both to identify
> > eSPIs and to exclude eSPI handling when support is disabled.
> > 
> > Make is_espi() report only whether an INTID is in the architectural
> > eSPI range. Check for eSPI support at the call sites.
> > 
> > Use BUG_ON() if the GIC reports an eSPI without compiled-in support,
> > matching the handling of unsupported LPIs. Return NULL from
> > spi_to_pending() for an eSPI when support is disabled, using an
> > espi_to_pending() stub.
> > 
> > Signed-off-by: Mykola Kvach <mykola_kvach@xxxxxxxx>
> > ---
> > Changes in v4:
> > - Clarify the existing is_espi() behavior in the commit message.
> > - Drop the unrelated blank-line removal in vgic.c.
> > - Use BUG_ON() if the GIC reports an eSPI without eSPI support.
> > - Drop the redundant CONFIG_GICV3_ESPI check in IRQ dispatch.
> > - Return NULL for virtual eSPI lookup when eSPI support is disabled.
> > 
> > Changes in v3:
> > - New preparatory cleanup requested during review.
> > ---
> >  xen/arch/arm/gic.c             |  2 ++
> >  xen/arch/arm/include/asm/irq.h | 11 -----------
> >  xen/arch/arm/vgic.c            | 30 ++++++++++++++++--------------
> >  3 files changed, 18 insertions(+), 25 deletions(-)
> > 
> > diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> > index 078049e741..3a7f972826 100644
> > --- a/xen/arch/arm/gic.c
> > +++ b/xen/arch/arm/gic.c
> > @@ -348,6 +348,8 @@ void gic_interrupt(struct cpu_user_regs *regs, int 
> > is_fiq)
> >          /* Reading IRQ will ACK it */
> >          irq = gic_hw_ops->read_irq();
> >  
> > +        BUG_ON(!IS_ENABLED(CONFIG_GICV3_ESPI) && is_espi(irq));
> Usually BUG() should come with a comment explaining why we cannot continue. 
> Here
> it's that without config enabled, there's no descriptor and no pending_irq
> storage for it. Please add a comment.

Ack.

> 
> > +
> >          if ( likely(irq >= GIC_SGI_STATIC_MAX && irq < 1020) || 
> > is_espi(irq) )
> >          {
> >              isb();
> > diff --git a/xen/arch/arm/include/asm/irq.h b/xen/arch/arm/include/asm/irq.h
> > index 09788dbfeb..c29f3d04a3 100644
> > --- a/xen/arch/arm/include/asm/irq.h
> > +++ b/xen/arch/arm/include/asm/irq.h
> > @@ -66,18 +66,7 @@ static inline bool is_lpi(unsigned int irq)
> >  
> >  static inline bool is_espi(unsigned int irq)
> >  {
> > -#ifdef CONFIG_GICV3_ESPI
> >      return irq >= ESPI_BASE_INTID && irq <= ESPI_MAX_INTID;
> > -#else
> > -    /*
> > -     * The function should not be called for eSPIs when CONFIG_GICV3_ESPI 
> > is
> > -     * disabled. Returning false allows the compiler to optimize the code
> > -     * when the config is disabled, while the assert ensures that 
> > out-of-range
> > -     * array resources are not accessed.
> > -     */
> > -    ASSERT(!(irq >= ESPI_BASE_INTID && irq <= ESPI_MAX_INTID));
> > -    return false;
> > -#endif
> >  }
> >  
> >  static inline unsigned int espi_intid_to_idx(unsigned int intid)
> > diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c
> > index e5aca17dcb..e04678f134 100644
> > --- a/xen/arch/arm/vgic.c
> > +++ b/xen/arch/arm/vgic.c
> > @@ -62,6 +62,13 @@ static inline struct vgic_irq_rank 
> > *vgic_get_espi_rank(struct vcpu *v,
> >      return &v->domain->arch.vgic.ext_shared_irqs[EXT_RANK_NUM2IDX(rank)];
> >  }
> >  
> > +static struct pending_irq *espi_to_pending(struct domain *d, unsigned int 
> > irq)
> Constify d, please.
> Also, use static inline like the surrounding helpers.

Ack.

> 
> > +{
> > +    unsigned int idx = espi_intid_to_idx(irq) + d->arch.vgic.nr_spis;
> > +
> > +    return &d->arch.vgic.pending_irqs[idx];
> > +}
> > +
> >  #else
> >  static inline bool is_valid_espi_rank(struct domain *d, unsigned int rank)
> >  {
> > @@ -78,6 +85,11 @@ static inline struct vgic_irq_rank 
> > *vgic_get_espi_rank(struct vcpu *v,
> >      ASSERT_UNREACHABLE();
> >      return NULL;
> >  }
> > +
> > +static struct pending_irq *espi_to_pending(struct domain *d, unsigned int 
> > irq)
> > +{
> Add ASSERT_UNREACHABLE() here like for vgic_get_espi_rank().

Ack.

> 
> > +    return NULL;
> > +}
> >  #endif
> >  
> >  static inline struct vgic_irq_rank *vgic_get_rank(struct vcpu *v,
> > @@ -696,8 +708,8 @@ bool vgic_to_sgi(struct vcpu *v, register_t sgir, enum 
> > gic_sgi_mode irqmode,
> >  /*
> >   * Returns the pointer to the struct pending_irq belonging to the given
> >   * interrupt.
> > - * This can return NULL if called for an LPI which has been unmapped
> > - * meanwhile.
> > + * This can return NULL for an eSPI when support is disabled, or for an
> > + * LPI which has been unmapped meanwhile.
> This puts LPI and eSPIs on exactly the same level which is not correct. While
> unmapped LPI can happen, eSPI with support disabled must not. Leave the LPI
> comment as is and clarify eSPI in one sentence.

Ack.

Best regards,
Mykola



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.