[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/2] x86/io: move the list of guest to machine IO ports out of domain_iommu
> -----Original Message----- > From: Roger Pau Monne > Sent: 28 March 2017 14:12 > To: xen-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Roger Pau Monne <roger.pau@xxxxxxxxxx>; Jan Beulich > <jbeulich@xxxxxxxx>; Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Paul > Durrant <Paul.Durrant@xxxxxxxxxx> > Subject: [PATCH v2 2/2] x86/io: move the list of guest to machine IO ports > out of domain_iommu > > There's no reason to store that list inside of the domain_iommu struct, the > forwarding of guest IO ports into machine IO ports is not tied to the presence > of an IOMMU. > > Move it inside of the hvm_domain struct instead. > > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > Cc: Jan Beulich <jbeulich@xxxxxxxx> > Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > Cc: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > xen/arch/x86/domctl.c | 10 +++++----- > xen/arch/x86/hvm/hvm.c | 12 ++++++++++++ > xen/arch/x86/hvm/io.c | 4 ++-- > xen/drivers/passthrough/x86/iommu.c | 11 ----------- > xen/include/asm-x86/hvm/domain.h | 3 +++ > xen/include/asm-x86/iommu.h | 1 - > 6 files changed, 22 insertions(+), 19 deletions(-) > > diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c > index 1220224..b7b8748 100644 > --- a/xen/arch/x86/domctl.c > +++ b/xen/arch/x86/domctl.c > @@ -721,11 +721,11 @@ long arch_do_domctl( > > case XEN_DOMCTL_ioport_mapping: > { > - struct domain_iommu *hd; > unsigned int fgp = domctl->u.ioport_mapping.first_gport; > unsigned int fmp = domctl->u.ioport_mapping.first_mport; > unsigned int np = domctl->u.ioport_mapping.nr_ports; > unsigned int add = domctl->u.ioport_mapping.add_mapping; > + struct hvm_domain *hvm_domain; > struct g2m_ioport *g2m_ioport; > int found = 0; > > @@ -747,14 +747,14 @@ long arch_do_domctl( > if ( ret ) > break; > > - hd = dom_iommu(d); > + hvm_domain = &d->arch.hvm_domain; > if ( add ) > { > printk(XENLOG_G_INFO > "ioport_map:add: dom%d gport=%x mport=%x nr=%x\n", > d->domain_id, fgp, fmp, np); > > - list_for_each_entry(g2m_ioport, &hd->arch.g2m_ioport_list, list) > + list_for_each_entry(g2m_ioport, &hvm_domain->g2m_ioport_list, > list) > if (g2m_ioport->mport == fmp ) > { > g2m_ioport->gport = fgp; > @@ -773,7 +773,7 @@ long arch_do_domctl( > g2m_ioport->gport = fgp; > g2m_ioport->mport = fmp; > g2m_ioport->np = np; > - list_add_tail(&g2m_ioport->list, &hd->arch.g2m_ioport_list); > + list_add_tail(&g2m_ioport->list, > &hvm_domain->g2m_ioport_list); > } > if ( !ret ) > ret = ioports_permit_access(d, fmp, fmp + np - 1); > @@ -788,7 +788,7 @@ long arch_do_domctl( > printk(XENLOG_G_INFO > "ioport_map:remove: dom%d gport=%x mport=%x nr=%x\n", > d->domain_id, fgp, fmp, np); > - list_for_each_entry(g2m_ioport, &hd->arch.g2m_ioport_list, list) > + list_for_each_entry(g2m_ioport, &hvm_domain->g2m_ioport_list, > list) > if ( g2m_ioport->mport == fmp ) > { > list_del(&g2m_ioport->list); > diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c > index 3a2d001..b6c5c9b 100644 > --- a/xen/arch/x86/hvm/hvm.c > +++ b/xen/arch/x86/hvm/hvm.c > @@ -608,6 +608,7 @@ int hvm_domain_initialise(struct domain *d) > spin_lock_init(&d->arch.hvm_domain.uc_lock); > spin_lock_init(&d->arch.hvm_domain.write_map.lock); > INIT_LIST_HEAD(&d->arch.hvm_domain.write_map.list); > + INIT_LIST_HEAD(&d->arch.hvm_domain.g2m_ioport_list); > > hvm_init_cacheattr_region_list(d); > > @@ -707,6 +708,9 @@ void hvm_domain_relinquish_resources(struct > domain *d) > > void hvm_domain_destroy(struct domain *d) > { > + struct list_head *ioport_list, *tmp; > + struct g2m_ioport *ioport; > + > xfree(d->arch.hvm_domain.io_handler); > d->arch.hvm_domain.io_handler = NULL; > > @@ -722,6 +726,14 @@ void hvm_domain_destroy(struct domain *d) > > xfree(d->arch.hvm_domain.pl_time); > d->arch.hvm_domain.pl_time = NULL; > + > + list_for_each_safe ( ioport_list, tmp, > + &d->arch.hvm_domain.g2m_ioport_list ) > + { > + ioport = list_entry(ioport_list, struct g2m_ioport, list); > + list_del(&ioport->list); > + xfree(ioport); > + } > } > > static int hvm_save_tsc_adjust(struct domain *d, hvm_domain_context_t > *h) > diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c > index 3b3a600..9e00409 100644 > --- a/xen/arch/x86/hvm/io.c > +++ b/xen/arch/x86/hvm/io.c > @@ -171,12 +171,12 @@ static bool_t g2m_portio_accept(const struct > hvm_io_handler *handler, > const ioreq_t *p) > { > struct vcpu *curr = current; > - const struct domain_iommu *dio = dom_iommu(curr->domain); > + const struct hvm_domain *hvm_domain = &curr->domain- > >arch.hvm_domain; > struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io; > struct g2m_ioport *g2m_ioport; > unsigned int start, end; > > - list_for_each_entry( g2m_ioport, &dio->arch.g2m_ioport_list, list ) > + list_for_each_entry( g2m_ioport, &hvm_domain->g2m_ioport_list, list ) > { > start = g2m_ioport->gport; > end = start + g2m_ioport->np; > diff --git a/xen/drivers/passthrough/x86/iommu.c > b/xen/drivers/passthrough/x86/iommu.c > index 750c663..0253823 100644 > --- a/xen/drivers/passthrough/x86/iommu.c > +++ b/xen/drivers/passthrough/x86/iommu.c > @@ -123,7 +123,6 @@ int arch_iommu_domain_init(struct domain *d) > struct domain_iommu *hd = dom_iommu(d); > > spin_lock_init(&hd->arch.mapping_lock); > - INIT_LIST_HEAD(&hd->arch.g2m_ioport_list); > INIT_LIST_HEAD(&hd->arch.mapped_rmrrs); > > return 0; > @@ -131,16 +130,6 @@ int arch_iommu_domain_init(struct domain *d) > > void arch_iommu_domain_destroy(struct domain *d) > { > - const struct domain_iommu *hd = dom_iommu(d); > - struct list_head *ioport_list, *tmp; > - struct g2m_ioport *ioport; > - > - list_for_each_safe ( ioport_list, tmp, &hd->arch.g2m_ioport_list ) > - { > - ioport = list_entry(ioport_list, struct g2m_ioport, list); > - list_del(&ioport->list); > - xfree(ioport); > - } > } > > /* > diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm- > x86/hvm/domain.h > index 420cbdc..bdfc082 100644 > --- a/xen/include/asm-x86/hvm/domain.h > +++ b/xen/include/asm-x86/hvm/domain.h > @@ -180,6 +180,9 @@ struct hvm_domain { > > unsigned long *io_bitmap; > > + /* List of guest to machine IO ports mapping. */ > + struct list_head g2m_ioport_list; > + > /* List of permanently write-mapped pages. */ > struct { > spinlock_t lock; > diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h > index be95106..0008505 100644 > --- a/xen/include/asm-x86/iommu.h > +++ b/xen/include/asm-x86/iommu.h > @@ -34,7 +34,6 @@ struct arch_iommu > u64 pgd_maddr; /* io page directory machine address */ > spinlock_t mapping_lock; /* io page table lock */ > int agaw; /* adjusted guest address width, 0 is level 2 30-bit */ > - struct list_head g2m_ioport_list; /* guest to machine ioport mapping */ > u64 iommu_bitmap; /* bitmap of iommu(s) that the domain > uses */ > struct list_head mapped_rmrrs; > > -- > 2.10.1 (Apple Git-78) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |