From patchwork Tue Mar 28 13:12:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Roger_Pau_Monn=C3=A9?= X-Patchwork-Id: 9649463 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 95C4A60113 for ; Tue, 28 Mar 2017 13:19:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9232227F9F for ; Tue, 28 Mar 2017 13:19:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 86D1C2839B; Tue, 28 Mar 2017 13:19:48 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 0D94027F9F for ; Tue, 28 Mar 2017 13:19:48 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1csr0L-0000mM-N8; Tue, 28 Mar 2017 13:17:45 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1csr0K-0000jx-9w for xen-devel@lists.xenproject.org; Tue, 28 Mar 2017 13:17:44 +0000 Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id C6/12-08534-8726AD85; Tue, 28 Mar 2017 13:17:44 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOIsWRWlGSWpSXmKPExsWyU9JRQrc86Va EwYTZ0hbft0xmcmD0OPzhCksAYxRrZl5SfkUCa0bb93nsBY/MKl6/W8HUwNim1cXIySEh4Cex fOc6ZhCbTUBH4uLcnWxdjBwcIgIqErf3GnQxcnEwCyxglLjx/DwTSI2wQJzEif7TYPUsAqoS1 56uA4vzClhKrFv0ih1ipp7EriO/WUHmcApYSTy7IwwSFgIqeXHhBlS5oMTJmU9YQGxmAU2J1u 2/2SFseYnmrbOZIeoVJfrnPWCDGJkuMfFZD8sERv5ZSNpnIWmfhaR9ASPzKkb14tSistQiXXO 9pKLM9IyS3MTMHF1DA2O93NTi4sT01JzEpGK95PzcTYzAAGQAgh2Mjd+dDjFKcjApifJ+CLoV IcSXlJ9SmZFYnBFfVJqTWnyIUYaDQ0mC918CUE6wKDU9tSItMwcYCzBpCQ4eJRHepyBp3uKCx NzizHSI1ClGRSlx3h8gCQGQREZpHlwbLP4uMcpKCfMyAh0ixFOQWpSbWYIq/4pRnINRSZiXOR FoCk9mXgnc9FdAi5mAFovbgC0uSURISTUwTmed7dhVZyyYEtxo+GDrjK6j+tV+Kt+mzrG1sFq otWuel6Bc+eq4cut57jkdK9lWNZ7VeSHA1sc/rfzy4ujInSYsmouT3MtLFfxZVETYfuV7HJr+ 57/3/jdM18pfxcu376xyZWGJeqOusv7Ek8iu7Izfrq4uNW0uc7cdYbKZkSGZ/sFlk6ESS3FGo qEWc1FxIgDwkRG+ugIAAA== X-Env-Sender: prvs=253ff709f=roger.pau@citrix.com X-Msg-Ref: server-4.tower-31.messagelabs.com!1490707056!34403662!3 X-Originating-IP: [185.25.65.24] X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 30151 invoked from network); 28 Mar 2017 13:17:43 -0000 Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24) by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 28 Mar 2017 13:17:43 -0000 X-IronPort-AV: E=Sophos;i="5.36,236,1486425600"; d="scan'208";a="43254589" From: Roger Pau Monne To: Date: Tue, 28 Mar 2017 14:12:26 +0100 Message-ID: <20170328131226.13347-3-roger.pau@citrix.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20170328131226.13347-1-roger.pau@citrix.com> References: <20170328131226.13347-1-roger.pau@citrix.com> MIME-Version: 1.0 X-ClientProxiedBy: AMSPEX02CAS02.citrite.net (10.69.22.113) To AMSPEX02CL02.citrite.net (10.69.22.126) Cc: Andrew Cooper , Paul Durrant , Jan Beulich , Roger Pau Monne Subject: [Xen-devel] [PATCH v2 2/2] x86/io: move the list of guest to machine IO ports out of domain_iommu X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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é Reviewed-by: Paul Durrant --- Cc: Jan Beulich Cc: Andrew Cooper Cc: Paul Durrant --- 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;