[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 2/8] AMD/IOMMU: make phantom functions share interrupt remapping tables
> -----Original Message----- > From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of Jan > Beulich > Sent: 19 September 2019 14:22 > To: xen-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Suravee Suthikulpanit > <suravee.suthikulpanit@xxxxxxx> > Subject: [Xen-devel] [PATCH v6 2/8] AMD/IOMMU: make phantom functions share > interrupt remapping tables > > Rather than duplicating entries in amd_iommu_msi_msg_update_ire(), share > the tables. This mainly requires some care while freeing them, to avoid > freeing memory blocks twice. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > v5: New. > > --- > xen/drivers/passthrough/amd/iommu_init.c | 43 +++++++++++++++--------- > xen/drivers/passthrough/amd/iommu_intr.c | 45 > +++++++++++++------------- > xen/drivers/passthrough/amd/pci_amd_iommu.c | 2 - > xen/include/asm-x86/amd-iommu.h | 2 - > xen/include/asm-x86/hvm/svm/amd-iommu-proto.h | 2 - > 5 files changed, 53 insertions(+), 41 deletions(-) > > --- a/xen/drivers/passthrough/amd/iommu_init.c > +++ b/xen/drivers/passthrough/amd/iommu_init.c > @@ -1111,7 +1111,7 @@ static void __init amd_iommu_init_cleanu > amd_iommu_free_intremap_table(list_first_entry(&amd_iommu_head, > struct amd_iommu, > list), > - NULL); > + NULL, 0); > > /* free amd iommu list */ > list_for_each_entry_safe ( iommu, next, &amd_iommu_head, list ) > @@ -1176,7 +1176,7 @@ int iterate_ivrs_mappings(int (*handler) > } > > int iterate_ivrs_entries(int (*handler)(const struct amd_iommu *, > - struct ivrs_mappings *)) > + struct ivrs_mappings *, uint16_t > bdf)) > { > u16 seg = 0; > int rc = 0; > @@ -1193,7 +1193,7 @@ int iterate_ivrs_entries(int (*handler)( > const struct amd_iommu *iommu = map[bdf].iommu; > > if ( iommu && map[bdf].dte_requestor_id == bdf ) > - rc = handler(iommu, &map[bdf]); > + rc = handler(iommu, &map[bdf], bdf); > } > } while ( !rc && ++seg ); > > @@ -1286,20 +1286,29 @@ static int __init amd_iommu_setup_device > > if ( pdev ) > { > - unsigned int req_id = bdf; > - > - do { > - ivrs_mappings[req_id].intremap_table = > - amd_iommu_alloc_intremap_table( > - ivrs_mappings[bdf].iommu, > - &ivrs_mappings[req_id].intremap_inuse); > - if ( !ivrs_mappings[req_id].intremap_table ) > - return -ENOMEM; > - > - if ( !pdev->phantom_stride ) > - break; > - req_id += pdev->phantom_stride; > - } while ( PCI_SLOT(req_id) == pdev->sbdf.dev ); > + ivrs_mappings[bdf].intremap_table = > + amd_iommu_alloc_intremap_table( > + ivrs_mappings[bdf].iommu, > + &ivrs_mappings[bdf].intremap_inuse); > + if ( !ivrs_mappings[bdf].intremap_table ) > + return -ENOMEM; > + > + if ( pdev->phantom_stride ) > + { > + unsigned int req_id = bdf; > + > + for ( ; ; ) > + { > + req_id += pdev->phantom_stride; > + if ( PCI_SLOT(req_id) != pdev->sbdf.dev ) > + break; > + > + ivrs_mappings[req_id].intremap_table = > + ivrs_mappings[bdf].intremap_table; > + ivrs_mappings[req_id].intremap_inuse = > + ivrs_mappings[bdf].intremap_inuse; > + } > + } > } > > amd_iommu_set_intremap_table( > --- a/xen/drivers/passthrough/amd/iommu_intr.c > +++ b/xen/drivers/passthrough/amd/iommu_intr.c > @@ -711,33 +711,20 @@ int amd_iommu_msi_msg_update_ire( > > if ( msi_desc->remap_index >= 0 && !msg ) > { > - do { > - update_intremap_entry_from_msi_msg(iommu, bdf, nr, > - &msi_desc->remap_index, > - NULL, NULL); > - if ( !pdev || !pdev->phantom_stride ) > - break; > - bdf += pdev->phantom_stride; > - } while ( PCI_SLOT(bdf) == PCI_SLOT(pdev->devfn) ); > + update_intremap_entry_from_msi_msg(iommu, bdf, nr, > + &msi_desc->remap_index, > + NULL, NULL); > > for ( i = 0; i < nr; ++i ) > msi_desc[i].remap_index = -1; > - if ( pdev ) > - bdf = PCI_BDF2(pdev->bus, pdev->devfn); > } > > if ( !msg ) > return 0; > > - do { > - rc = update_intremap_entry_from_msi_msg(iommu, bdf, nr, > - &msi_desc->remap_index, > - msg, &data); > - if ( rc || !pdev || !pdev->phantom_stride ) > - break; > - bdf += pdev->phantom_stride; > - } while ( PCI_SLOT(bdf) == PCI_SLOT(pdev->devfn) ); > - > + rc = update_intremap_entry_from_msi_msg(iommu, bdf, nr, > + &msi_desc->remap_index, > + msg, &data); > if ( !rc ) > { > for ( i = 1; i < nr; ++i ) > @@ -790,12 +777,27 @@ void amd_iommu_read_msi_from_ire( > } > > int amd_iommu_free_intremap_table( > - const struct amd_iommu *iommu, struct ivrs_mappings *ivrs_mapping) > + const struct amd_iommu *iommu, struct ivrs_mappings *ivrs_mapping, > + uint16_t bdf) > { > void **tblp; > > if ( ivrs_mapping ) > { > + unsigned int i; > + > + /* > + * PCI device phantom functions use the same tables as their "base" > + * function: Look ahead to zap the pointers. > + */ > + for ( i = 1; PCI_FUNC(bdf + i) && bdf + i < ivrs_bdf_entries; ++i ) > + if ( ivrs_mapping[i].intremap_table == > + ivrs_mapping->intremap_table ) > + { > + ivrs_mapping[i].intremap_table = NULL; > + ivrs_mapping[i].intremap_inuse = NULL; > + } > + > XFREE(ivrs_mapping->intremap_inuse); > tblp = &ivrs_mapping->intremap_table; > } > @@ -934,7 +936,8 @@ static void dump_intremap_table(const st > } > > static int dump_intremap_mapping(const struct amd_iommu *iommu, > - struct ivrs_mappings *ivrs_mapping) > + struct ivrs_mappings *ivrs_mapping, > + uint16_t unused) > { > unsigned long flags; > > --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c > +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c > @@ -519,7 +519,7 @@ static int amd_iommu_remove_device(u8 de > if ( amd_iommu_perdev_intremap && > ivrs_mappings[bdf].dte_requestor_id == bdf && > ivrs_mappings[bdf].intremap_table ) > - amd_iommu_free_intremap_table(iommu, &ivrs_mappings[bdf]); > + amd_iommu_free_intremap_table(iommu, &ivrs_mappings[bdf], bdf); > > return 0; > } > --- a/xen/include/asm-x86/amd-iommu.h > +++ b/xen/include/asm-x86/amd-iommu.h > @@ -131,7 +131,7 @@ extern u8 ivhd_type; > struct ivrs_mappings *get_ivrs_mappings(u16 seg); > int iterate_ivrs_mappings(int (*)(u16 seg, struct ivrs_mappings *)); > int iterate_ivrs_entries(int (*)(const struct amd_iommu *, > - struct ivrs_mappings *)); > + struct ivrs_mappings *, uint16_t)); > > /* iommu tables in guest space */ > struct mmio_reg { > --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h > +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h > @@ -101,7 +101,7 @@ int amd_iommu_setup_ioapic_remapping(voi > void *amd_iommu_alloc_intremap_table( > const struct amd_iommu *, unsigned long **); > int amd_iommu_free_intremap_table( > - const struct amd_iommu *, struct ivrs_mappings *); > + const struct amd_iommu *, struct ivrs_mappings *, uint16_t); > void amd_iommu_ioapic_update_ire( > unsigned int apic, unsigned int reg, unsigned int value); > unsigned int amd_iommu_read_ioapic_from_ire( > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |