From nobody Wed May 15 23:11:34 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1568803365; cv=none; d=zoho.com; s=zohoarc; b=P+LhEFVu87G5ULVkiNCzKDSfL+f3mYo1OfjLgBwLL/R3LHyE9eNAa1uIFKyQcHVBSDx1TjDclECAqUyD/sXZdEwZCyz3FRByoyCiSzbvBdQqLiHhh6kOb4OkZaIy2ZKkA5wY3OnuYY4EVZ4RxgYeHWmQLeVeXtDV76INjsOdVDo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568803365; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Y6r6fl/05vIXaPcyrNhUZ0PzbohuQozOm/bl14Qc6qE=; b=M554ABFiRZ8UElfMK80R92bcFN8418ZosAHJihfWHPuD8nRYdybyOUxiCm/RFMYTBmCQ1vl9P4fn/rWViXhb9CKQexacZSXwSKUuyCv2KcUB4wN6h8Pf6WbvdYA2pp4H0RSvUmHtLf5isA9+GPNE3l3DoH8wwRhRK4YJeJwtGwM= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1568803365929987.4306695340908; Wed, 18 Sep 2019 03:42:45 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iAXOx-0002l9-D6; Wed, 18 Sep 2019 10:41:35 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iAXOw-0002kU-Ej for xen-devel@lists.xenproject.org; Wed, 18 Sep 2019 10:41:34 +0000 Received: from esa2.hc3370-68.iphmx.com (unknown [216.71.145.153]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id e0a61b9c-da00-11e9-978d-bc764e2007e4; Wed, 18 Sep 2019 10:41:32 +0000 (UTC) X-Inumbo-ID: e0a61b9c-da00-11e9-978d-bc764e2007e4 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1568803292; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=bchqXSX8RRJ4e1r2GvL6y7SH+GaGybpCY+SwEP3DimE=; b=D/eNnmVOXW9a+RBpbj3BcNlHXfi6MJFX8iNER+heKfUdLdSphLK75nns TbpiLNm72XmyIykk2U7UeuZBcfxsmEQCMaoqfryldgxgm8Co1RGlOy9o+ TUQDmgzH1uLFchanTM5Ky8hEnZJMsBM1rvwTnrdTY/oongZvE3h4k4h1+ M=; Authentication-Results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=paul.durrant@citrix.com; spf=Pass smtp.mailfrom=Paul.Durrant@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: None (esa2.hc3370-68.iphmx.com: no sender authenticity information available from domain of paul.durrant@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa2.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="paul.durrant@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa2.hc3370-68.iphmx.com: domain of Paul.Durrant@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa2.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="Paul.Durrant@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa2.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa2.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: omJymZALtUTczSq+soknfxriKpcPqQ7iM37W2aqz7ovqil3lC6CDh2syHRiqdrre8rFABsG338 JUztFyZLwsDnjQ0cc1/+X/zXCSremKckVvaa68/gEAfTORFIf9hQJBO1GQUMqHHauRmRCwYosW CWmFFY1tMvs2ykUa6RGFNC8NatQwGbQJhVTIGyL4BlJUrrgi6Qun9if2vqXJQ8AEpLtdTJVFea R9JarmrFvUAn7Vw0EI1/o6nnbDSQOquLJqtTbw2w17y28lwPsPEQkukDHYmrxNU7OitydSes76 pmY= X-SBRS: 2.7 X-MesageID: 5717432 X-Ironport-Server: esa2.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.64,520,1559534400"; d="scan'208";a="5717432" From: Paul Durrant To: Date: Wed, 18 Sep 2019 11:41:10 +0100 Message-ID: <20190918104113.3294-2-paul.durrant@citrix.com> X-Mailer: git-send-email 2.20.1.2.gb21ebb671 In-Reply-To: <20190918104113.3294-1-paul.durrant@citrix.com> References: <20190918104113.3294-1-paul.durrant@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v13 1/4] remove late (on-demand) construction of IOMMU page tables X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Petre Pircalabu , Stefano Stabellini , Wei Liu , Razvan Cojocaru , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Paul Durrant , Tamas K Lengyel , Jan Beulich , Alexandru Isaila , Volodymyr Babchuk , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Now that there is a per-domain IOMMU-enable flag, which should be set if any device is going to be passed through, stop deferring page table construction until the assignment is done. Also don't tear down the tables again when the last device is de-assigned; defer that task until domain destruction. This allows the has_iommu_pt() helper and iommu_status enumeration to be removed. Calls to has_iommu_pt() are simply replaced by calls to is_iommu_enabled(). Remaining open-coded tests of iommu_hap_pt_share can also be replaced by calls to iommu_use_hap_pt(). The arch_iommu_populate_page_table() and iommu_construct() functions become redundant, as does the 'strict mode' dom0 page_list mapping code in iommu_hwdom_init(), and iommu_teardown() can be made static is its only remaining caller, iommu_domain_destroy(), is within the same source module. All in all, about 220 lines of code are removed from the hypervisor (at the expense of some additions in the toolstack). NOTE: This patch will cause a small amount of extra resource to be used to accommodate IOMMU page tables that may never be used, since the per-domain IOMMU-enable flag is currently set to the value of the global iommu_enable flag. A subsequent patch will add an option to the toolstack to allow it to be turned off if there is no intention to assign passthrough hardware to the domain. To account for the extra resource, 'iommu_memkb' has been added to domain_build_info. This patch sets it to a value calculated based on the domain's maximum memory when the P2M sharing is either not supported or globally disabled, or zero otherwise. However, when the toolstack option mentioned above is added, it will also be zero if the per-domain IOMMU-enable flag is turned off. Signed-off-by: Paul Durrant Reviewed-by: Alexandru Isaila Acked-by: Razvan Cojocaru Reviewed-by: Jan Beulich Acked-by: Julien Grall Acked-by: Wei Liu --- Cc: Stefano Stabellini Cc: Volodymyr Babchuk Cc: Andrew Cooper Cc: George Dunlap Cc: Ian Jackson Cc: Konrad Rzeszutek Wilk Cc: Tim Deegan Cc: Wei Liu Cc: "Roger Pau Monn=C3=A9" Cc: Tamas K Lengyel Cc: George Dunlap Cc: Petre Pircalabu Previously part of series https://lists.xenproject.org/archives/html/xen-de= vel/2019-07/msg02267.html v9: - Avoid the iommu_memkb overhead if the IOMMU is disable or page tables are shared v7: - Add toolstack memory reservation for IOMMU page tables... Re-use of shadow calculation didn't seem appropriate so a new helper function is added v5: - Minor style fixes --- tools/libxl/libxl.h | 7 ++ tools/libxl/libxl_mem.c | 6 +- tools/libxl/libxl_types.idl | 1 + tools/libxl/libxl_utils.c | 15 +++ tools/libxl/libxl_utils.h | 1 + tools/xl/xl_parse.c | 24 ++++- xen/arch/arm/p2m.c | 2 +- xen/arch/x86/dom0_build.c | 2 +- xen/arch/x86/hvm/mtrr.c | 5 +- xen/arch/x86/mm/mem_sharing.c | 2 +- xen/arch/x86/mm/p2m.c | 4 +- xen/arch/x86/mm/paging.c | 2 +- xen/arch/x86/x86_64/mm.c | 2 +- xen/common/memory.c | 4 +- xen/common/vm_event.c | 2 +- xen/drivers/passthrough/device_tree.c | 11 --- xen/drivers/passthrough/iommu.c | 134 ++++++-------------------- xen/drivers/passthrough/pci.c | 12 --- xen/drivers/passthrough/vtd/iommu.c | 10 +- xen/drivers/passthrough/x86/iommu.c | 97 ------------------- xen/include/asm-arm/iommu.h | 2 +- xen/include/asm-x86/iommu.h | 2 +- xen/include/xen/iommu.h | 16 --- xen/include/xen/sched.h | 2 - 24 files changed, 94 insertions(+), 271 deletions(-) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 8169d44bda..12545130df 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -408,6 +408,13 @@ */ #define LIBXL_HAVE_PHYSINFO_CAP_IOMMU_HAP_PT_SHARE 1 =20 +/* + * LIBXL_HAVE_BUILDINFO_IOMMU_MEMKB indicates thate libxl_domain_build_info + * has an iommu_memkb field which should be set with the amount of memory + * overhead needed by the domain for populating IOMMU page tables. + */ +#define LIBXL_HAVE_BUILDINFO_IOMMU_MEMKB 1 + /* * libxl ABI compatibility * diff --git a/tools/libxl/libxl_mem.c b/tools/libxl/libxl_mem.c index 448a2af8fd..fd6f33312e 100644 --- a/tools/libxl/libxl_mem.c +++ b/tools/libxl/libxl_mem.c @@ -461,15 +461,17 @@ int libxl_domain_need_memory(libxl_ctx *ctx, if (rc) goto out; =20 *need_memkb =3D b_info->target_memkb; + *need_memkb +=3D b_info->shadow_memkb + b_info->iommu_memkb; + switch (b_info->type) { case LIBXL_DOMAIN_TYPE_PVH: case LIBXL_DOMAIN_TYPE_HVM: - *need_memkb +=3D b_info->shadow_memkb + LIBXL_HVM_EXTRA_MEMORY; + *need_memkb +=3D LIBXL_HVM_EXTRA_MEMORY; if (libxl_defbool_val(b_info->device_model_stubdomain)) *need_memkb +=3D 32 * 1024; break; case LIBXL_DOMAIN_TYPE_PV: - *need_memkb +=3D b_info->shadow_memkb + LIBXL_PV_EXTRA_MEMORY; + *need_memkb +=3D LIBXL_PV_EXTRA_MEMORY; break; default: rc =3D ERROR_INVAL; diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 7253d6e0fb..d52c63b6b0 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -486,6 +486,7 @@ libxl_domain_build_info =3D Struct("domain_build_info",[ ("target_memkb", MemKB), ("video_memkb", MemKB), ("shadow_memkb", MemKB), + ("iommu_memkb", MemKB), ("rtc_timeoffset", uint32), ("exec_ssidref", uint32), ("exec_ssid_label", string), diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index f360f5e228..405733b7e1 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -48,6 +48,21 @@ unsigned long libxl_get_required_shadow_memory(unsigned = long maxmem_kb, unsigned return 4 * (256 * smp_cpus + 2 * (maxmem_kb / 1024)); } =20 +unsigned long libxl_get_required_iommu_memory(unsigned long maxmem_kb) +{ + unsigned long iommu_pages =3D 0, mem_pages =3D maxmem_kb / 4; + unsigned int level; + + /* Assume a 4 level page table with 512 entries per level */ + for (level =3D 0; level < 4; level++) + { + mem_pages =3D DIV_ROUNDUP(mem_pages, 512); + iommu_pages +=3D mem_pages; + } + + return iommu_pages * 4; +} + char *libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid) { unsigned int len; diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 44409afdc4..630ccbe28a 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -24,6 +24,7 @@ const char *libxl_basename(const char *name); /* returns string from strdup */ =20 unsigned long libxl_get_required_shadow_memory(unsigned long maxmem_kb, un= signed int smp_cpus); +unsigned long libxl_get_required_iommu_memory(unsigned long maxmem_kb); int libxl_name_to_domid(libxl_ctx *ctx, const char *name, uint32_t *domid); int libxl_domain_qualifier_to_domid(libxl_ctx *ctx, const char *name, uint= 32_t *domid); char *libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid); diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index e105bda2bb..293f5f730e 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -1207,6 +1207,7 @@ void parse_config_data(const char *config_source, int config_len, libxl_domain_config *d_config) { + libxl_physinfo physinfo; const char *buf; long l, vcpus =3D 0; XLU_Config *config; @@ -1221,10 +1222,22 @@ void parse_config_data(const char *config_source, int pci_seize =3D 0; int i, e; char *kernel_basename; + bool iommu_enabled, iommu_hap_pt_share; =20 libxl_domain_create_info *c_info =3D &d_config->c_info; libxl_domain_build_info *b_info =3D &d_config->b_info; =20 + libxl_physinfo_init(&physinfo); + if (libxl_get_physinfo(ctx, &physinfo) !=3D 0) { + libxl_physinfo_dispose(&physinfo); + fprintf(stderr, "libxl_get_physinfo failed\n"); + exit(EXIT_FAILURE); + } + + iommu_enabled =3D physinfo.cap_hvm_directio; + iommu_hap_pt_share =3D physinfo.cap_iommu_hap_pt_share; + libxl_physinfo_dispose(&physinfo); + config=3D xlu_cfg_init(stderr, config_source); if (!config) { fprintf(stderr, "Failed to allocate for configuration\n"); @@ -1448,14 +1461,21 @@ void parse_config_data(const char *config_source, exit(1); } =20 - /* libxl_get_required_shadow_memory() must be called after final values + /* libxl_get_required_shadow_memory() and + * libxl_get_required_iommu_memory() must be called after final values * (default or specified) for vcpus and memory are set, because the - * calculation depends on those values. */ + * calculations depend on those values. */ b_info->shadow_memkb =3D !xlu_cfg_get_long(config, "shadow_memory", &l= , 0) ? l * 1024 : libxl_get_required_shadow_memory(b_info->max_memkb, b_info->max_vcpus); =20 + /* No IOMMU reservation is needed if either the IOMMU is disabled or it + * can share the P2M. */ + b_info->iommu_memkb =3D (!iommu_enabled || iommu_hap_pt_share) + ? 0 + : libxl_get_required_iommu_memory(b_info->max_memkb); + xlu_cfg_get_defbool(config, "nomigrate", &b_info->disable_migrate, 0); =20 if (!xlu_cfg_get_long(config, "tsc_mode", &l, 1)) { diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index 7f1442932a..692565757e 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -1056,7 +1056,7 @@ static int __p2m_set_entry(struct p2m_domain *p2m, !mfn_eq(lpae_get_mfn(*entry), lpae_get_mfn(orig_pte)) ) p2m_free_entry(p2m, orig_pte, level); =20 - if ( has_iommu_pt(p2m->domain) && + if ( is_iommu_enabled(p2m->domain) && (lpae_is_valid(orig_pte) || lpae_is_valid(*entry)) ) { unsigned int flush_flags =3D 0; diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c index d381784edd..7cfab2dc25 100644 --- a/xen/arch/x86/dom0_build.c +++ b/xen/arch/x86/dom0_build.c @@ -365,7 +365,7 @@ unsigned long __init dom0_compute_nr_pages( } =20 need_paging =3D is_hvm_domain(d) && - (!iommu_hap_pt_share || !paging_mode_hap(d)); + (!iommu_use_hap_pt(d) || !paging_mode_hap(d)); for ( ; ; need_paging =3D false ) { nr_pages =3D get_memsize(&dom0_size, avail); diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c index 7ccd85bcea..5ad15eafe0 100644 --- a/xen/arch/x86/hvm/mtrr.c +++ b/xen/arch/x86/hvm/mtrr.c @@ -783,7 +783,8 @@ HVM_REGISTER_SAVE_RESTORE(MTRR, hvm_save_mtrr_msr, hvm_= load_mtrr_msr, 1, =20 void memory_type_changed(struct domain *d) { - if ( (has_iommu_pt(d) || cache_flush_permitted(d)) && d->vcpu && d->vc= pu[0] ) + if ( (is_iommu_enabled(d) || cache_flush_permitted(d)) && + d->vcpu && d->vcpu[0] ) { p2m_memory_type_changed(d); flush_all(FLUSH_CACHE); @@ -831,7 +832,7 @@ int epte_get_entry_emt(struct domain *d, unsigned long = gfn, mfn_t mfn, return MTRR_TYPE_UNCACHABLE; } =20 - if ( !has_iommu_pt(d) && !cache_flush_permitted(d) ) + if ( !is_iommu_enabled(d) && !cache_flush_permitted(d) ) { *ipat =3D 1; return MTRR_TYPE_WRBACK; diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c index a5fe89e339..efb8821768 100644 --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -1664,7 +1664,7 @@ int mem_sharing_domctl(struct domain *d, struct xen_d= omctl_mem_sharing_op *mec) case XEN_DOMCTL_MEM_SHARING_CONTROL: { rc =3D 0; - if ( unlikely(has_iommu_pt(d) && mec->u.enable) ) + if ( unlikely(is_iommu_enabled(d) && mec->u.enable) ) rc =3D -EXDEV; else d->arch.hvm.mem_sharing_enabled =3D mec->u.enable; diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 8a5229ee21..e5e4349dea 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -1341,7 +1341,7 @@ int set_identity_p2m_entry(struct domain *d, unsigned= long gfn_l, =20 if ( !paging_mode_translate(p2m->domain) ) { - if ( !has_iommu_pt(d) ) + if ( !is_iommu_enabled(d) ) return 0; return iommu_legacy_map(d, _dfn(gfn_l), _mfn(gfn_l), PAGE_ORDER_4K, IOMMUF_readable | IOMMUF_writable); @@ -1432,7 +1432,7 @@ int clear_identity_p2m_entry(struct domain *d, unsign= ed long gfn_l) =20 if ( !paging_mode_translate(d) ) { - if ( !has_iommu_pt(d) ) + if ( !is_iommu_enabled(d) ) return 0; return iommu_legacy_unmap(d, _dfn(gfn_l), PAGE_ORDER_4K); } diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c index 69aa228e46..d9a52c4db4 100644 --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -213,7 +213,7 @@ int paging_log_dirty_enable(struct domain *d, bool_t lo= g_global) { int ret; =20 - if ( has_iommu_pt(d) && log_global ) + if ( is_iommu_enabled(d) && log_global ) { /* * Refuse to turn on global log-dirty mode diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 795a467462..fa55f3474e 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -1434,7 +1434,7 @@ int memory_add(unsigned long spfn, unsigned long epfn= , unsigned int pxm) * shared or being kept in sync then newly added memory needs to be * mapped here. */ - if ( has_iommu_pt(hardware_domain) && + if ( is_iommu_enabled(hardware_domain) && !iommu_use_hap_pt(hardware_domain) && !need_iommu_pt_sync(hardware_domain) ) { diff --git a/xen/common/memory.c b/xen/common/memory.c index d5aff83f2d..7364fd2c33 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -823,7 +823,7 @@ int xenmem_add_to_physmap(struct domain *d, struct xen_= add_to_physmap *xatp, xatp->gpfn +=3D start; xatp->size -=3D start; =20 - if ( has_iommu_pt(d) ) + if ( is_iommu_enabled(d) ) this_cpu(iommu_dont_flush_iotlb) =3D 1; =20 while ( xatp->size > done ) @@ -844,7 +844,7 @@ int xenmem_add_to_physmap(struct domain *d, struct xen_= add_to_physmap *xatp, } } =20 - if ( has_iommu_pt(d) ) + if ( is_iommu_enabled(d) ) { int ret; =20 diff --git a/xen/common/vm_event.c b/xen/common/vm_event.c index 2a1c87e44b..3b18195ebf 100644 --- a/xen/common/vm_event.c +++ b/xen/common/vm_event.c @@ -630,7 +630,7 @@ int vm_event_domctl(struct domain *d, struct xen_domctl= _vm_event_op *vec) =20 /* No paging if iommu is used */ rc =3D -EMLINK; - if ( unlikely(has_iommu_pt(d)) ) + if ( unlikely(is_iommu_enabled(d)) ) break; =20 rc =3D -EXDEV; diff --git a/xen/drivers/passthrough/device_tree.c b/xen/drivers/passthroug= h/device_tree.c index 12f2c4c3f2..ea9fd54e3b 100644 --- a/xen/drivers/passthrough/device_tree.c +++ b/xen/drivers/passthrough/device_tree.c @@ -40,17 +40,6 @@ int iommu_assign_dt_device(struct domain *d, struct dt_d= evice_node *dev) if ( !list_empty(&dev->domain_list) ) goto fail; =20 - /* - * The hwdom is forced to use IOMMU for protecting assigned - * device. Therefore the IOMMU data is already set up. - */ - ASSERT(!is_hardware_domain(d) || - hd->status =3D=3D IOMMU_STATUS_initialized); - - rc =3D iommu_construct(d); - if ( rc ) - goto fail; - /* The flag field doesn't matter to DT device. */ rc =3D hd->platform_ops->assign_device(d, 0, dt_to_dev(dev), 0); =20 diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iomm= u.c index 11ece4d1f3..71f17e7edc 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -152,6 +152,17 @@ static int __init parse_dom0_iommu_param(const char *s) } custom_param("dom0-iommu", parse_dom0_iommu_param); =20 +static void __hwdom_init check_hwdom_reqs(struct domain *d) +{ + if ( iommu_hwdom_none || !paging_mode_translate(d) ) + return; + + arch_iommu_check_autotranslated_hwdom(d); + + iommu_hwdom_passthrough =3D false; + iommu_hwdom_strict =3D true; +} + int iommu_domain_init(struct domain *d) { struct domain_iommu *hd =3D dom_iommu(d); @@ -169,129 +180,44 @@ int iommu_domain_init(struct domain *d) return ret; =20 hd->platform_ops =3D iommu_get_ops(); - return hd->platform_ops->init(d); -} + ret =3D hd->platform_ops->init(d); + if ( ret ) + return ret; =20 -static void __hwdom_init check_hwdom_reqs(struct domain *d) -{ - if ( iommu_hwdom_none || !paging_mode_translate(d) ) - return; + if ( is_hardware_domain(d) ) + check_hwdom_reqs(d); /* may modify iommu_hwdom_strict */ =20 - arch_iommu_check_autotranslated_hwdom(d); + /* + * NB: 'relaxed' h/w domains don't need the IOMMU mappings to be kept + * in-sync with their assigned pages because all host RAM will be + * mapped during hwdom_init(). + */ + if ( !is_hardware_domain(d) || iommu_hwdom_strict ) + hd->need_sync =3D !iommu_use_hap_pt(d); =20 - iommu_hwdom_passthrough =3D false; - iommu_hwdom_strict =3D true; + return 0; } =20 void __hwdom_init iommu_hwdom_init(struct domain *d) { struct domain_iommu *hd =3D dom_iommu(d); =20 - check_hwdom_reqs(d); - if ( !is_iommu_enabled(d) ) return; =20 register_keyhandler('o', &iommu_dump_p2m_table, "dump iommu p2m table"= , 0); =20 - hd->status =3D IOMMU_STATUS_initializing; - /* - * NB: relaxed hw domains don't need sync because all ram is already - * mapped in the iommu page tables. - */ - hd->need_sync =3D iommu_hwdom_strict && !iommu_use_hap_pt(d); - if ( need_iommu_pt_sync(d) ) - { - struct page_info *page; - unsigned int i =3D 0, flush_flags =3D 0; - int rc =3D 0; - - page_list_for_each ( page, &d->page_list ) - { - unsigned long mfn =3D mfn_x(page_to_mfn(page)); - unsigned long dfn =3D mfn_to_gmfn(d, mfn); - unsigned int mapping =3D IOMMUF_readable; - int ret; - - if ( ((page->u.inuse.type_info & PGT_count_mask) =3D=3D 0) || - ((page->u.inuse.type_info & PGT_type_mask) - =3D=3D PGT_writable_page) ) - mapping |=3D IOMMUF_writable; - - ret =3D iommu_map(d, _dfn(dfn), _mfn(mfn), 0, mapping, - &flush_flags); - - if ( !rc ) - rc =3D ret; - - if ( !(i++ & 0xfffff) ) - process_pending_softirqs(); - } - - /* Use while-break to avoid compiler warning */ - while ( iommu_iotlb_flush_all(d, flush_flags) ) - break; - - if ( rc ) - printk(XENLOG_WARNING "d%d: IOMMU mapping failed: %d\n", - d->domain_id, rc); - } - hd->platform_ops->hwdom_init(d); - - hd->status =3D IOMMU_STATUS_initialized; } =20 -void iommu_teardown(struct domain *d) +static void iommu_teardown(struct domain *d) { struct domain_iommu *hd =3D dom_iommu(d); =20 - hd->status =3D IOMMU_STATUS_disabled; hd->platform_ops->teardown(d); tasklet_schedule(&iommu_pt_cleanup_tasklet); } =20 -int iommu_construct(struct domain *d) -{ - struct domain_iommu *hd =3D dom_iommu(d); - - if ( hd->status =3D=3D IOMMU_STATUS_initialized ) - return 0; - - hd->status =3D IOMMU_STATUS_initializing; - - if ( !iommu_use_hap_pt(d) ) - { - int rc; - - hd->need_sync =3D true; - - rc =3D arch_iommu_populate_page_table(d); - if ( rc ) - { - if ( rc !=3D -ERESTART ) - { - hd->need_sync =3D false; - hd->status =3D IOMMU_STATUS_disabled; - } - - return rc; - } - } - - hd->status =3D IOMMU_STATUS_initialized; - - /* - * There may be dirty cache lines when a device is assigned - * and before has_iommu_pt(d) becoming true, this will cause - * memory_type_changed lose effect if memory type changes. - * Call memory_type_changed here to amend this. - */ - memory_type_changed(d); - - return 0; -} - void iommu_domain_destroy(struct domain *d) { if ( !is_iommu_enabled(d) ) @@ -587,11 +513,8 @@ int iommu_do_domctl( void iommu_share_p2m_table(struct domain* d) { ASSERT(hap_enabled(d)); - /* - * iommu_use_hap_pt(d) cannot be used here because during domain - * construction has_iommu_pt(d) will always return false here. - */ - if ( is_iommu_enabled(d) && iommu_hap_pt_share ) + + if ( iommu_use_hap_pt(d) ) iommu_get_ops()->share_p2m(d); } =20 @@ -638,8 +561,7 @@ static void iommu_dump_p2m_table(unsigned char key) ops =3D iommu_get_ops(); for_each_domain(d) { - if ( is_hardware_domain(d) || - dom_iommu(d)->status < IOMMU_STATUS_initialized ) + if ( is_hardware_domain(d) || !is_iommu_enabled(d) ) continue; =20 if ( iommu_use_hap_pt(d) ) diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index d28f17af75..1fad0af534 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -939,9 +939,6 @@ static int deassign_device(struct domain *d, uint16_t s= eg, uint8_t bus, =20 pdev->fault.count =3D 0; =20 - if ( !has_arch_pdevs(d) && has_iommu_pt(d) ) - iommu_teardown(d); - return ret; } =20 @@ -1490,13 +1487,6 @@ static int assign_device(struct domain *d, u16 seg, = u8 bus, u8 devfn, u32 flag) if ( !pcidevs_trylock() ) return -ERESTART; =20 - rc =3D iommu_construct(d); - if ( rc ) - { - pcidevs_unlock(); - return rc; - } - pdev =3D pci_get_pdev_by_domain(hardware_domain, seg, bus, devfn); if ( !pdev ) { @@ -1525,8 +1515,6 @@ static int assign_device(struct domain *d, u16 seg, u= 8 bus, u8 devfn, u32 flag) } =20 done: - if ( !has_arch_pdevs(d) && has_iommu_pt(d) ) - iommu_teardown(d); pcidevs_unlock(); =20 return rc; diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/= vtd/iommu.c index f123760ee2..3c17f11386 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1721,15 +1721,7 @@ static void iommu_domain_teardown(struct domain *d) =20 ASSERT(is_iommu_enabled(d)); =20 - /* - * We can't use iommu_use_hap_pt here because either IOMMU state - * is already changed to IOMMU_STATUS_disabled at this point or - * has always been IOMMU_STATUS_disabled. - * - * We also need to test if HAP is enabled because PV guests can - * enter this path too. - */ - if ( hap_enabled(d) && iommu_hap_pt_share ) + if ( iommu_use_hap_pt(d) ) return; =20 spin_lock(&hd->arch.mapping_lock); diff --git a/xen/drivers/passthrough/x86/iommu.c b/xen/drivers/passthrough/= x86/iommu.c index 8319fe0a69..47a3e55213 100644 --- a/xen/drivers/passthrough/x86/iommu.c +++ b/xen/drivers/passthrough/x86/iommu.c @@ -81,103 +81,6 @@ int __init iommu_setup_hpet_msi(struct msi_desc *msi) return ops->setup_hpet_msi ? ops->setup_hpet_msi(msi) : -ENODEV; } =20 -int arch_iommu_populate_page_table(struct domain *d) -{ - struct page_info *page; - int rc =3D 0, n =3D 0; - - spin_lock(&d->page_alloc_lock); - - if ( unlikely(d->is_dying) ) - rc =3D -ESRCH; - - while ( !rc && (page =3D page_list_remove_head(&d->page_list)) ) - { - if ( is_hvm_domain(d) || - (page->u.inuse.type_info & PGT_type_mask) =3D=3D PGT_writable_= page ) - { - mfn_t mfn =3D page_to_mfn(page); - gfn_t gfn =3D mfn_to_gfn(d, mfn); - unsigned int flush_flags =3D 0; - - if ( !gfn_eq(gfn, INVALID_GFN) ) - { - dfn_t dfn =3D _dfn(gfn_x(gfn)); - - ASSERT(!(gfn_x(gfn) >> DEFAULT_DOMAIN_ADDRESS_WIDTH)); - BUG_ON(SHARED_M2P(gfn_x(gfn))); - rc =3D iommu_map(d, dfn, mfn, PAGE_ORDER_4K, - IOMMUF_readable | IOMMUF_writable, - &flush_flags); - - /* - * We may be working behind the back of a running guest, w= hich - * may change the type of a page at any time. We can't pr= event - * this (for instance, by bumping the type count while map= ping - * the page) without causing legitimate guest type-change - * operations to fail. So after adding the page to the IO= MMU, - * check again to make sure this is still valid. NB that = the - * writable entry in the iommu is harmless until later, wh= en - * the actual device gets assigned. - */ - if ( !rc && !is_hvm_domain(d) && - ((page->u.inuse.type_info & PGT_type_mask) !=3D - PGT_writable_page) ) - { - rc =3D iommu_unmap(d, dfn, PAGE_ORDER_4K, &flush_flags= ); - /* If the type changed yet again, simply force a retry= . */ - if ( !rc && ((page->u.inuse.type_info & PGT_type_mask)= =3D=3D - PGT_writable_page) ) - rc =3D -ERESTART; - } - } - if ( rc ) - { - page_list_add(page, &d->page_list); - break; - } - } - page_list_add_tail(page, &d->arch.relmem_list); - if ( !(++n & 0xff) && !page_list_empty(&d->page_list) && - hypercall_preempt_check() ) - rc =3D -ERESTART; - } - - if ( !rc ) - { - /* - * The expectation here is that generally there are many normal pa= ges - * on relmem_list (the ones we put there) and only few being in an - * offline/broken state. The latter ones are always at the head of= the - * list. Hence we first move the whole list, and then move back the - * first few entries. - */ - page_list_move(&d->page_list, &d->arch.relmem_list); - while ( !page_list_empty(&d->page_list) && - (page =3D page_list_first(&d->page_list), - (page->count_info & (PGC_state|PGC_broken))) ) - { - page_list_del(page, &d->page_list); - page_list_add_tail(page, &d->arch.relmem_list); - } - } - - spin_unlock(&d->page_alloc_lock); - - if ( !rc ) - /* - * flush_flags are not tracked across hypercall pre-emption so - * assume a full flush is necessary. - */ - rc =3D iommu_iotlb_flush_all( - d, IOMMU_FLUSHF_added | IOMMU_FLUSHF_modified); - - if ( rc && rc !=3D -ERESTART ) - iommu_teardown(d); - - return rc; -} - void __hwdom_init arch_iommu_check_autotranslated_hwdom(struct domain *d) { if ( !is_iommu_enabled(d) ) diff --git a/xen/include/asm-arm/iommu.h b/xen/include/asm-arm/iommu.h index 904c9aec11..1577e83d2b 100644 --- a/xen/include/asm-arm/iommu.h +++ b/xen/include/asm-arm/iommu.h @@ -21,7 +21,7 @@ struct arch_iommu }; =20 /* Always share P2M Table between the CPU and the IOMMU */ -#define iommu_use_hap_pt(d) (has_iommu_pt(d)) +#define iommu_use_hap_pt(d) is_iommu_enabled(d) =20 const struct iommu_ops *iommu_get_ops(void); void iommu_set_ops(const struct iommu_ops *ops); diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h index 31fda4b0cf..5071afd6a5 100644 --- a/xen/include/asm-x86/iommu.h +++ b/xen/include/asm-x86/iommu.h @@ -88,7 +88,7 @@ extern const struct iommu_init_ops *iommu_init_ops; =20 /* Are we using the domain P2M table as its IOMMU pagetable? */ #define iommu_use_hap_pt(d) \ - (hap_enabled(d) && has_iommu_pt(d) && iommu_hap_pt_share) + (hap_enabled(d) && is_iommu_enabled(d) && iommu_hap_pt_share) =20 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsig= ned int value); unsigned int iommu_read_apic_from_ire(unsigned int apic, unsigned int reg); diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index c5ed7efe98..dfec0ca3fc 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -88,15 +88,9 @@ void iommu_domain_destroy(struct domain *d); =20 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); =20 -int iommu_construct(struct domain *d); - -/* Function used internally, use iommu_domain_destroy */ -void iommu_teardown(struct domain *d); - /* * The following flags are passed to map operations and passed by lookup * operations. @@ -263,13 +257,6 @@ struct iommu_ops { # define iommu_vcall iommu_call #endif =20 -enum iommu_status -{ - IOMMU_STATUS_disabled, - IOMMU_STATUS_initializing, - IOMMU_STATUS_initialized -}; - struct domain_iommu { struct arch_iommu arch; =20 @@ -289,9 +276,6 @@ struct domain_iommu { /* Features supported by the IOMMU */ DECLARE_BITMAP(features, IOMMU_FEAT_count); =20 - /* Status of guest IOMMU mappings */ - enum iommu_status status; - /* * Does the guest reqire mappings to be synchonized, to maintain * the default dfn =3D=3D pfn map. (See comment on dfn at the top of diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 2d17c84915..ae1faf70d3 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -966,10 +966,8 @@ static inline bool is_hwdom_pinned_vcpu(const struct v= cpu *v) } =20 #ifdef CONFIG_HAS_PASSTHROUGH -#define has_iommu_pt(d) (dom_iommu(d)->status !=3D IOMMU_STATUS_disabled) #define need_iommu_pt_sync(d) (dom_iommu(d)->need_sync) #else -#define has_iommu_pt(d) false #define need_iommu_pt_sync(d) false #endif =20 --=20 2.20.1.2.gb21ebb671 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Wed May 15 23:11:34 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1568803354; cv=none; d=zoho.com; s=zohoarc; b=D8PogT82o04wJ3W1BtRjdRcyANNkOs/knSuVLKdmO8kV4E9OHShyqzPoHgFw53WshiYGVYZaH/kSjfa98d+6Rr+Ve/g3FXKfOENAp+PFPUPgJwIWuodqsg7ClvW7TZqYKUSWQs6Jdqz6OS1+TTFsNJj8wYkdkOm0iCk5ZzBYneE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568803354; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=V1dpZxmLDNwlEh96T1iLWYZj0yApOAx4E9/OPSNm3DE=; b=JteQQjrveW/eUm4uiOdawqlSqdWs1P5mhuYL2CNOLSN+ZChW9MZ7IDk084fUthp9pR0adSyJ2BPZcgyWX9qr7M0BbbVcHFibDAzbpJlEo1UziIRapvBq9jm7NVSVnnP1RxTCT2FTtK001/joyA3K7Mpdzmu0vh8DcjPT7hJc4Hg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1568803354889408.53020839130295; Wed, 18 Sep 2019 03:42:34 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iAXOp-0002f3-9u; Wed, 18 Sep 2019 10:41:27 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iAXOn-0002eR-VF for xen-devel@lists.xenproject.org; Wed, 18 Sep 2019 10:41:25 +0000 Received: from esa1.hc3370-68.iphmx.com (unknown [216.71.145.142]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id d8f03091-da00-11e9-962b-12813bfff9fa; Wed, 18 Sep 2019 10:41:19 +0000 (UTC) X-Inumbo-ID: d8f03091-da00-11e9-962b-12813bfff9fa DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1568803279; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ldwnBs47AXZuyUhm4pKDhoExdNCzpDXN2hjt6LxWqNI=; b=LbuXyl1PMxEUoDHcfKjjdahNydLQ/30yEFVgweXCTB6jCt88z6gXlJEr fxpCyUpBzIQId2ADfmkLfNE20Bjjo8eFz0dlj5jio3+k/1H97818lmOal 3cs3+6AGoK2Uj5mknJ71aikg2z8PURxzqZ7wck6PJ7YPWd/RZFZk613ik c=; Authentication-Results: esa1.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=paul.durrant@citrix.com; spf=Pass smtp.mailfrom=Paul.Durrant@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: None (esa1.hc3370-68.iphmx.com: no sender authenticity information available from domain of paul.durrant@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="paul.durrant@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa1.hc3370-68.iphmx.com: domain of Paul.Durrant@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="Paul.Durrant@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa1.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: 2OSCj2k8+k8h10XDXvn6ZJvtp4sbpN30XQLCcCS8uVLWWO90ZeiqmFk9hX0YrixEvHkotU6FsF mWoYtMd/jTiADBtdWqFH2loXQJzHeDdRiVaM5+PlXuovnuHmdx5HU7HQNXs6CqeGaFyjfeMdgn so9OrbhdBqdedqRki+HU1NMGDY7IyR8SU8gGjoFjtpxbzDUTiRlcvcHfhR0VLrIXwBg7ljT9wW J71vyimg/0dU7IX93q+eHfdK76QnXRaCf7zZmASNKoFOTUWfr4hqgT0X9yEXMWBG+FWdbAnTk5 0X4= X-SBRS: 2.7 X-MesageID: 5777372 X-Ironport-Server: esa1.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.64,520,1559534400"; d="scan'208";a="5777372" From: Paul Durrant To: Date: Wed, 18 Sep 2019 11:41:11 +0100 Message-ID: <20190918104113.3294-3-paul.durrant@citrix.com> X-Mailer: git-send-email 2.20.1.2.gb21ebb671 In-Reply-To: <20190918104113.3294-1-paul.durrant@citrix.com> References: <20190918104113.3294-1-paul.durrant@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v13 2/4] iommu: tidy up iommu_use_hap_pt() and need_iommu_pt_sync() macros X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Paul Durrant , Jan Beulich , Volodymyr Babchuk , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Thes macros really ought to live in the common xen/iommu.h header rather then being distributed amongst architecture specific iommu headers and xen/sched.h. This patch moves them there. NOTE: Disabling 'sharept' in the command line iommu options should really be hard error on ARM (as opposed to just being ignored), so define 'iommu_hap_pt_share' to be true for ARM (via ARM-selected CONFIG_IOMMU_FORCE_PT_SHARE). Signed-off-by: Paul Durrant Reviewed-by: Jan Beulich Acked-by: Julien Grall --- Cc: Andrew Cooper Cc: George Dunlap Cc: Ian Jackson Cc: Konrad Rzeszutek Wilk Cc: Stefano Stabellini Cc: Tim Deegan Cc: Wei Liu Cc: Volodymyr Babchuk Cc: "Roger Pau Monn=C3=A9" Previously part of https://lists.xenproject.org/archives/html/xen-devel/201= 9-07/msg02267.html v11: - Fix #if/#elif ordering issue v9: - Add new Kconfig option to cause 'iommu_hap_pt_share' to be defined to true, rather than using CONFIG_ARM, as requested by Julien - Assuming Jan's R-b stands since this is a mainly a cosmetic change directly requested by another maintainer v7: - Re-work the ARM handling of 'sharept' as suggested by Jan - Make sure that need_iommu_pt_sync() always evaluates its argument --- xen/arch/arm/Kconfig | 1 + xen/drivers/passthrough/Kconfig | 3 +++ xen/include/asm-arm/iommu.h | 3 --- xen/include/asm-x86/iommu.h | 4 ---- xen/include/xen/iommu.h | 15 ++++++++++++++- xen/include/xen/sched.h | 6 ------ 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/xen/arch/arm/Kconfig b/xen/arch/arm/Kconfig index c2db2a6953..a51aa7bfa8 100644 --- a/xen/arch/arm/Kconfig +++ b/xen/arch/arm/Kconfig @@ -20,6 +20,7 @@ config ARM select HAS_DEVICE_TREE select HAS_PASSTHROUGH select HAS_PDX + select IOMMU_FORCE_PT_SHARE =20 config ARCH_DEFCONFIG string diff --git a/xen/drivers/passthrough/Kconfig b/xen/drivers/passthrough/Kcon= fig index a3c06491be..61f944639e 100644 --- a/xen/drivers/passthrough/Kconfig +++ b/xen/drivers/passthrough/Kconfig @@ -13,3 +13,6 @@ config ARM_SMMU Say Y here if your SoC includes an IOMMU device implementing the ARM SMMU architecture. endif + +config IOMMU_FORCE_PT_SHARE + bool diff --git a/xen/include/asm-arm/iommu.h b/xen/include/asm-arm/iommu.h index 1577e83d2b..77a94b29eb 100644 --- a/xen/include/asm-arm/iommu.h +++ b/xen/include/asm-arm/iommu.h @@ -20,9 +20,6 @@ struct arch_iommu void *priv; }; =20 -/* Always share P2M Table between the CPU and the IOMMU */ -#define iommu_use_hap_pt(d) is_iommu_enabled(d) - const struct iommu_ops *iommu_get_ops(void); void iommu_set_ops(const struct iommu_ops *ops); =20 diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h index 5071afd6a5..85741f7c96 100644 --- a/xen/include/asm-x86/iommu.h +++ b/xen/include/asm-x86/iommu.h @@ -86,10 +86,6 @@ struct iommu_init_ops { =20 extern const struct iommu_init_ops *iommu_init_ops; =20 -/* Are we using the domain P2M table as its IOMMU pagetable? */ -#define iommu_use_hap_pt(d) \ - (hap_enabled(d) && is_iommu_enabled(d) && iommu_hap_pt_share) - void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsig= ned int value); unsigned int iommu_read_apic_from_ire(unsigned int apic, unsigned int reg); int iommu_setup_hpet_msi(struct msi_desc *); diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index dfec0ca3fc..42a92a3379 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -56,7 +56,9 @@ extern bool_t iommu_enable, iommu_enabled; extern bool_t force_iommu, iommu_verbose, iommu_igfx; extern bool_t iommu_snoop, iommu_qinval, iommu_intremap, iommu_intpost; =20 -#ifdef CONFIG_HVM +#if defined(CONFIG_IOMMU_FORCE_PT_SHARE) +#define iommu_hap_pt_share true +#elif defined(CONFIG_HVM) extern bool iommu_hap_pt_share; #else #define iommu_hap_pt_share false @@ -288,6 +290,17 @@ struct domain_iommu { #define iommu_set_feature(d, f) set_bit(f, dom_iommu(d)->features) #define iommu_clear_feature(d, f) clear_bit(f, dom_iommu(d)->features) =20 +/* Are we using the domain P2M table as its IOMMU pagetable? */ +#define iommu_use_hap_pt(d) \ + (hap_enabled(d) && is_iommu_enabled(d) && iommu_hap_pt_share) + +/* Does the IOMMU pagetable need to be kept synchronized with the P2M */ +#ifdef CONFIG_HAS_PASSTHROUGH +#define need_iommu_pt_sync(d) (dom_iommu(d)->need_sync) +#else +#define need_iommu_pt_sync(d) ({ (void)(d); false; }) +#endif + int __must_check iommu_suspend(void); void iommu_resume(void); void iommu_crash_shutdown(void); diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index ae1faf70d3..a6896221f9 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -965,12 +965,6 @@ static inline bool is_hwdom_pinned_vcpu(const struct v= cpu *v) cpumask_weight(v->cpu_hard_affinity) =3D=3D 1); } =20 -#ifdef CONFIG_HAS_PASSTHROUGH -#define need_iommu_pt_sync(d) (dom_iommu(d)->need_sync) -#else -#define need_iommu_pt_sync(d) false -#endif - static inline bool is_vcpu_online(const struct vcpu *v) { return !test_bit(_VPF_down, &v->pause_flags); --=20 2.20.1.2.gb21ebb671 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Wed May 15 23:11:34 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1568803340; cv=none; d=zoho.com; s=zohoarc; b=EbKg3k2YPgXs2f4HzN+NhwNRkxC/SWWu6z5pzG05kepDFRAXMxKgIem68U+AmedeZdf3ZRPxX9qzyu9pQdYGqHnySA0xP1MBi4/xWt7sbOUD0Xj6Mkl1WGK4afMAzQxWW5sf4vJroxKF/iicSz9Vk60uCb6i5y+J84rzVwn1ss0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568803340; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=4yuRVz/tBZFlYnxMK/97MUKaTjyI5/Xd/AHEcYmnBBI=; b=NspnmtonOwtjKOfr8Bkp6cT/l9PHvecgnBVbmQgGkTnYDkqV3JBCvnAxBlLMzv+Pzb7DQws4/wZNgyaGtymQoKArvf5wtfNUn1j2dUB6Is+8A7+3qXvBZVTDGj1/D1lOg0zr/zrrR56OszSWPqpE0NSZ00PvBkYJgSSOLStWPcQ= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1568803340676542.5991159563903; Wed, 18 Sep 2019 03:42:20 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iAXOk-0002cj-UQ; Wed, 18 Sep 2019 10:41:22 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iAXOj-0002bq-Af for xen-devel@lists.xenproject.org; Wed, 18 Sep 2019 10:41:21 +0000 Received: from esa1.hc3370-68.iphmx.com (unknown [216.71.145.142]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id d9c1969e-da00-11e9-b76c-bc764e2007e4; Wed, 18 Sep 2019 10:41:20 +0000 (UTC) X-Inumbo-ID: d9c1969e-da00-11e9-b76c-bc764e2007e4 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1568803280; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=r3wtqscF5WahSQ6mM8jXiCTqgdjpyQSjBstDHQvT3zg=; b=OUrTPCpxfwmnqxNT2gmnyyjv5kxV9vWjA5GJxY4mFaRjWWkMZcOH6FuK TYt2N8EFEkgsXBQhaX99J3e+IdQNf3xLbUmHPFNYi1fdc3NoNu8axWJiU FSp82Sw3qLMgjtpUP9YfwuBHqB9vuuefrvetrrZjN+pUZp/UHHn9QUWmS Q=; Authentication-Results: esa1.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=paul.durrant@citrix.com; spf=Pass smtp.mailfrom=Paul.Durrant@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: None (esa1.hc3370-68.iphmx.com: no sender authenticity information available from domain of paul.durrant@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="paul.durrant@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa1.hc3370-68.iphmx.com: domain of Paul.Durrant@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="Paul.Durrant@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa1.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: fx5Uc386N0OOQpCrlCSGl8nV+ss1clIVWYTzaDOqc2xJFuyiCx3u/6OorOSPU8gK42R0o7cn1B u9crwVKRQ3lM9973gbXOz+sphOYdYjkMKnvDgKVLdj2p3anvbt1geK8/51PIefRZNH95Pvu/qF tcMEHBSZROyXvTwdo8rNNwuA8HqUwFtS80U2yw0u4gec9uMaW9aRn/Ok240c5gQ/l4GyFJ3vCV D8PxEhGwKuOefbwqG2rFuRxl0jxgcLJnSJXHzLmngG/s79eaGhpZtARkJE0JDL52rVbrwqaVLV Kco= X-SBRS: 2.7 X-MesageID: 5777373 X-Ironport-Server: esa1.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.64,520,1559534400"; d="scan'208";a="5777373" From: Paul Durrant To: Date: Wed, 18 Sep 2019 11:41:12 +0100 Message-ID: <20190918104113.3294-4-paul.durrant@citrix.com> X-Mailer: git-send-email 2.20.1.2.gb21ebb671 In-Reply-To: <20190918104113.3294-1-paul.durrant@citrix.com> References: <20190918104113.3294-1-paul.durrant@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v13 3/4] tools/ocaml: abi check: Cope with consecutive relevant enums X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Paul Durrant , Ian Jackson Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) From: Ian Jackson If the end of one enum is the `type' line for the next enum, we would not notice it. Fix this by reordering the code, and getting rid of the else: now if the "we are within an enum" branch decides that it's the end of the enum, it unsets $ei and we then immediately process the line as a "not within an enum" line - ie as the start of the next one. Reported-by: Paul Durrant Signed-off-by: Ian Jackson Signed-off-by: Paul Durrant v13: - New in this version --- tools/ocaml/libs/xc/abi-check | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tools/ocaml/libs/xc/abi-check b/tools/ocaml/libs/xc/abi-check index d532f37271..3cbdec582f 100755 --- a/tools/ocaml/libs/xc/abi-check +++ b/tools/ocaml/libs/xc/abi-check @@ -70,14 +70,7 @@ my $cval; $ei =3D undef; my $bitnum =3D 0; while () { - if (!$ei) { - if (m{^type \s+ (\w+) \s* \=3D \s* $}x && $enums{$1}) { - print "// found ocaml type $1 at $o:$.\n" or die $!; - $ei =3D $enums{$1}; - $cval =3D ''; - $bitnum =3D 0; - } - } else { + if ($ei) { if (m{^\s+ \| \s* $ei->{OPrefix} (\w+) \s*$}x) { $cval =3D $1; if ($ei->{Mangle} eq 'lc') { @@ -104,6 +97,14 @@ while () { die "$_ ?"; } } + if (!$ei) { + if (m{^type \s+ (\w+) \s* \=3D \s* $}x && $enums{$1}) { + print "// found ocaml type $1 at $o:$.\n" or die $!; + $ei =3D $enums{$1}; + $cval =3D ''; + $bitnum =3D 0; + } + } } =20 foreach $ei (values %enums) { --=20 2.20.1.2.gb21ebb671 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Wed May 15 23:11:34 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1568803357; cv=none; d=zoho.com; s=zohoarc; b=b9jMQBpBxy3VocaBIE3n33+kOu/8MHyue+bt2YT0FPf8f1YlOB0isl3rr+sySVbmHJhKMrOZV//ctg4BeYyHPF+5wF6NZ0TlkmWeJHwGiPLg6D4RM2t2UFIoufqj3oJgFCUkqN1HHAY3LSB/MXLWcHWvNR/QEcPgrXsha+dapCE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568803357; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=zFsVZJ8r7Zws5dLOZ27wwrlGeGUnQWzTTdwH9AaPnCM=; b=nMBujkT4nUnXIjdYD7f06rEBonwih1Cg27omMnS9sKfimue1VjNhbJ5abHSGiZcJctene0FcWlF/OceWnZFHpuq4/mlqBfgmeqaHqJQaBwftKwiaWAzcSK0G/IQU5b6OOFs+AIP8+fHstDeCCvGrOezYUR9i4dled3pepkBtaqw= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1568803357667379.47175442004345; Wed, 18 Sep 2019 03:42:37 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iAXOp-0002fa-Lh; Wed, 18 Sep 2019 10:41:27 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iAXOo-0002ed-A8 for xen-devel@lists.xenproject.org; Wed, 18 Sep 2019 10:41:26 +0000 Received: from esa1.hc3370-68.iphmx.com (unknown [216.71.145.142]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id da778918-da00-11e9-b76c-bc764e2007e4; Wed, 18 Sep 2019 10:41:21 +0000 (UTC) X-Inumbo-ID: da778918-da00-11e9-b76c-bc764e2007e4 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1568803281; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=v/GU7thrLlwzngEtW/u2dr2QoLh+rIvN6Jr7AgE2RKQ=; b=CC5iGQAE6VOhQFUqt1snQX59AqzT4xmBfwxg0mDsv7Mq+lSP9XkzbKoi AylpIH+pWkuIvriuQE9Dg8dEfPE8W8sC1QxDJWOHtGZuEERkei+Gj5tEA oWYMrQcAaUT2BiKneMJrK45Rxvb5jlwVZC6suUIpy4Lq00hmgM++yept+ A=; Authentication-Results: esa1.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=paul.durrant@citrix.com; spf=Pass smtp.mailfrom=Paul.Durrant@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: None (esa1.hc3370-68.iphmx.com: no sender authenticity information available from domain of paul.durrant@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="paul.durrant@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa1.hc3370-68.iphmx.com: domain of Paul.Durrant@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="Paul.Durrant@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa1.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="Paul.Durrant@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: kDwKjn2bxN8pHrScwhFuKFCMj+vKzPhlGSbqhy3HUPtJO3lKvsxt4aCKncQKQOkkeVlvp5RBkJ h/zDNHtf/uCvKXhuGX2KdPC6uZz1qy+Mls6pEKU2MybTV4k93YO8xX60wNcdFpsQ3brx93gviS NZH4CxCN3iWm5TC19zy8DAzDk2x6IBwRh6gX4T06vm9Xao1+whHZLq5lfgYHeGBue4cr+Oqc2s A6Jnu6wqfw/6TZM2QUFa/5I6OV0uyZqrPLaCRos4G8DQOLwEfT3lu7ozCMYhQppJ/fd3ctJvgR ue8= X-SBRS: 2.7 X-MesageID: 5777374 X-Ironport-Server: esa1.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.64,520,1559534400"; d="scan'208";a="5777374" From: Paul Durrant To: Date: Wed, 18 Sep 2019 11:41:13 +0100 Message-ID: <20190918104113.3294-5-paul.durrant@citrix.com> X-Mailer: git-send-email 2.20.1.2.gb21ebb671 In-Reply-To: <20190918104113.3294-1-paul.durrant@citrix.com> References: <20190918104113.3294-1-paul.durrant@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v13 4/4] introduce a 'passthrough' configuration option to xl.cfg... X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Paul Durrant , Christian Lindig , Jan Beulich , David Scott , Anthony PERARD , Volodymyr Babchuk , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) ...and hence the ability to disable IOMMU mappings, and control EPT sharing. This patch introduces a new 'libxl_passthrough' enumeration into libxl_domain_create_info. The value will be set by xl either when it parses a new 'passthrough' option in xl.cfg, or implicitly if there is passthrough hardware specified for the domain. If the value of the passthrough configuration option is 'disabled' then the XEN_DOMCTL_CDF_iommu flag will be clear in the xen_domctl_createdomain flags, thus allowing the toolstack to control whether the domain gets IOMMU mappings or not (where previously they were globally set). If the value of the passthrough configuration option is 'sync_pt' then a new 'iommu_opts' field in xen_domctl_createdomain will be set with the value XEN_DOMCTL_IOMMU_no_sharept. This will override the global default set in iommu_hap_pt_share, thus allowing the toolstack to control whether EPT sharing is used for the domain. If the value of passthrough is 'enabled' then xl will choose an appropriate default according to the type of domain and hardware support. NOTE: The 'iommu_memkb' overhead in libxl_domain_build_info will now only be set if passthrough is 'sync_pt' (or xl has chosen this mode as a default). Signed-off-by: Paul Durrant Reviewed-by: Jan Beulich Acked-by: Christian Lindig Acked-by: Julien Grall Reviewed-by: Anthony PERARD --- Cc: Ian Jackson Cc: Wei Liu Cc: Andrew Cooper Cc: George Dunlap Cc: Konrad Rzeszutek Wilk Cc: Stefano Stabellini Cc: Tim Deegan Cc: Anthony PERARD Cc: David Scott Cc: Volodymyr Babchuk Cc: "Roger Pau Monn=C3=A9" Previously part of series https://lists.xenproject.org/archives/html/xen-de= vel/2019-07/msg02267.html v13: - Small documentation adjustments requested by George and Julien - Fix default passthrough option v12: - Set passthrough default in libxl v11: - Fixed abi-check runes v10: - Added abi-check runes v9: - Added the passthrough=3D'enabled' option to xl - One cosmetic change in xen - Assume Jan's R-b stands since non-cosmetic changes are only in the toolstack v7: - Added missing breaks - Added missing ocaml binding changes v6: - Remove the libxl_physinfo() call since it's usefulness is limited to x86 v5: - Expand xen_domctl_createdomain flags field and hence bump interface version - Fix spelling mistakes in context line --- docs/man/xl.cfg.5.pod.in | 57 ++++++++++ tools/libxl/libxl.h | 9 ++ tools/libxl/libxl_create.c | 30 ++++- tools/libxl/libxl_types.idl | 8 ++ tools/ocaml/libs/xc/xenctrl.ml | 4 + tools/ocaml/libs/xc/xenctrl.mli | 5 + tools/ocaml/libs/xc/xenctrl_stubs.c | 17 ++- tools/xl/xl_parse.c | 164 +++++++++++++++++++--------- xen/arch/arm/domain.c | 10 +- xen/arch/x86/domain.c | 2 +- xen/common/domain.c | 7 ++ xen/common/domctl.c | 13 --- xen/drivers/passthrough/iommu.c | 13 ++- xen/include/public/domctl.h | 10 +- xen/include/xen/iommu.h | 15 ++- 15 files changed, 277 insertions(+), 87 deletions(-) diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in index c99d40307e..7795c73556 100644 --- a/docs/man/xl.cfg.5.pod.in +++ b/docs/man/xl.cfg.5.pod.in @@ -605,6 +605,63 @@ option should only be used with a trusted device tree. Note that the partial device tree should avoid using the phandle 65000 which is reserved by the toolstack. =20 +=3Ditem B + +Specify whether IOMMU mappings are enabled for the domain and hence whether +it will be enabled for passthrough hardware. Valid values for this option +are: + +=3Dover 4 + +=3Ditem B + +IOMMU mappings are disabled for the domain and so hardware may not be +passed through. + +This option is the default if no passthrough hardware is specified in the +domain's configuration. + +=3Ditem B + +This option enables IOMMU mappings and selects an appropriate default +operating mode (see below for details of the operating modes). For HVM/PVH +domains running on platforms where the option is available, this is +equivalent to B. Otherwise, and also for PV domains, this +option is equivalent to B. + +This option is the default if passthrough hardware is specified in the +domain's configuration. + +=3Ditem B + +This option means that IOMMU mappings will be synchronized with the +domain's P2M table as follows: + +For a PV domain, all writable pages assigned to the domain are identity +mapped by MFN in the IOMMU page table. Thus a device driver running in the +domain may program passthrough hardware for DMA using MFN values +(i.e. host/machine frame numbers) looked up in its P2M. + +For an HVM/PVH domain, all non-foreign RAM pages present in its P2M will be +mapped by GFN in the IOMMU page table. Thus a device driver running in the +domain may program passthrough hardware using GFN values (i.e. guest +physical frame numbers) without any further translation. + +This option is not currently available on Arm. + +=3Ditem B + +This option is unavailable for a PV domain. For an HVM/PVH domain, this +option means that the IOMMU will be programmed to directly reference the +domain's P2M table as its page table. From the point of view of a device +driver running in the domain this is functionally equivalent to B +but places less load on the hypervisor and so should generally be selected +in preference. However, the availability of this option is hardware +specific. If B reports B containing +B then this option may be used. + +=3Dback + =3Dback =20 =3Dhead2 Devices diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 12545130df..e4b9c539b6 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -415,6 +415,15 @@ */ #define LIBXL_HAVE_BUILDINFO_IOMMU_MEMKB 1 =20 +/* + * LIBXL_HAVE_CREATEINFO_PASSTHROUGH indicates that + * libxl_domain_create_info has a passthrough field (which is a + * libxl_passthrough enumeration) that indicates whether device pass- + * through is enabled for the domain and, if so, whether the IOMMU and + * HAP page tables may be shared or not. + */ +#define LIBXL_HAVE_CREATEINFO_PASSTHROUGH 1 + /* * libxl ABI compatibility * diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 59dbcb50a0..3876a72b78 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -30,6 +30,13 @@ int libxl__domain_create_info_setdefault(libxl__gc *gc, libxl_domain_create_info *c_info) { + libxl_physinfo info; + int rc; + + rc =3D libxl_get_physinfo(CTX, &info); + if (rc) + return rc; + if (!c_info->type) { LOG(ERROR, "domain type unspecified"); return ERROR_INVAL; @@ -38,12 +45,6 @@ int libxl__domain_create_info_setdefault(libxl__gc *gc, libxl__arch_domain_create_info_setdefault(gc, c_info); =20 if (c_info->type !=3D LIBXL_DOMAIN_TYPE_PV) { - libxl_physinfo info; - int rc =3D libxl_get_physinfo(CTX, &info); - - if (rc) - return rc; - if (info.cap_hap) libxl_defbool_setdefault(&c_info->hap, true); else if (info.cap_shadow) @@ -62,6 +63,13 @@ int libxl__domain_create_info_setdefault(libxl__gc *gc, if (!c_info->ssidref) c_info->ssidref =3D SECINITSID_DOMU; =20 + if (info.cap_hvm_directio && + (c_info->passthrough =3D=3D LIBXL_PASSTHROUGH_ENABLED)) { + c_info->passthrough =3D ((c_info->type =3D=3D LIBXL_DOMAIN_TYPE_PV= ) || + !info.cap_iommu_hap_pt_share) ? + LIBXL_PASSTHROUGH_SYNC_PT : LIBXL_PASSTHROUGH_SHARE_PT; + } + return 0; } =20 @@ -578,6 +586,16 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_con= fig *d_config, libxl_defbool_val(info->oos) ? 0 : XEN_DOMCTL_CDF_oos_off; } =20 + assert(info->passthrough !=3D LIBXL_PASSTHROUGH_ENABLED); + LOG(DETAIL, "passthrough: %s", + libxl_passthrough_to_string(info->passthrough)); + + if (info->passthrough !=3D LIBXL_PASSTHROUGH_DISABLED) + create.flags |=3D XEN_DOMCTL_CDF_iommu; + + if (info->passthrough =3D=3D LIBXL_PASSTHROUGH_SYNC_PT) + create.iommu_opts |=3D XEN_DOMCTL_IOMMU_no_sharept; + /* Ultimately, handle is an array of 16 uint8_t, same as uuid */ libxl_uuid_copy(ctx, (libxl_uuid *)&create.handle, &info->uuid); =20 diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index d52c63b6b0..74987f3f30 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -263,6 +263,13 @@ libxl_vkb_backend =3D Enumeration("vkb_backend", [ (2, "LINUX") ]) =20 +libxl_passthrough =3D Enumeration("passthrough", [ + (0, "enabled"), + (1, "disabled"), + (2, "sync_pt"), + (3, "share_pt"), + ]) + # # Complex libxl types # @@ -408,6 +415,7 @@ libxl_domain_create_info =3D Struct("domain_create_info= ",[ ("pool_name", string), ("run_hotplug_scripts",libxl_defbool), ("driver_domain",libxl_defbool), + ("passthrough", libxl_passthrough), ], dir=3DDIR_IN) =20 libxl_domain_restore_params =3D Struct("domain_restore_params", [ diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml index de4bae6012..e00a74d48d 100644 --- a/tools/ocaml/libs/xc/xenctrl.ml +++ b/tools/ocaml/libs/xc/xenctrl.ml @@ -65,11 +65,15 @@ type domain_create_flag =3D | CDF_XS_DOMAIN | CDF_IOMMU =20 +type domain_create_iommu_opts =3D + | IOMMU_NO_SHAREPT + type domctl_create_config =3D { ssidref: int32; handle: string; flags: domain_create_flag list; + iommu_opts: domain_create_iommu_opts list; max_vcpus: int; max_evtchn_port: int; max_grant_frames: int; diff --git a/tools/ocaml/libs/xc/xenctrl.mli b/tools/ocaml/libs/xc/xenctrl.= mli index c885e75895..0e7049d708 100644 --- a/tools/ocaml/libs/xc/xenctrl.mli +++ b/tools/ocaml/libs/xc/xenctrl.mli @@ -57,10 +57,15 @@ type domain_create_flag =3D | CDF_OOS_OFF | CDF_XS_DOMAIN | CDF_IOMMU + +type domain_create_iommu_opts =3D + | IOMMU_NO_SHAREPT + type domctl_create_config =3D { ssidref: int32; handle: string; flags: domain_create_flag list; + iommu_opts: domain_create_iommu_opts list; max_vcpus: int; max_evtchn_port: int; max_grant_frames: int; diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenc= trl_stubs.c index 0cdd873599..48f39f81d5 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -190,11 +190,12 @@ CAMLprim value stub_xc_domain_create(value xch, value= config) #define VAL_SSIDREF Field(config, 0) #define VAL_HANDLE Field(config, 1) #define VAL_FLAGS Field(config, 2) -#define VAL_MAX_VCPUS Field(config, 3) -#define VAL_MAX_EVTCHN_PORT Field(config, 4) -#define VAL_MAX_GRANT_FRAMES Field(config, 5) -#define VAL_MAX_MAPTRACK_FRAMES Field(config, 6) -#define VAL_ARCH Field(config, 7) +#define VAL_IOMMU_OPTS Field(config, 3) +#define VAL_MAX_VCPUS Field(config, 4) +#define VAL_MAX_EVTCHN_PORT Field(config, 5) +#define VAL_MAX_GRANT_FRAMES Field(config, 6) +#define VAL_MAX_MAPTRACK_FRAMES Field(config, 7) +#define VAL_ARCH Field(config, 8) =20 uint32_t domid =3D 0; int result; @@ -213,6 +214,11 @@ CAMLprim value stub_xc_domain_create(value xch, value = config) /* ! XEN_DOMCTL_CDF_ XEN_DOMCTL_CDF_MAX max */ (VAL_FLAGS); =20 + cfg.iommu_opts =3D ocaml_list_to_c_bitmap + /* ! domain_create_iommu_opts IOMMU_ lc */ + /* ! XEN_DOMCTL_IOMMU_ XEN_DOMCTL_IOMMU_MAX max */ + (VAL_IOMMU_OPTS); + arch_domconfig =3D Field(VAL_ARCH, 0); switch ( Tag_val(VAL_ARCH) ) { @@ -247,6 +253,7 @@ CAMLprim value stub_xc_domain_create(value xch, value c= onfig) #undef VAL_MAX_GRANT_FRAMES #undef VAL_MAX_EVTCHN_PORT #undef VAL_MAX_VCPUS +#undef VAL_IOMMU_OPTS #undef VAL_FLAGS #undef VAL_HANDLE #undef VAL_SSIDREF diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index 293f5f730e..17b458e94c 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -1461,6 +1461,113 @@ void parse_config_data(const char *config_source, exit(1); } =20 + if (!xlu_cfg_get_list (config, "pci", &pcis, 0, 0)) { + d_config->num_pcidevs =3D 0; + d_config->pcidevs =3D NULL; + for(i =3D 0; (buf =3D xlu_cfg_get_listitem (pcis, i)) !=3D NULL; i= ++) { + libxl_device_pci *pcidev; + + pcidev =3D ARRAY_EXTEND_INIT_NODEVID(d_config->pcidevs, + d_config->num_pcidevs, + libxl_device_pci_init); + pcidev->msitranslate =3D pci_msitranslate; + pcidev->power_mgmt =3D pci_power_mgmt; + pcidev->permissive =3D pci_permissive; + pcidev->seize =3D pci_seize; + /* + * Like other pci option, the per-device policy always follows + * the global policy by default. + */ + pcidev->rdm_policy =3D b_info->u.hvm.rdm.policy; + e =3D xlu_pci_parse_bdf(config, pcidev, buf); + if (e) { + fprintf(stderr, + "unable to parse PCI BDF `%s' for passthrough\n", + buf); + exit(-e); + } + } + if (d_config->num_pcidevs && c_info->type =3D=3D LIBXL_DOMAIN_TYPE= _PV) + libxl_defbool_set(&b_info->u.pv.e820_host, true); + } + + if (!xlu_cfg_get_list (config, "dtdev", &dtdevs, 0, 0)) { + d_config->num_dtdevs =3D 0; + d_config->dtdevs =3D NULL; + for (i =3D 0; (buf =3D xlu_cfg_get_listitem(dtdevs, i)) !=3D NULL;= i++) { + libxl_device_dtdev *dtdev; + + dtdev =3D ARRAY_EXTEND_INIT_NODEVID(d_config->dtdevs, + d_config->num_dtdevs, + libxl_device_dtdev_init); + + dtdev->path =3D strdup(buf); + if (dtdev->path =3D=3D NULL) { + fprintf(stderr, "unable to duplicate string for dtdevs\n"); + exit(-1); + } + } + } + + if (xlu_cfg_get_string(config, "passthrough", &buf, 0)) { + c_info->passthrough =3D + (d_config->num_pcidevs || d_config->num_dtdevs) + ? LIBXL_PASSTHROUGH_ENABLED : LIBXL_PASSTHROUGH_DISABLED; + } else { + libxl_passthrough o; + + e =3D libxl_passthrough_from_string(buf, &o); + if (e) { + fprintf(stderr, + "ERROR: unknown passthrough option '%s'\n", + buf); + exit(-ERROR_FAIL); + } + + c_info->passthrough =3D o; + } + + switch (c_info->passthrough) { + case LIBXL_PASSTHROUGH_ENABLED: + /* + * Choose a suitable default. libxl would also do this but + * choosing here allows the code calculating 'iommu_memkb' + * below make an informed decision. + */ + c_info->passthrough =3D + (c_info->type =3D=3D LIBXL_DOMAIN_TYPE_PV) || !iommu_hap_pt_sh= are + ? LIBXL_PASSTHROUGH_SYNC_PT : LIBXL_PASSTHROUGH_SHARE_PT; + break; + + case LIBXL_PASSTHROUGH_DISABLED: + if (d_config->num_pcidevs || d_config->num_dtdevs) { + fprintf(stderr, + "ERROR: passthrough disabled but devices are specified= \n"); + exit(-ERROR_FAIL); + } + break; + case LIBXL_PASSTHROUGH_SHARE_PT: + if (c_info->type =3D=3D LIBXL_DOMAIN_TYPE_PV) { + fprintf(stderr, + "ERROR: passthrough=3D\"share_pt\" not valid for PV do= main\n"); + exit(-ERROR_FAIL); + } else if (!iommu_hap_pt_share) { + fprintf(stderr, + "ERROR: passthrough=3D\"share_pt\" not supported on th= is platform\n"); + exit(-ERROR_FAIL); + } + break; + case LIBXL_PASSTHROUGH_SYNC_PT: + break; + } + + if ((c_info->passthrough !=3D LIBXL_PASSTHROUGH_DISABLED) && + !iommu_enabled) { + fprintf(stderr, + "ERROR: passthrough not supported on this platform\n"); + exit(-ERROR_FAIL); + } + /* libxl_get_required_shadow_memory() and * libxl_get_required_iommu_memory() must be called after final values * (default or specified) for vcpus and memory are set, because the @@ -1470,11 +1577,10 @@ void parse_config_data(const char *config_source, : libxl_get_required_shadow_memory(b_info->max_memkb, b_info->max_vcpus); =20 - /* No IOMMU reservation is needed if either the IOMMU is disabled or it - * can share the P2M. */ - b_info->iommu_memkb =3D (!iommu_enabled || iommu_hap_pt_share) - ? 0 - : libxl_get_required_iommu_memory(b_info->max_memkb); + /* No IOMMU reservation is needed if passthrough mode is not 'sync_pt'= */ + b_info->iommu_memkb =3D (c_info->passthrough =3D=3D LIBXL_PASSTHROUGH_= SYNC_PT) + ? libxl_get_required_iommu_memory(b_info->max_memkb) + : 0; =20 xlu_cfg_get_defbool(config, "nomigrate", &b_info->disable_migrate, 0); =20 @@ -2298,54 +2404,6 @@ skip_vfb: } } =20 - if (!xlu_cfg_get_list (config, "pci", &pcis, 0, 0)) { - d_config->num_pcidevs =3D 0; - d_config->pcidevs =3D NULL; - for(i =3D 0; (buf =3D xlu_cfg_get_listitem (pcis, i)) !=3D NULL; i= ++) { - libxl_device_pci *pcidev; - - pcidev =3D ARRAY_EXTEND_INIT_NODEVID(d_config->pcidevs, - d_config->num_pcidevs, - libxl_device_pci_init); - pcidev->msitranslate =3D pci_msitranslate; - pcidev->power_mgmt =3D pci_power_mgmt; - pcidev->permissive =3D pci_permissive; - pcidev->seize =3D pci_seize; - /* - * Like other pci option, the per-device policy always follows - * the global policy by default. - */ - pcidev->rdm_policy =3D b_info->u.hvm.rdm.policy; - e =3D xlu_pci_parse_bdf(config, pcidev, buf); - if (e) { - fprintf(stderr, - "unable to parse PCI BDF `%s' for passthrough\n", - buf); - exit(-e); - } - } - if (d_config->num_pcidevs && c_info->type =3D=3D LIBXL_DOMAIN_TYPE= _PV) - libxl_defbool_set(&b_info->u.pv.e820_host, true); - } - - if (!xlu_cfg_get_list (config, "dtdev", &dtdevs, 0, 0)) { - d_config->num_dtdevs =3D 0; - d_config->dtdevs =3D NULL; - for (i =3D 0; (buf =3D xlu_cfg_get_listitem(dtdevs, i)) !=3D NULL;= i++) { - libxl_device_dtdev *dtdev; - - dtdev =3D ARRAY_EXTEND_INIT_NODEVID(d_config->dtdevs, - d_config->num_dtdevs, - libxl_device_dtdev_init); - - dtdev->path =3D strdup(buf); - if (dtdev->path =3D=3D NULL) { - fprintf(stderr, "unable to duplicate string for dtdevs\n"); - exit(-1); - } - } - } - if (!xlu_cfg_get_list(config, "usbctrl", &usbctrls, 0, 0)) { d_config->num_usbctrls =3D 0; d_config->usbctrls =3D NULL; diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index ae13e47e86..61d35cd120 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -617,6 +617,14 @@ int arch_sanitise_domain_config(struct xen_domctl_crea= tedomain *config) return -EINVAL; } =20 + /* The P2M table must always be shared between the CPU and the IOMMU */ + if ( config->iommu_opts & XEN_DOMCTL_IOMMU_no_sharept ) + { + dprintk(XENLOG_INFO, + "Unsupported iommu option: XEN_DOMCTL_IOMMU_no_sharept\n"); + return -EINVAL; + } + /* Fill in the native GIC version, passed back to the toolstack. */ if ( config->arch.gic_version =3D=3D XEN_DOMCTL_CONFIG_GIC_NATIVE ) { @@ -677,7 +685,7 @@ int arch_domain_create(struct domain *d, ASSERT(config !=3D NULL); =20 /* p2m_init relies on some value initialized by the IOMMU subsystem */ - if ( (rc =3D iommu_domain_init(d)) !=3D 0 ) + if ( (rc =3D iommu_domain_init(d, config->iommu_opts)) !=3D 0 ) goto fail; =20 if ( (rc =3D p2m_init(d)) !=3D 0 ) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index dbdf6b1bc2..c0faf68852 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -611,7 +611,7 @@ int arch_domain_create(struct domain *d, if ( (rc =3D init_domain_irq_mapping(d)) !=3D 0 ) goto fail; =20 - if ( (rc =3D iommu_domain_init(d)) !=3D 0 ) + if ( (rc =3D iommu_domain_init(d, config->iommu_opts)) !=3D 0 ) goto fail; =20 psr_domain_init(d); diff --git a/xen/common/domain.c b/xen/common/domain.c index 4681f29c8b..0733ee8b0a 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -308,6 +308,13 @@ static int sanitise_domain_config(struct xen_domctl_cr= eatedomain *config) return -EINVAL; } =20 + if ( !(config->flags & XEN_DOMCTL_CDF_iommu) && config->iommu_opts ) + { + dprintk(XENLOG_INFO, + "IOMMU options specified but IOMMU not enabled\n"); + return -EINVAL; + } + if ( config->max_vcpus < 1 ) { dprintk(XENLOG_INFO, "No vCPUS\n"); diff --git a/xen/common/domctl.c b/xen/common/domctl.c index 5dcfe3c8f6..6e6e9b9866 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -515,19 +515,6 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_= domctl) rover =3D dom; } =20 - /* - * For now, make sure the createdomain IOMMU flag is set if the - * IOMMU is enabled. When the flag comes under toolstack control - * this can go away. - */ - if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_iommu ) - { - ASSERT_UNREACHABLE(); - return -EINVAL; - } - if ( iommu_enabled ) - op->u.createdomain.flags |=3D XEN_DOMCTL_CDF_iommu; - d =3D domain_create(dom, &op->u.createdomain, false); if ( IS_ERR(d) ) { diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iomm= u.c index 71f17e7edc..e8fddc2dc7 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -163,7 +163,7 @@ static void __hwdom_init check_hwdom_reqs(struct domain= *d) iommu_hwdom_strict =3D true; } =20 -int iommu_domain_init(struct domain *d) +int iommu_domain_init(struct domain *d, unsigned int opts) { struct domain_iommu *hd =3D dom_iommu(d); int ret =3D 0; @@ -187,6 +187,15 @@ int iommu_domain_init(struct domain *d) if ( is_hardware_domain(d) ) check_hwdom_reqs(d); /* may modify iommu_hwdom_strict */ =20 + /* + * Use shared page tables for HAP and IOMMU if the global option + * is enabled (from which we can infer the h/w is capable) and + * the domain options do not disallow it. HAP must, of course, also + * be enabled. + */ + hd->hap_pt_share =3D hap_enabled(d) && iommu_hap_pt_share && + !(opts & XEN_DOMCTL_IOMMU_no_sharept); + /* * NB: 'relaxed' h/w domains don't need the IOMMU mappings to be kept * in-sync with their assigned pages because all host RAM will be @@ -195,6 +204,8 @@ int iommu_domain_init(struct domain *d) if ( !is_hardware_domain(d) || iommu_hwdom_strict ) hd->need_sync =3D !iommu_use_hap_pt(d); =20 + ASSERT(!(hd->need_sync && hd->hap_pt_share)); + return 0; } =20 diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 1b3176adb5..ba84aea6ab 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -38,7 +38,7 @@ #include "hvm/save.h" #include "memory.h" =20 -#define XEN_DOMCTL_INTERFACE_VERSION 0x00000011 +#define XEN_DOMCTL_INTERFACE_VERSION 0x00000012 =20 /* * NB. xen_domctl.domain is an IN/OUT parameter for this operation. @@ -73,6 +73,14 @@ struct xen_domctl_createdomain { =20 uint32_t flags; =20 +#define _XEN_DOMCTL_IOMMU_no_sharept 0 +#define XEN_DOMCTL_IOMMU_no_sharept (1U << _XEN_DOMCTL_IOMMU_no_sharept) + +/* Max XEN_DOMCTL_IOMMU_* constant. Used for ABI checking. */ +#define XEN_DOMCTL_IOMMU_MAX XEN_DOMCTL_IOMMU_no_sharept + + uint32_t iommu_opts; + /* * Various domain limits, which impact the quantity of resources (glob= al * mapping space, xenheap, etc) a guest may consume. diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index 42a92a3379..7c3003f3f1 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -84,7 +84,7 @@ extern unsigned int iommu_dev_iotlb_timeout; int iommu_setup(void); int iommu_hardware_setup(void); =20 -int iommu_domain_init(struct domain *d); +int iommu_domain_init(struct domain *d, unsigned int opts); void iommu_hwdom_init(struct domain *d); void iommu_domain_destroy(struct domain *d); =20 @@ -278,10 +278,14 @@ struct domain_iommu { /* Features supported by the IOMMU */ DECLARE_BITMAP(features, IOMMU_FEAT_count); =20 + /* Does the guest share HAP mapping with the IOMMU? */ + bool hap_pt_share; + /* - * Does the guest reqire mappings to be synchonized, to maintain - * the default dfn =3D=3D pfn map. (See comment on dfn at the top of - * include/xen/mm.h). + * Does the guest require mappings to be synchronized, to maintain + * the default dfn =3D=3D pfn map? (See comment on dfn at the top of + * include/xen/mm.h). Note that hap_pt_share =3D=3D false does not + * necessarily imply this is true. */ bool need_sync; }; @@ -291,8 +295,7 @@ struct domain_iommu { #define iommu_clear_feature(d, f) clear_bit(f, dom_iommu(d)->features) =20 /* Are we using the domain P2M table as its IOMMU pagetable? */ -#define iommu_use_hap_pt(d) \ - (hap_enabled(d) && is_iommu_enabled(d) && iommu_hap_pt_share) +#define iommu_use_hap_pt(d) (dom_iommu(d)->hap_pt_share) =20 /* Does the IOMMU pagetable need to be kept synchronized with the P2M */ #ifdef CONFIG_HAS_PASSTHROUGH --=20 2.20.1.2.gb21ebb671 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel