[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 05/12] IOMMU: rename and re-type ats_enabled
On Thu, Feb 15, 2024 at 11:15:39AM +0100, Jan Beulich wrote: > Make the variable a tristate, with (as done elsewhere) a negative value > meaning "default". Since all use sites need looking at, also rename it > to match our usual "opt_*" pattern. While touching it, also move it to > .data.ro_after_init. I guess I need to look at further patches, as given the feedback on the past version I think we agreed we want to set ATS unconditionally disabled by default, and hence I'm not sure I see the point of the tri-state if enabling ATS will require an explicit opt-in on the command line (ats=1). > The only place it retains boolean nature is pci_ats_device(), for now. > > In AMD code re-order conditionals to have the config space accesses > after (cheaper) flag checks. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > --- > In domain_context_mapping_one() I'm a little puzzled that translation > type is selected based on only IOMMU and global properties, i.e. not > taking the device itself into account. Is it maybe fine do set DEV_IOTLB unconditionally as long as the IOMMU supports it, and then let the device decide whether it wants to issue translated or non-translated requests depending on whether it supports (and enables) ATS? I think it would be best to limit this strictly to devices that have ATS enabled. > --- > v2: Re-base over new earlier patches. > > --- a/xen/drivers/passthrough/amd/iommu_cmd.c > +++ b/xen/drivers/passthrough/amd/iommu_cmd.c > @@ -282,7 +282,7 @@ void amd_iommu_flush_iotlb(u8 devfn, con > struct amd_iommu *iommu; > unsigned int req_id, queueid, maxpend; > > - if ( !ats_enabled ) > + if ( opt_ats <= 0 ) If having a tri-state is required, won't it be best to decide on a binary value at init time, so that runtime functions can handle opt_ats as a boolean? Otherwise we are open coding the default expectation of what -1 implies (disabled) in all use sites. > return; > > if ( !pci_ats_enabled(pdev->seg, pdev->bus, pdev->devfn) ) > @@ -340,7 +340,7 @@ static void _amd_iommu_flush_pages(struc > flush_command_buffer(iommu, 0); > } > > - if ( ats_enabled ) > + if ( opt_ats > 0 ) > { > amd_iommu_flush_all_iotlbs(d, daddr, order); > > --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c > +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c > @@ -119,7 +119,7 @@ static bool use_ats( > const struct amd_iommu *iommu, > const struct ivrs_mappings *ivrs_dev) > { > - return !ivrs_dev->block_ats && > + return opt_ats > 0 && !ivrs_dev->block_ats && > iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) && > pci_ats_device(iommu->seg, pdev->bus, pdev->devfn); > } > @@ -196,7 +196,7 @@ static int __must_check amd_iommu_setup_ > dte->sys_mgt = MASK_EXTR(ivrs_dev->device_flags, > ACPI_IVHD_SYSTEM_MGMT); > > if ( use_ats(pdev, iommu, ivrs_dev) ) > - dte->i = ats_enabled; > + dte->i = true; Might be easier to just use: dte->i = use_ats(pdev, iommu, ivrs_dev); > > spin_unlock_irqrestore(&iommu->lock, flags); > > @@ -257,7 +257,7 @@ static int __must_check amd_iommu_setup_ > ACPI_IVHD_SYSTEM_MGMT)); > > if ( use_ats(pdev, iommu, ivrs_dev) ) > - ASSERT(dte->i == ats_enabled); > + ASSERT(dte->i); ASSERT(dte->i == use_ats(pdev, iommu, ivrs_dev)); > > spin_unlock_irqrestore(&iommu->lock, flags); > > --- a/xen/drivers/passthrough/ats.c > +++ b/xen/drivers/passthrough/ats.c > @@ -18,8 +18,8 @@ > #include <xen/pci_regs.h> > #include "ats.h" > > -bool __read_mostly ats_enabled; > -boolean_param("ats", ats_enabled); > +int8_t __ro_after_init opt_ats = -1; > +boolean_param("ats", opt_ats); > > int enable_ats_device(struct pci_dev *pdev, struct list_head *ats_list) > { > --- a/xen/drivers/passthrough/ats.h > +++ b/xen/drivers/passthrough/ats.h > @@ -22,7 +22,7 @@ > #define ATS_QUEUE_DEPTH_MASK 0x1f > #define ATS_ENABLE (1<<15) > > -extern bool ats_enabled; > +extern int8_t opt_ats; > > int enable_ats_device(struct pci_dev *pdev, struct list_head *ats_list); > void disable_ats_device(struct pci_dev *pdev); > @@ -43,7 +43,7 @@ static inline int pci_ats_enabled(int se > > static inline int pci_ats_device(int seg, int bus, int devfn) > { > - if ( !ats_enabled ) > + if ( !opt_ats ) > return 0; Can't you remove that check altogether now, since you are adding an opt_ats check to use_ats()? Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |