>-----Original Message-----
>From: Clement Mathieu--Drif <[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])>
>> > 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:[zhen
>[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)?

IIUC, kernel should take MIN(iommu.VTD_ECAP_PSS, device's Max PASID Width) as 
the upper limit
of pasid range.

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