Shouldn't we check that the user never asks for more than 20 bits on the cli 
btw?
On Fri, 2026-02-13 at 09:59 +0100, Clement Mathieu--Drif wrote:
> 
> On Fri, 2026-02-13 at 08:43 +0000, Duan, Zhenzhong wrote:
> 
> 
> > 
> > 
> > 
> > > -----Original Message-----
> > > From: Clement Mathieu--Drif 
> > > <[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))>
> > > Subject: Re: [RFC PATCH 05/14] intel_iommu: Change pasid property from 
> > > bool to
> > > uint8
> > > 
> > > 
> > > On Fri, 2026-02-13 at 01:21 +0000, Duan, Zhenzhong wrote:
> > > 
> > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > > -----Original Message-----
> > > > > From: Clement Mathieu--Drif <[clement.mathieu--
> > > > 
> > > > 
> > > 
> > > 
> > > [[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))](mailto:[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected])))>
> > > 
> > > 
> > > > 
> > > > 
> > > > > Subject: Re: [RFC PATCH 05/14] intel_iommu: Change pasid property 
> > > > > from bool
> > > > 
> > > > 
> > > 
> > > 
> > > to
> > > 
> > > 
> > > > 
> > > > 
> > > > > uint8
> > > > > 
> > > > > 
> > > > > On Thu, 2026-02-12 at 08:16 +0000, Duan, Zhenzhong wrote:
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > -----Original Message-----
> > > > > > > From: Clement Mathieu--Drif <[clement.mathieu--
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > [[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))](mailto:[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected])))](mailto:[clement.mathieu--
> > > > 
> > > > 
> > > 
> > > 
> > > [[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))](mailto:[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))))>
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > Subject: Re: [RFC PATCH 05/14] intel_iommu: Change pasid property 
> > > > > > > from
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > bool
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > to
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > uint8
> > > > > > > 
> > > > > > > 
> > > > > > > On Wed, 2026-02-04 at 22:11 -0500, Zhenzhong Duan wrote:
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > > 'x-pasid-mode' is a bool property, we need an extra 'pss' 
> > > > > > > > property to
> > > > > > > > represent PASID size supported. Because there is no any device 
> > > > > > > > in QEMU
> > > > > > > > supporting pasid capability yet, no guest could use the pasid 
> > > > > > > > feature
> > > > > > > > until now, 'x-pasid-mode' takes no effect.
> > > > > > > > 
> > > > > > > > So instead of an extra 'pss' property we can use a single 
> > > > > > > > 'pasid'
> > > > > > > > property of uint8 type to represent if pasid is supported and 
> > > > > > > > the PASID
> > > > > > > > bits size. A value of N > 0 means pasid is supported and N - 1 
> > > > > > > > is the
> > > > > > > > value in PSS field in ECAP register.
> > > > > > > > 
> > > > > > > > Signed-off-by: Zhenzhong Duan
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > <[[[[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))](mailto:[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected])))](mailto:[zhen
> > > [[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))](mailto:[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))))](mailto:[zhen
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > [[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected]))](mailto:[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected])))](mailto:[zhenzhong.duan
> > > @intel.com](mailto:[[[email protected]](mailto:[email protected])](mailto:[[email protected]](mailto:[email protected])))))>
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > > ---
> > > > > > > >  hw/i386/intel_iommu_internal.h | 1 -
> > > > > > > >  include/hw/i386/intel_iommu.h  | 2 +-
> > > > > > > >  hw/i386/intel_iommu.c          | 4 ++--
> > > > > > > >  3 files changed, 3 insertions(+), 4 deletions(-)
> > > > > > > > 
> > > > > > > > diff --git a/hw/i386/intel_iommu_internal.h
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > b/hw/i386/intel_iommu_internal.h
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > > index a2ca79f925..71cb3b662e 100644
> > > > > > > > --- a/hw/i386/intel_iommu_internal.h
> > > > > > > > +++ b/hw/i386/intel_iommu_internal.h
> > > > > > > > @@ -194,7 +194,6 @@
> > > > > > > >  #define VTD_ECAP_PRS                (1ULL << 29)
> > > > > > > >  #define VTD_ECAP_MHMV               (15ULL << 20)
> > > > > > > >  #define VTD_ECAP_SRS                (1ULL << 31)
> > > > > > > > -#define VTD_ECAP_PSS                (7ULL << 35) /* limit: 
> > > > > > > > MemTxAttrs::pid
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > */
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > >  #define VTD_ECAP_PASID              (1ULL << 40)
> > > > > > > >  #define VTD_ECAP_SMTS               (1ULL << 43)
> > > > > > > >  #define VTD_ECAP_SSTS               (1ULL << 46)
> > > > > > > > diff --git a/include/hw/i386/intel_iommu.h
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > b/include/hw/i386/intel_iommu.h
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > > index 6c61fd39c7..5e5779e460 100644
> > > > > > > > --- a/include/hw/i386/intel_iommu.h
> > > > > > > > +++ b/include/hw/i386/intel_iommu.h
> > > > > > > > @@ -315,7 +315,7 @@ struct IntelIOMMUState {
> > > > > > > >      bool buggy_eim;                 /* Force buggy EIM unless 
> > > > > > > > eim=off */
> > > > > > > >      uint8_t aw_bits;                /* Host/IOVA address width 
> > > > > > > > (in bits) */
> > > > > > > >      bool dma_drain;                 /* Whether DMA r/w 
> > > > > > > > draining enabled */
> > > > > > > > -    bool pasid;                     /* Whether to support 
> > > > > > > > PASID */
> > > > > > > > +    uint8_t pasid;                  /* PASID supported in 
> > > > > > > > bits, 0 if not */
> > > > > > > >      bool fs1gp;                     /* First Stage 1-GByte 
> > > > > > > > Page Support */
> > > > > > > > 
> > > > > > > >      /* Transient Mapping, Reserved(0) since VTD spec revision 
> > > > > > > > 3.2 */
> > > > > > > > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> > > > > > > > index e8a6f50a5a..916eb0af5a 100644
> > > > > > > > --- a/hw/i386/intel_iommu.c
> > > > > > > > +++ b/hw/i386/intel_iommu.c
> > > > > > > > @@ -4151,7 +4151,7 @@ static const Property vtd_properties[] = {
> > > > > > > >      DEFINE_PROP_BOOL("x-scalable-mode", IntelIOMMUState,
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > scalable_mode,
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > 
> > > > > > > FALSE),
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > >      DEFINE_PROP_BOOL("x-flts", IntelIOMMUState, fsts, FALSE),
> > > > > > > >      DEFINE_PROP_BOOL("snoop-control", IntelIOMMUState,
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > snoop_control,
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > false),
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > > -    DEFINE_PROP_BOOL("x-pasid-mode", IntelIOMMUState, pasid, 
> > > > > > > > false),
> > > > > > > > +    DEFINE_PROP_UINT8("pasid", IntelIOMMUState, pasid, 0),
> > > > > > > >      DEFINE_PROP_BOOL("dma-drain", IntelIOMMUState, dma_drain,
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > true),
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > >      DEFINE_PROP_BOOL("stale-tm", IntelIOMMUState, stale_tm, 
> > > > > > > > false),
> > > > > > > >      DEFINE_PROP_BOOL("fs1gp", IntelIOMMUState, fs1gp, true),
> > > > > > > > @@ -4981,7 +4981,7 @@ static void vtd_cap_init(IntelIOMMUState 
> > > > > > > > *s)
> > > > > > > >      }
> > > > > > > > 
> > > > > > > >      if (s->pasid) {
> > > > > > > > -        s->ecap |= VTD_ECAP_PASID | VTD_ECAP_PSS;
> > > > > > > > +        s->ecap = VTD_ECAP_PASID | deposit64(s->ecap, 35, 5, 
> > > > > > > > s->pasid -
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > 1);
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > I think this is a bit dangerous, the MemTxAttrs only allow up to 
> > > > > > > 8 bits.
> > > > > > > We have a comment next to the definition of VTD_ECAP_PSS about 
> > > > > > > this.
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > Could you elaborate what dangerous do you see if s->pasid > 8?
> > > > > > MemTxAttrs only allow up to 8bits, then Max PASID Width in emulated
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > device's
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > > PASID capability Register is no more than 8. Emulated device should 
> > > > > > never
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > send
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > > a Request-with-pasid with pasid > 255.
> > > > > > 
> > > > > > Hard code VTD_ECAP_PSS to 8 bits will make us not able to utilize 
> > > > > > the full
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > > pasid
> > > 
> > > 
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > > space of passthrough device if it has larger Max PASID Width value 
> > > > > > in pasid
> > > > > 
> > > > > 
> > > > > 
> > > > > capability.
> > > > > 
> > > > > 
> > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > 
> > > > > The previous approach was to make sure that the kernel never 
> > > > > allocates a too
> > > > > large pasid
> > > > > by limiting the width in the iommu instead of doint it in the 
> > > > > devices. Your patch
> > > > > seems to
> > > > > reverse the problem. Is it something we are ready to accept?
> > > > 
> > > > 
> > > > 
> > > > 
> > > > Not get your concern. Define a hard coded limit looks an overkill.
> > > > How you define too large here, larger than MIN(iommu.VTD_ECAP_PSS, 
> > > > device's
> > > 
> > > 
> > > Max PASID Width)?
> > > 
> > > Oh yep, you are righ, my "too large" is not very explicit.
> > > I mean too large to be passed from an emulated device, all the way down 
> > > to the
> > > iommu, through MemTxAttrs.
> > > 
> > > 
> > > 
> > > > 
> > > > IIUC, kernel should take MIN(iommu.VTD_ECAP_PSS, device's Max PASID 
> > > > Width)
> > > 
> > > 
> > > as the upper limit
> > > 
> > > 
> > > > of pasid range.
> > > 
> > > 
> > > 
> > > Yes, that's true.
> > > Our current implementation makes sure that this MIN is always smaller 
> > > than what
> > > fits in MemTxAttrs.
> > > This is always the case as pss is small enough.
> > > 
> > > Increasing pss means that it's now up to devices to know that the attrs 
> > > cannot
> > > carry a full-width pasid
> > > and expose a lower pasid size to make sure the kernel never allocates an 
> > > out-of-
> > > range pasid.
> > 
> > 
> > 
> > I see your concern.  
> > Looked into RISC-V emulation series 
> > [[https://lore.kernel.org/qemu-devel/[email protected]/](https://lore.kernel.org/qemu-devel/[email protected]/)](https://lore.kernel.org/qemu-devel/[email protected]/](https://lore.kernel.org/qemu-devel/[email protected]/))
> >   
> > which introduced MemTxAttrs.pid, it looks MemTxAttrs.pid is only used by 
> > RISC-V,  
> > E.g., only riscv_iommu_memory_region_index() returns attrs.pid and pass it 
> > to imrc->translate().
> > 
> > For VTD and other vIOMMUs, we create different AddressSpace for different 
> > pasid,  
> > When call imrc->translate() callback, it's enough to go ahead with 
> > AddressSpace,  
> > we don't pass in pasid through iommu_idx parameter.
> > 
> > 
> > 
> > 
> > > This a bit more dagerous for device implementors but I don't see any 
> > > other way to
> > > make accel work without this change. I just wanted to make sure that you 
> > > noticed
> > > the design shift behind your patch.
> > 
> > 
> > 
> > I think it's not an issue with VTD as explained above.
> > 
> > 
> > 
> > 
> > > btw, why do we need to pass the actual value on the command line? 
> > > Couldn't we
> > > fetch the pss supported by
> > > the underlying hardware and use the same value?
> > 
> > 
> > 
> > Because we can have heterogeneous IOMMUs on host, PSS can be different 
> > between them.  
> > Meanwhile, take migration into consideration, it needs to be configurable 
> > by user.
> 
> 
> right
> 
> Thanks   
> cmd
> 
> 
> 
> > Thanks  
> > Zhenzhong
> > 
> > 
> > 
> > 
> > > Thanks!
> > > cmd
> > > 
> > > 
> > > 
> > > > 
> > > > We also have patch12 to ensure vIOMMU's pasid upper limit not bigger 
> > > > than
> > > 
> > > 
> > > host side:
> > > 
> > > 
> > > > 
> > > > @@ -64,6 +65,13 @@ bool vtd_check_hiod_accel(IntelIOMMUState *s,
> > > 
> > > 
> > > VTDHostIOMMUDevice *vtd_hiod,
> > > 
> > > 
> > > >          return false;
> > > >      }
> > > > 
> > > > +    /* Only do the check when host device support PASIDs */
> > > > +    if (caps->max_pasid_log2 && s->pasid > hpasid) {
> > > > +        error_setg(errp, "PASID bits size %d > host IOMMU PASID bits 
> > > > size %d",
> > > > +                   s->pasid, hpasid);
> > > > +        return false;
> > > > +    }
> > > > 
> > > > Thanks
> > > > Zhenzhong
> > > 
> > > 
> > 
> >
> 
> 

Reply via email to