[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 3/3] drivers: Make ioapic_sbdf and hpet_sbdf contain pci_sbdf_t
On Mon, Apr 14, 2025 at 08:19:18PM +0100, Andrii Sultanov wrote: > From: Andrii Sultanov <sultanovandriy@xxxxxxxxx> > > Following a similar change to amd_iommu struct, make two more structs > take pci_sbdf_t directly instead of seg and bdf separately. This lets us > drop several conversions from the latter to the former and simplifies > several comparisons and assignments. > > Bloat-o-meter reports: > add/remove: 0/0 grow/shrink: 1/10 up/down: 256/-320 (-64) > Function old new delta > _einittext 22092 22348 +256 > parse_ivrs_hpet 248 245 -3 > amd_iommu_detect_one_acpi 876 868 -8 > iov_supports_xt 275 264 -11 > amd_iommu_read_ioapic_from_ire 344 332 -12 > amd_setup_hpet_msi 237 224 -13 > amd_iommu_ioapic_update_ire 575 555 -20 > reserve_unity_map_for_device 453 424 -29 > _hvm_dpci_msi_eoi 160 128 -32 > amd_iommu_get_supported_ivhd_type 86 30 -56 > parse_ivrs_table 3966 3830 -136 > > Signed-off-by: Andrii Sultanov <sultanovandriy@xxxxxxxxx> > > --- > Changes in V4: > * Folded several separate seg+bdf comparisons and assignments into one > with sbdf_t > * With reshuffling in the prior commits, this commit is no longer > neutral in terms of code size > > Changes in V3: > * Dropped aliasing of seg and bdf, renamed users. > > Changes in V2: > * Split single commit into several patches > * Change the format specifier to %pp in amd_iommu_ioapic_update_ire > --- > xen/drivers/passthrough/amd/iommu.h | 5 +-- > xen/drivers/passthrough/amd/iommu_acpi.c | 30 +++++++--------- > xen/drivers/passthrough/amd/iommu_intr.c | 44 +++++++++++------------- > 3 files changed, 37 insertions(+), 42 deletions(-) > > diff --git a/xen/drivers/passthrough/amd/iommu.h > b/xen/drivers/passthrough/amd/iommu.h > index 2599800e6a..52f748310b 100644 > --- a/xen/drivers/passthrough/amd/iommu.h > +++ b/xen/drivers/passthrough/amd/iommu.h > @@ -262,7 +262,7 @@ int cf_check amd_setup_hpet_msi(struct msi_desc > *msi_desc); > void cf_check amd_iommu_dump_intremap_tables(unsigned char key); > > extern struct ioapic_sbdf { > - u16 bdf, seg; > + pci_sbdf_t sbdf; > u8 id; > bool cmdline; > u16 *pin_2_idx; > @@ -273,7 +273,8 @@ unsigned int ioapic_id_to_index(unsigned int apic_id); > unsigned int get_next_ioapic_sbdf_index(void); > > extern struct hpet_sbdf { > - u16 bdf, seg, id; > + pci_sbdf_t sbdf; > + uint16_t id; > enum { > HPET_NONE, > HPET_CMDL, > diff --git a/xen/drivers/passthrough/amd/iommu_acpi.c > b/xen/drivers/passthrough/amd/iommu_acpi.c > index 9e4fbee953..14845766e6 100644 > --- a/xen/drivers/passthrough/amd/iommu_acpi.c > +++ b/xen/drivers/passthrough/amd/iommu_acpi.c > @@ -707,8 +707,7 @@ static int __init cf_check parse_ivrs_ioapic(const char > *str) > } > } > > - ioapic_sbdf[idx].bdf = PCI_BDF(bus, dev, func); > - ioapic_sbdf[idx].seg = seg; > + ioapic_sbdf[idx].sbdf = PCI_SBDF( seg, PCI_BDF(bus, dev, func) ); PCI_SBDF() is a variadic macro, so, IMO, the line above can be simplified as: ioapic_sbdf[idx].sbdf = PCI_SBDF( seg, bus, dev, func ); Ex: pdev_type() in xen/drivers/passthrough/pci.c Can you please double check in the modified code? > ioapic_sbdf[idx].id = id; > ioapic_sbdf[idx].cmdline = true; > > @@ -734,8 +733,7 @@ static int __init cf_check parse_ivrs_hpet(const char > *str) > return -EINVAL; > > hpet_sbdf.id = id; > - hpet_sbdf.bdf = PCI_BDF(bus, dev, func); > - hpet_sbdf.seg = seg; > + hpet_sbdf.sbdf = PCI_SBDF( seg, PCI_BDF(bus, dev, func) ); ^^ e.g. here it can be simplified too. > hpet_sbdf.init = HPET_CMDL; > > return 0; > @@ -748,6 +746,7 @@ static u16 __init parse_ivhd_device_special( > { > u16 dev_length, bdf; > unsigned int apic, idx; > + pci_sbdf_t sbdf; > > dev_length = sizeof(*special); > if ( header_length < (block_length + dev_length) ) > @@ -757,6 +756,7 @@ static u16 __init parse_ivhd_device_special( > } > > bdf = special->used_id; > + sbdf = PCI_SBDF(seg, bdf); > if ( bdf >= ivrs_bdf_entries ) > { > AMD_IOMMU_ERROR("IVHD: invalid Device_Entry Dev_Id %#x\n", bdf); > @@ -764,7 +764,7 @@ static u16 __init parse_ivhd_device_special( > } > > AMD_IOMMU_DEBUG("IVHD Special: %pp variety %#x handle %#x\n", > - &PCI_SBDF(seg, bdf), special->variety, special->handle); > + &sbdf, special->variety, special->handle); > add_ivrs_mapping_entry(bdf, bdf, special->header.data_setting, 0, true, > iommu); > > @@ -780,8 +780,7 @@ static u16 __init parse_ivhd_device_special( > */ > for ( idx = 0; idx < nr_ioapic_sbdf; idx++ ) > { > - if ( ioapic_sbdf[idx].bdf == bdf && > - ioapic_sbdf[idx].seg == seg && > + if ( ioapic_sbdf[idx].sbdf.sbdf == sbdf.sbdf && > ioapic_sbdf[idx].cmdline ) > break; > } > @@ -790,7 +789,7 @@ static u16 __init parse_ivhd_device_special( > AMD_IOMMU_DEBUG("IVHD: Command line override present for IO-APIC > %#x" > "(IVRS: %#x devID %pp)\n", > ioapic_sbdf[idx].id, special->handle, > - &PCI_SBDF(seg, bdf)); > + &sbdf); > break; > } > > @@ -805,8 +804,7 @@ static u16 __init parse_ivhd_device_special( > special->handle); > else if ( idx != MAX_IO_APICS && ioapic_sbdf[idx].pin_2_idx ) > { > - if ( ioapic_sbdf[idx].bdf == bdf && > - ioapic_sbdf[idx].seg == seg ) > + if ( ioapic_sbdf[idx].sbdf.sbdf == sbdf.sbdf ) > AMD_IOMMU_WARN("IVHD: duplicate IO-APIC %#x entries\n", > special->handle); > else > @@ -827,8 +825,7 @@ static u16 __init parse_ivhd_device_special( > } > > /* set device id of ioapic */ > - ioapic_sbdf[idx].bdf = bdf; > - ioapic_sbdf[idx].seg = seg; > + ioapic_sbdf[idx].sbdf = sbdf; > ioapic_sbdf[idx].id = special->handle; > > ioapic_sbdf[idx].pin_2_idx = xmalloc_array( > @@ -862,13 +859,12 @@ static u16 __init parse_ivhd_device_special( > AMD_IOMMU_DEBUG("IVHD: Command line override present for HPET > %#x " > "(IVRS: %#x devID %pp)\n", > hpet_sbdf.id, special->handle, > - &PCI_SBDF(seg, bdf)); > + &sbdf); > break; > case HPET_NONE: > /* set device id of hpet */ > hpet_sbdf.id = special->handle; > - hpet_sbdf.bdf = bdf; > - hpet_sbdf.seg = seg; > + hpet_sbdf.sbdf = sbdf; > hpet_sbdf.init = HPET_IVHD; > break; > default: > @@ -1139,9 +1135,9 @@ static int __init cf_check parse_ivrs_table(struct > acpi_table_header *table) > return -ENXIO; > } > > - if ( !ioapic_sbdf[idx].seg && > + if ( !ioapic_sbdf[idx].sbdf.seg && > /* SB IO-APIC is always on this device in AMD systems. */ > - ioapic_sbdf[idx].bdf == PCI_BDF(0, 0x14, 0) ) > + ioapic_sbdf[idx].sbdf.bdf == PCI_BDF(0, 0x14, 0) ) Looks like something like the following should work: if ( ioapic_sbdf[idx].sbdf.sbdf == PCI_SBDF(0, 0, 0x14, 0).sbdf ) What do you think? > sb_ioapic = 1; > > if ( ioapic_sbdf[idx].pin_2_idx ) > diff --git a/xen/drivers/passthrough/amd/iommu_intr.c > b/xen/drivers/passthrough/amd/iommu_intr.c > index 16075cd5a1..b788675be2 100644 > --- a/xen/drivers/passthrough/amd/iommu_intr.c > +++ b/xen/drivers/passthrough/amd/iommu_intr.c > @@ -323,7 +323,8 @@ void cf_check amd_iommu_ioapic_update_ire( > unsigned int apic, unsigned int pin, uint64_t rte) > { > struct IO_APIC_route_entry new_rte; > - int seg, bdf, rc; > + pci_sbdf_t sbdf; > + int rc; > struct amd_iommu *iommu; > unsigned int idx; > > @@ -335,20 +336,18 @@ void cf_check amd_iommu_ioapic_update_ire( > new_rte.raw = rte; > > /* get device id of ioapic devices */ > - bdf = ioapic_sbdf[idx].bdf; > - seg = ioapic_sbdf[idx].seg; > - iommu = find_iommu_for_device(PCI_SBDF(seg, bdf)); > + sbdf = ioapic_sbdf[idx].sbdf; > + iommu = find_iommu_for_device(sbdf); > if ( !iommu ) > { > - AMD_IOMMU_WARN("failed to find IOMMU for IO-APIC @ %04x:%04x\n", > - seg, bdf); > + AMD_IOMMU_WARN("failed to find IOMMU for IO-APIC @ %pp\n", &sbdf); > __ioapic_write_entry(apic, pin, true, new_rte); > return; > } > > /* Update interrupt remapping entry */ > rc = update_intremap_entry_from_ioapic( > - bdf, iommu, &new_rte, > + sbdf.bdf, iommu, &new_rte, > &ioapic_sbdf[idx].pin_2_idx[pin]); > > if ( rc ) > @@ -369,7 +368,8 @@ unsigned int cf_check amd_iommu_read_ioapic_from_ire( > unsigned int offset; > unsigned int val = __io_apic_read(apic, reg); > unsigned int pin = (reg - 0x10) / 2; > - uint16_t seg, bdf, req_id; > + pci_sbdf_t sbdf; > + uint16_t req_id; > const struct amd_iommu *iommu; > union irte_ptr entry; > > @@ -381,12 +381,11 @@ unsigned int cf_check amd_iommu_read_ioapic_from_ire( > if ( offset >= INTREMAP_MAX_ENTRIES ) > return val; > > - seg = ioapic_sbdf[idx].seg; > - bdf = ioapic_sbdf[idx].bdf; > - iommu = find_iommu_for_device(PCI_SBDF(seg, bdf)); > + sbdf = ioapic_sbdf[idx].sbdf; > + iommu = find_iommu_for_device(sbdf); > if ( !iommu ) > return val; > - req_id = get_intremap_requestor_id(seg, bdf); > + req_id = get_intremap_requestor_id(sbdf.seg, sbdf.bdf); > entry = get_intremap_entry(iommu, req_id, offset); > > if ( !(reg & 1) ) > @@ -515,15 +514,15 @@ int cf_check amd_iommu_msi_msg_update_ire( > struct msi_desc *msi_desc, struct msi_msg *msg) > { > struct pci_dev *pdev = msi_desc->dev; > - int bdf, seg, rc; > + pci_sbdf_t sbdf; > + int rc; > struct amd_iommu *iommu; > unsigned int i, nr = 1; > u32 data; > > - bdf = pdev ? pdev->sbdf.bdf : hpet_sbdf.bdf; > - seg = pdev ? pdev->seg : hpet_sbdf.seg; > + sbdf = pdev ? pdev->sbdf : hpet_sbdf.sbdf; > > - iommu = _find_iommu_for_device(PCI_SBDF(seg, bdf)); > + iommu = _find_iommu_for_device(sbdf); > if ( IS_ERR_OR_NULL(iommu) ) > return PTR_ERR(iommu); > > @@ -532,7 +531,7 @@ int cf_check amd_iommu_msi_msg_update_ire( > > if ( msi_desc->remap_index >= 0 && !msg ) > { > - update_intremap_entry_from_msi_msg(iommu, bdf, nr, > + update_intremap_entry_from_msi_msg(iommu, sbdf.bdf, nr, > &msi_desc->remap_index, > NULL, NULL); > > @@ -543,7 +542,7 @@ int cf_check amd_iommu_msi_msg_update_ire( > if ( !msg ) > return 0; > > - rc = update_intremap_entry_from_msi_msg(iommu, bdf, nr, > + rc = update_intremap_entry_from_msi_msg(iommu, sbdf.bdf, nr, > &msi_desc->remap_index, > msg, &data); > if ( rc > 0 ) > @@ -660,8 +659,7 @@ bool __init cf_check iov_supports_xt(void) > if ( idx == MAX_IO_APICS ) > return false; > > - if ( !find_iommu_for_device(PCI_SBDF(ioapic_sbdf[idx].seg, > - ioapic_sbdf[idx].bdf)) ) > + if ( !find_iommu_for_device(ioapic_sbdf[idx].sbdf) ) > { > AMD_IOMMU_WARN("no IOMMU for IO-APIC %#x (ID %x)\n", > apic, IO_APIC_ID(apic)); > @@ -690,14 +688,14 @@ int __init cf_check amd_setup_hpet_msi(struct msi_desc > *msi_desc) > return -ENODEV; > } > > - iommu = find_iommu_for_device(PCI_SBDF(hpet_sbdf.seg, hpet_sbdf.bdf)); > + iommu = find_iommu_for_device(hpet_sbdf.sbdf); > if ( !iommu ) > return -ENXIO; > > - lock = get_intremap_lock(hpet_sbdf.seg, hpet_sbdf.bdf); > + lock = get_intremap_lock(hpet_sbdf.sbdf.seg, hpet_sbdf.sbdf.bdf); > spin_lock_irqsave(lock, flags); > > - msi_desc->remap_index = alloc_intremap_entry(iommu, hpet_sbdf.bdf, 1); > + msi_desc->remap_index = alloc_intremap_entry(iommu, hpet_sbdf.sbdf.bdf, > 1); > if ( msi_desc->remap_index >= INTREMAP_MAX_ENTRIES ) > { > msi_desc->remap_index = -1; > -- > 2.49.0 > > Thanks, Denis
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |