From patchwork Wed May 10 14:03:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksandr Tyshchenko X-Patchwork-Id: 9719909 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 A676B6035D for ; Wed, 10 May 2017 14:06:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9808C28602 for ; Wed, 10 May 2017 14:06:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8CE7928608; Wed, 10 May 2017 14:06:04 +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=-3.6 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID 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 22D1F28602 for ; Wed, 10 May 2017 14:06:04 +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 1d8SDS-0007Ch-6N; Wed, 10 May 2017 14:03:46 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d8SDQ-0007AQ-AN for xen-devel@lists.xenproject.org; Wed, 10 May 2017 14:03:44 +0000 Received: from [193.109.254.147] by server-11.bemta-6.messagelabs.com id 7D/FE-03587-FBD13195; Wed, 10 May 2017 14:03:43 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGIsWRWlGSWpSXmKPExsVyMbThsO5+WeF Ig4vvuC2+b5nM5MDocfjDFZYAxijWzLyk/IoE1ownDY9YCzZpVty40svSwPhOvouRi0NIYAaj RP+hKawgDovASxaJDxtmsIE4EgL9rBIT+q+wdzFyADlxEm0b8roYOYHMKolzt/+zgthCAkoSr 3duZoKYNItJ4vilo2wgCTYBA4n9756wg9giQEX3Vk1mArGZBcolemYuA6sRFgiSmDJ5NSOIzS KgKvGu+R2YzSvgLHHx0SZ2iGVyEjfPdTKD2JwCLhI7Xt9hgVjsLPH/43fWCYwCCxgZVjFqFKc WlaUW6Rob6CUVZaZnlOQmZuboGhqY6eWmFhcnpqfmJCYV6yXn525iBIYWAxDsYPy7NvAQoyQH k5Ior+4uoUghvqT8lMqMxOKM+KLSnNTiQ4wyHBxKErwXZIQjhQSLUtNTK9Iyc4BBDpOW4OBRE uE9KgGU5i0uSMwtzkyHSJ1iNOZ4cfn9eyaOJyt/vGcSYsnLz0uVEuftApkkAFKaUZoHNwgWfZ cYZaWEeRmBThPiKUgtys0sQZV/xSjOwagkzHsRZApPZl4J3L5XQKcwAZ0SyCAAckpJIkJKqoF RXOzZef3PG57INs6Xnbrc83xGhcz/GB6tosYvn5Z+DHGKrJjNZP85WDSrTfFLnUyz5Ba+tU1b y3a88vR4L92XJ7dV5LPcAxPRP1OOSd/5nXPk8rfJz/VmX1Dl/PzJZm5h9MWaOYcjt7fwdxTya lrtkIqt+MG66lx2BF+6QGNV4wsDlewjW4WUWIozEg21mIuKEwHdXjvXuQIAAA== X-Env-Sender: olekstysh@gmail.com X-Msg-Ref: server-7.tower-27.messagelabs.com!1494425023!96762410!1 X-Originating-IP: [209.85.128.195] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.12; banners=-,-,- X-VirusChecked: Checked Received: (qmail 55104 invoked from network); 10 May 2017 14:03:43 -0000 Received: from mail-wr0-f195.google.com (HELO mail-wr0-f195.google.com) (209.85.128.195) by server-7.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 10 May 2017 14:03:43 -0000 Received: by mail-wr0-f195.google.com with SMTP id v42so8710043wrc.3 for ; Wed, 10 May 2017 07:03:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mPKxHQkAuT3FRQnL5UFmfNnUYtB8jtol1AvoEsomHN0=; b=uPMX/t0IvFh9biGbi5z+/fC5yYYbuYXuQvguKyU7bQ2eKj+/xfX1AXxNPTyG0XmFGL 2FKCA8qSfwgOJZ0rUwgg/WkUOJX6oycwWLRUfEXoUpeVj6fxloV4g41anaurehDnrWRC fiqAGpXzsBmeIs8GFSP1Xe9wkujP/KemnowJ0rFYz6cSJaUGND7+OHWh7zEbpty26bLJ FY+GUbd1g/RqE0tvTvwr1K2XDAgRGst8f+Ozs2dEuvao7zsCy3xZ2gNu8aUSW47YiSNu viu27fAflUbiOO9p/m1x0Ae1vXKHmM+9v9J16Q5rxeKcPTJP4Vb+Eeh8FD1JSh8xSYJg yweg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mPKxHQkAuT3FRQnL5UFmfNnUYtB8jtol1AvoEsomHN0=; b=e/IY69zmcUlGelY+TIzbuPQVGnOLeLYYcIDy2Z9D2MsQWfDJZ7vAG2q9kh4modxOoh UGoQeuZrMimGsSLqC0SKRjwMIIQGGjfxG01EdUVufnfKCf4ssrHkNp5MPdrsae0fYfGQ XhJk6PrOW8Vy6i4CTezZtgIQ/zdyjWp114QZ3H3dssoFSaAG5ic8xBNoPHVxxHfAWxe+ vUoOkdFuB7ysfDk4mWK4HXd8t0AdszZRE1aUfmmunqJIyEwwYu5AFcdA0FjEhiT+TSnN 3UNBBmYZgG+mZwv8POd6d4betNnt6qKyCrxoBwv6jRw0MEt8CpfB0tWGEiekXIRIW0D/ y2uw== X-Gm-Message-State: AODbwcBp9gFRX0XRGdY4PvLl76rHwgKy0I45x+JIUEz6AJI7gCZbCZim oxcJF/GKxpeksg== X-Received: by 10.223.166.129 with SMTP id t1mr4329477wrc.116.1494425022831; Wed, 10 May 2017 07:03:42 -0700 (PDT) Received: from otyshchenko.kyiv.epam.com (ll-54.209.223.85.sovam.net.ua. [85.223.209.54]) by smtp.gmail.com with ESMTPSA id c34sm3378304wrc.7.2017.05.10.07.03.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 May 2017 07:03:42 -0700 (PDT) From: Oleksandr Tyshchenko To: xen-devel@lists.xenproject.org Date: Wed, 10 May 2017 17:03:12 +0300 Message-Id: <1494424994-26232-9-git-send-email-olekstysh@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1494424994-26232-1-git-send-email-olekstysh@gmail.com> References: <1494424994-26232-1-git-send-email-olekstysh@gmail.com> Cc: wei.liu2@citrix.com, julien.grall@arm.com, sstabellini@kernel.org, ian.jackson@eu.citrix.com, jbeulich@suse.com Subject: [Xen-devel] [PATCH v1 08/10] iommu: Split iommu_hwdom_init() into arch specific parts 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: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Oleksandr Tyshchenko The "retrieving mapping" code has never executed since iommu_use_hap_pt(d) always returned true on ARM so far. But, with introducing the non-shared IOMMU patch series we can no longer keep this code as is due to the lack of M2P support. In order to retain the current behavior for x86 this code was completely moved to x86 specific part. For ARM we just need to populate IOMMU page table if need_iommu flag is already set and the IOMMU is non-shared. So, the logic on ARM was changed a bit, but no functional change for x86. Signed-off-by: Oleksandr Tyshchenko CC: Jan Beulich CC: Julien Grall --- Changes in V1: - Clarify patch description. --- xen/drivers/passthrough/arm/iommu.c | 7 +++++++ xen/drivers/passthrough/iommu.c | 30 +----------------------------- xen/drivers/passthrough/x86/iommu.c | 36 ++++++++++++++++++++++++++++++++++++ xen/include/xen/iommu.h | 1 + 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/xen/drivers/passthrough/arm/iommu.c b/xen/drivers/passthrough/arm/iommu.c index f132032..2198723 100644 --- a/xen/drivers/passthrough/arm/iommu.c +++ b/xen/drivers/passthrough/arm/iommu.c @@ -19,6 +19,7 @@ #include #include #include +#include static const struct iommu_ops *iommu_ops; @@ -59,6 +60,12 @@ void __hwdom_init arch_iommu_check_autotranslated_hwdom(struct domain *d) return; } +void __hwdom_init arch_iommu_hwdom_init(struct domain *d) +{ + if ( need_iommu(d) && !iommu_use_hap_pt(d) ) + arch_iommu_populate_page_table(d); +} + int arch_iommu_domain_init(struct domain *d) { return iommu_dt_domain_init(d); diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index c85f7b4..e66eefb 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -177,36 +177,8 @@ void __hwdom_init iommu_hwdom_init(struct domain *d) register_keyhandler('o', &iommu_dump_p2m_table, "dump iommu p2m table", 0); d->need_iommu = !!iommu_dom0_strict; - if ( need_iommu(d) && !iommu_use_hap_pt(d) ) - { - struct page_info *page; - unsigned int i = 0; - int rc = 0; - - page_list_for_each ( page, &d->page_list ) - { - unsigned long mfn = page_to_mfn(page); - unsigned long gfn = mfn_to_gmfn(d, mfn); - unsigned int mapping = IOMMUF_readable; - int ret; - - if ( ((page->u.inuse.type_info & PGT_count_mask) == 0) || - ((page->u.inuse.type_info & PGT_type_mask) - == PGT_writable_page) ) - mapping |= IOMMUF_writable; - - ret = hd->platform_ops->map_pages(d, gfn, mfn, 0, mapping); - if ( !rc ) - rc = ret; - - if ( !(i++ & 0xfffff) ) - process_pending_softirqs(); - } - if ( rc ) - printk(XENLOG_WARNING "d%d: IOMMU mapping failed: %d\n", - d->domain_id, rc); - } + arch_iommu_hwdom_init(d); return hd->platform_ops->hwdom_init(d); } diff --git a/xen/drivers/passthrough/x86/iommu.c b/xen/drivers/passthrough/x86/iommu.c index 973b72f..904736b 100644 --- a/xen/drivers/passthrough/x86/iommu.c +++ b/xen/drivers/passthrough/x86/iommu.c @@ -118,6 +118,42 @@ void __hwdom_init arch_iommu_check_autotranslated_hwdom(struct domain *d) panic("Presently, iommu must be enabled for PVH hardware domain\n"); } +void __hwdom_init arch_iommu_hwdom_init(struct domain *d) +{ + const struct domain_iommu *hd = dom_iommu(d); + + if ( need_iommu(d) && !iommu_use_hap_pt(d) ) + { + struct page_info *page; + unsigned int i = 0; + int rc = 0; + + page_list_for_each ( page, &d->page_list ) + { + unsigned long mfn = page_to_mfn(page); + unsigned long gfn = mfn_to_gmfn(d, mfn); + unsigned int mapping = IOMMUF_readable; + int ret; + + if ( ((page->u.inuse.type_info & PGT_count_mask) == 0) || + ((page->u.inuse.type_info & PGT_type_mask) + == PGT_writable_page) ) + mapping |= IOMMUF_writable; + + ret = hd->platform_ops->map_pages(d, gfn, mfn, 0, mapping); + if ( !rc ) + rc = ret; + + if ( !(i++ & 0xfffff) ) + process_pending_softirqs(); + } + + if ( rc ) + printk(XENLOG_WARNING "d%d: IOMMU mapping failed: %d\n", + d->domain_id, rc); + } +} + int arch_iommu_domain_init(struct domain *d) { struct domain_iommu *hd = dom_iommu(d); diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index f5914db..be43b28 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -65,6 +65,7 @@ void arch_iommu_domain_destroy(struct domain *d); int arch_iommu_domain_init(struct domain *d); int arch_iommu_populate_page_table(struct domain *d); void arch_iommu_check_autotranslated_hwdom(struct domain *d); +void arch_iommu_hwdom_init(struct domain *d); int iommu_construct(struct domain *d);