From patchwork Mon Mar 27 15:34:54 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: 9647059 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 0C20A602D6 for ; Mon, 27 Mar 2017 15:38:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F0AA728429 for ; Mon, 27 Mar 2017 15:38:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E51A928450; Mon, 27 Mar 2017 15:38:12 +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 2123A28429 for ; Mon, 27 Mar 2017 15:38:12 +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 1csWgW-0005YS-PK; Mon, 27 Mar 2017 15:35:56 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1csWgV-0005Xq-Bo for xen-devel@lists.xenproject.org; Mon, 27 Mar 2017 15:35:55 +0000 Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id 99/49-23854-A5139D85; Mon, 27 Mar 2017 15:35:54 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrJIsWRWlGSWpSXmKPExsWyU9JRQjfC8Ga EQd8Va4vvWyYzOTB6HP5whSWAMYo1My8pvyKBNeNZ93vmgkdmFX+vLWJrYGzT6mLk5JAQ8JO4 trKZDcRmE9CRuDh3J5DNwSEioCJxe69BFyMXB7PAAkaJG8/PM4HUCAtES/y6cI0RxGYRUJX4e P0zK4jNK2AhcexjDyvETD2JXUd+g9mcApYS36+sB+sVAqp5vu42M0S9oMTJmU9YQGxmAU2J1u 2/2SFseYnmrbOZIeoVJfrnPWCDmJkuMfFZD8sERv5ZSNpnIWmfhaR9ASPzKkaN4tSistQiXUN zvaSizPSMktzEzBxdQwNjvdzU4uLE9NScxKRiveT83E2MwCBkAIIdjC9Pex5ilORgUhLlldO+ GSHEl5SfUpmRWJwRX1Sak1p8iFGGg0NJgjffACgnWJSanlqRlpkDjAeYtAQHj5IIbxhImre4I DG3ODMdInWKUVFKnDcOJCEAksgozYNrg8XgJUZZKWFeRqBDhHgKUotyM0tQ5V8xinMwKgnzFo FM4cnMK4Gb/gpoMRPQ4sPzb4AsLklESEk1MBaxzvaIPaX6/OsBhfAc06CpK45Jm184+Mxinej z40tqLPu1ZhRZf+T6FrF5+T8x85gnxo/kz8T7Rtp1Pl//LPebwF/2ly+THbV89+/bfetSOven h+rNExW1Qo6oBms/NY9NSFPKuu6xlak4/NKUo19CAvZPzWD4KKJ7VC/wUOvF/ArzO2dEbymxF GckGmoxFxUnAgCRKvMevAIAAA== X-Env-Sender: prvs=25239713d=roger.pau@citrix.com X-Msg-Ref: server-4.tower-31.messagelabs.com!1490628950!34226189!2 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 3876 invoked from network); 27 Mar 2017 15:35:52 -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; 27 Mar 2017 15:35:52 -0000 X-IronPort-AV: E=Sophos;i="5.36,232,1486425600"; d="scan'208";a="43183844" From: Roger Pau Monne To: Date: Mon, 27 Mar 2017 16:34:54 +0100 Message-ID: <20170327153454.6027-3-roger.pau@citrix.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20170327153454.6027-1-roger.pau@citrix.com> References: <20170327153454.6027-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 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é --- 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 f9d4234..9374073 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 cb567f1..d2ab883 100644 --- a/xen/arch/x86/hvm/io.c +++ b/xen/arch/x86/hvm/io.c @@ -171,12 +171,12 @@ static bool_t hvm_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;