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

Re: [PATCH v3 1/4] xen/arm: its: initialize host LPI state before activating ITSes


  • To: Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • From: Mykola Kvach <xakep.amatop@xxxxxxxxx>
  • Date: Tue, 29 Sep 2026 20:25:52 +0300
  • Arc-authentication-results: i=1; mx.google.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=mfVEEA+zzbIlCb2K+G5OZ9TxlLWINrq0E486oYeb0gQ=; fh=G8YuBHyJR9q91AksxLqFWOLENLkZ3yuzyZ8UDaRz44A=; b=EWR8yC2p6TFmjxcx2Do6vCgTMXfCoU8rB3yfWLxzjQSsDh6h27++OfLgsPOBU6UfPD EVkHFqYdzXuzndRcv1HpOTP7iSLT/p58klc29l664/qpN85VgT7RX266slKuBU8YizqI wGultauchQlJ6WgZndSpMbCgLIiHO6X8d2f8nrY4in6tfgqEgCPFplFNnX1VNTmVmkDU BE0Heb0bW1d9I6gxH1cs2urrq6g5SlKZ1euxW4mNJsTqxLBkl5IPO8XLk36SrNOoaYLE oLS4/+lfssR2D64KhBmCKmbtVdsS8n37vXvN76SH7e7BoLvDSkPRzIY1YNYhD4HLXS6q Szrg==; darn=lists.xenproject.org
  • Arc-seal: i=1; a=rsa-sha256; t=1790702766; cv=none; d=google.com; s=arc-20260327; b=h97ehG50xBZMK3Fk/v04LBXGADDzb7+m8nEm0/ReWP8tb5aQyUThj19orkvQ9t8c+8 9Olz9WK10gfGvUPLX3k9nsHqXpS9P05TtiPkJedR8rzISxfnvoGqJQOAj9ymI2BDWSaa t8iPxfncgjGZRw6HBhspgLpP/9Vka8JqpUhZEJiRZr0FmvNrY+MggPP5kieT+xezMGmG l6eMqrq5aEPVmHucYZRsz7dbd9APRQFEuPTcDtV78OKDdLZssSzkCFaC1D/JF1gGiQ2u iqA8nuGzWUD1tLQAmvsAAsxYARpKvUUgxhAk+/cxNRZ+2t9zA7p9movUEj+r7zJVWZeX 27JA==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=20251104 header.d=gmail.com header.i="@gmail.com" header.h="Content-Transfer-Encoding:Content-Type:Cc:To:Subject:Message-ID:Date:From:In-Reply-To:References:MIME-Version"
  • Cc: Mykola Kvach <Mykola_Kvach@xxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>
  • Delivery-date: Tue, 29 Sep 2026 17:26:16 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Fri, Sep 25, 2026 at 8:45 PM Volodymyr Babchuk
<Volodymyr_Babchuk@xxxxxxxx> wrote:
>
> Hi Mykola,
>
> Mykola Kvach <xakep.amatop@xxxxxxxxx> writes:
>
> > Hi Volodymyr,
> >
> > Thank you for the review.
> >
> > On Wed, Sep 23, 2026 at 2:56 AM Volodymyr Babchuk
> > <Volodymyr_Babchuk@xxxxxxxx> wrote:
> >>
> >> Hi Mykola,
> >>
> >> Mykola Kvach <mykola_kvach@xxxxxxxx> writes:
> >>
> >> > The boot CPU pending table must use the memory attributes selected by
> >> > ITS quirks. gicv3_lpi_init_host_lpis() is therefore called after
> >> > gicv3_its_init(). However, gicv3_its_init() also programs and enables
> >> > each ITS before host LPI state is allocated. No ITS commands are
> >> > submitted at that point, but this ordering relies on that implementation
> >> > detail.
> >> >
> >> > Split per-ITS initialization into preparation and activation phases.
> >> > First map and disable every ITS and collect its quirks. Then initialize
> >> > host LPI state. Only after that, allocate and program the ITS tables and
> >> > command queue, and enable each ITS.
> >> >
> >> > The subsequent gicv3_cpu_init() sequence remains unchanged: it programs
> >> > the Redistributor LPI tables, enables LPIs, and then submits the first
> >> > MAPC and SYNC commands.
> >> >
> >> > Suggested-by: Julien Grall <julien@xxxxxxx>
> >> > Signed-off-by: Mykola Kvach <mykola_kvach@xxxxxxxx>
> >> > ---
> >> > Changes in v3:
> >> > - New patch implementing the post-4.22 initialization order discussed
> >> >   during review of the ordering fix.
> >> >
> >> > Link: 
> >> > https://patchew.org/Xen/341edd8de63dcd84ccc6e7b6c03e9e8fc7105184.1781847061.git.mykola._5Fkvach@xxxxxxxx/
> >> > ---
> >> >  xen/arch/arm/gic-v3-its.c             | 32 ++++++++++++++++++++++-----
> >> >  xen/arch/arm/gic-v3.c                 | 15 ++-----------
> >> >  xen/arch/arm/include/asm/gic_v3_its.h |  4 ++--
> >> >  3 files changed, 31 insertions(+), 20 deletions(-)
> >> >
> >> > diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c
> >> > index 325835b0ad..972825bf06 100644
> >> > --- a/xen/arch/arm/gic-v3-its.c
> >> > +++ b/xen/arch/arm/gic-v3-its.c
> >> > @@ -11,6 +11,7 @@
> >> >  #include <xen/lib.h>
> >> >  #include <xen/delay.h>
> >> >  #include <xen/iocap.h>
> >> > +#include <xen/init.h>
> >> >  #include <xen/libfdt/libfdt.h>
> >> >  #include <xen/mm.h>
> >> >  #include <xen/rbtree.h>
> >> > @@ -549,10 +550,9 @@ static int gicv3_disable_its(struct host_its 
> >> > *hw_its)
> >> >      return -ETIMEDOUT;
> >> >  }
> >> >
> >> > -static int gicv3_its_init_single_its(struct host_its *hw_its)
> >> > +static int __init gicv3_its_prepare_single_its(struct host_its *hw_its)
> >> >  {
> >> > -    uint64_t reg;
> >> > -    int i, ret;
> >> > +    int ret;
> >> >
> >> >      hw_its->its_base = ioremap_nocache(hw_its->addr, hw_its->size);
> >> >      if ( !hw_its->its_base )
> >> > @@ -564,6 +564,14 @@ static int gicv3_its_init_single_its(struct 
> >> > host_its *hw_its)
> >> >
> >> >      gicv3_its_enable_quirks(hw_its);
> >> >
> >> > +    return 0;
> >> > +}
> >> > +
> >> > +static int __init gicv3_its_init_single_its(struct host_its *hw_its)
> >> > +{
> >> > +    uint64_t reg;
> >> > +    int i, ret;
> >> > +
> >> >      reg = readq_relaxed(hw_its->its_base + GITS_TYPER);
> >> >      hw_its->devid_bits = GITS_TYPER_DEVICE_ID_BITS(reg);
> >> >      hw_its->evid_bits = GITS_TYPER_EVENT_ID_BITS(reg);
> >> > @@ -1189,7 +1197,7 @@ static void gicv3_its_acpi_init(void)
> >> >
> >> >  #endif
> >> >
> >> > -int gicv3_its_init(void)
> >> > +int __init gicv3_its_init(unsigned int host_lpi_bits)
> >> >  {
> >> >      struct host_its *hw_its;
> >> >      int ret;
> >> > @@ -1201,13 +1209,27 @@ int gicv3_its_init(void)
> >> >
> >> >      list_for_each_entry(hw_its, &host_its_list, entry)
> >> >      {
> >> > -        ret = gicv3_its_init_single_its(hw_its);
> >> > +        ret = gicv3_its_prepare_single_its(hw_its);
> >> >          if ( ret )
> >> >              return ret;
> >> >      }
> >> >
> >> >      gicv3_its_validate_quirks();
> >> >
> >> > +    if ( list_empty(&host_its_list) )
> >> > +        return 0;
> >>
> >> What is the purpose of this check here? I'd expect to see it before the
> >> first list_for_each_entry() loop.
> >
> > The check skips host LPI initialization when no host ITS is present,
> > preserving the existing behavior. Xen currently does not support LPIs
> > without an ITS.
>
> This does not answer why you need to run list_for_each_entry() loop. I
> understand that it will not loop and then you will just call
> gicv3_its_validate_quirks(), which also will do nothing. This is why I
> am asking, why not move this if() check right before the loop?
>
> > gicv3_its_validate_quirks() already checks for an empty list, so the
> > current placement does not cause a functional issue. The following
> > patch also removes that function and its call.
> >
> > Would you be OK with keeping the current placement?
>
> I think it will be more sensible to have this check before the
> loop. Unless I miss something, of course.

Ack.

Best regards,
Mykola



 


Rackspace

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