From patchwork Sat Mar 18 10:53:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yu Zhang X-Patchwork-Id: 9632123 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 0AE47602D6 for ; Sat, 18 Mar 2017 11:15:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F3CFE28449 for ; Sat, 18 Mar 2017 11:15:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E8AA328450; Sat, 18 Mar 2017 11:15:18 +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 7C50928449 for ; Sat, 18 Mar 2017 11:15:18 +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 1cpCIS-0001kH-BW; Sat, 18 Mar 2017 11:13:20 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cpCIQ-0001jS-SC for xen-devel@lists.xen.org; Sat, 18 Mar 2017 11:13:18 +0000 Received: from [85.158.143.35] by server-1.bemta-6.messagelabs.com id 1E/C5-27678-E461DC85; Sat, 18 Mar 2017 11:13:18 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrPLMWRWlGSWpSXmKPExsXS1tYhr+srdjb CYM8iCYslHxezODB6HN39mymAMYo1My8pvyKBNeP61Q8sBU+0Klp+nmFuYLwq18XIySEkUCmx 4VwrM4gtIcArcWTZDFYI20/i+tqTLF2MXEA17YwSX/bfZgNJsAloS/xY/ZsRxBYRkJa49vkyI 0gRs8BeRolPa46CFQkL1EtMnXWaCcRmEVCV2DKrnwXE5hXwlFjfM40RYoOcxMljk8G2cQp4SZ y48YoZ4iJPif3rPrBNYORdwMiwilGjOLWoLLVI19hQL6koMz2jJDcxM0fX0MBMLze1uDgxPTU nMalYLzk/dxMjMCAYgGAHY9OiwEOMkhxMSqK8n+cejBDiS8pPqcxILM6ILyrNSS0+xCjDwaEk wfv0H1BOsCg1PbUiLTMHGJowaQkOHiUR3qD/QGne4oLE3OLMdIjUKUZFKXFeJZCEAEgiozQPr g0WD5cYZaWEeRmBDhHiKUgtys0sQZV/xSjOwagkzPsZZDtPZl4J3PRXQIuZgBZP4wNbXJKIkJ JqYCz6bvOkKKWR7a/A9VOLTsSt4xVpLuZ/f+DD/Ul5ulK2/WtmbV475ZpzVATj+693zjSwh/j be/yTTf/MIaz+9tPadXGvD16ICvjrPi3xWkiFReAB57k7dSaKzD3CbNaQZSP9TlCwQ9i4WWtN RU+cTviX+Nenlhz1l5HZo/LqllN+5UHmBYWGoUosxRmJhlrMRcWJAFApToiCAgAA X-Env-Sender: yu.c.zhang@linux.intel.com X-Msg-Ref: server-16.tower-21.messagelabs.com!1489835587!58458127!3 X-Originating-IP: [134.134.136.31] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 10701 invoked from network); 18 Mar 2017 11:13:17 -0000 Received: from mga06.intel.com (HELO mga06.intel.com) (134.134.136.31) by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 18 Mar 2017 11:13:17 -0000 Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga104.jf.intel.com with ESMTP; 18 Mar 2017 04:13:16 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,182,1486454400"; d="scan'208";a="77904918" Received: from zhangyu-optiplex-9020.bj.intel.com ([10.238.135.159]) by fmsmga005.fm.intel.com with ESMTP; 18 Mar 2017 04:13:15 -0700 From: Yu Zhang To: xen-devel@lists.xen.org Date: Sat, 18 Mar 2017 18:53:55 +0800 Message-Id: <1489834435-6166-6-git-send-email-yu.c.zhang@linux.intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1489834435-6166-1-git-send-email-yu.c.zhang@linux.intel.com> References: <1489834435-6166-1-git-send-email-yu.c.zhang@linux.intel.com> Cc: George Dunlap , Andrew Cooper , Paul Durrant , zhiyuan.lv@intel.com, Jan Beulich Subject: [Xen-devel] [PATCH v8 5/5] x86/ioreq server: Synchronously reset outstanding p2m_ioreq_server entries when an ioreq server unmaps. 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 After an ioreq server has unmapped, the remaining p2m_ioreq_server entries need to be reset back to p2m_ram_rw. This patch does this synchronously by iterating the p2m table. The synchronous resetting is necessary because we need to guarantee the p2m table is clean before another ioreq server is mapped. And since the sweeping of p2m table could be time consuming, it is done with hypercall continuation. Signed-off-by: Yu Zhang --- Cc: Paul Durrant Cc: Jan Beulich Cc: Andrew Cooper Cc: George Dunlap changes in v2: - According to comments from Jan and Andrew: do not use the HVMOP type hypercall continuation method. Instead, adding an opaque in xen_dm_op_map_mem_type_to_ioreq_server to store the gfn. - According to comments from Jan: change routine's comments and name of parameters of p2m_finish_type_change(). changes in v1: - This patch is splitted from patch 4 of last version. - According to comments from Jan: update the gfn_start for when use hypercall continuation to reset the p2m type. - According to comments from Jan: use min() to compare gfn_end and max mapped pfn in p2m_finish_type_change() --- xen/arch/x86/hvm/dm.c | 41 ++++++++++++++++++++++++++++++++++++++--- xen/arch/x86/mm/p2m.c | 29 +++++++++++++++++++++++++++++ xen/include/asm-x86/p2m.h | 7 +++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/hvm/dm.c b/xen/arch/x86/hvm/dm.c index 1619feb..9e1e27b 100644 --- a/xen/arch/x86/hvm/dm.c +++ b/xen/arch/x86/hvm/dm.c @@ -385,16 +385,51 @@ static int dm_op(domid_t domid, case XEN_DMOP_map_mem_type_to_ioreq_server: { - const struct xen_dm_op_map_mem_type_to_ioreq_server *data = + struct xen_dm_op_map_mem_type_to_ioreq_server *data = &op.u.map_mem_type_to_ioreq_server; + unsigned long first_gfn = data->opaque; + unsigned long last_gfn; + + const_op = false; rc = -EOPNOTSUPP; /* Only support for HAP enabled hvm. */ if ( !hap_enabled(d) ) break; - rc = hvm_map_mem_type_to_ioreq_server(d, data->id, - data->type, data->flags); + if ( first_gfn == 0 ) + rc = hvm_map_mem_type_to_ioreq_server(d, data->id, + data->type, data->flags); + /* + * Iterate p2m table when an ioreq server unmaps from p2m_ioreq_server, + * and reset the remaining p2m_ioreq_server entries back to p2m_ram_rw. + */ + if ( (first_gfn > 0) || (data->flags == 0 && rc == 0) ) + { + struct p2m_domain *p2m = p2m_get_hostp2m(d); + + while ( read_atomic(&p2m->ioreq.entry_count) && + first_gfn <= p2m->max_mapped_pfn ) + { + /* Iterate p2m table for 256 gfns each time. */ + last_gfn = first_gfn + 0xff; + + p2m_finish_type_change(d, first_gfn, last_gfn, + p2m_ioreq_server, p2m_ram_rw); + + first_gfn = last_gfn + 1; + + /* Check for continuation if it's not the last iteration. */ + if ( first_gfn <= p2m->max_mapped_pfn && + hypercall_preempt_check() ) + { + rc = -ERESTART; + data->opaque = first_gfn; + break; + } + } + } + break; } diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 87f274d..03bc309 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -1038,6 +1038,35 @@ void p2m_change_type_range(struct domain *d, p2m_unlock(p2m); } +/* Synchronously modify the p2m type for a range of gfns from ot to nt. */ +void p2m_finish_type_change(struct domain *d, + unsigned long first_gfn, unsigned long last_gfn, + p2m_type_t ot, p2m_type_t nt) +{ + struct p2m_domain *p2m = p2m_get_hostp2m(d); + p2m_type_t t; + unsigned long gfn = first_gfn; + + ASSERT(first_gfn <= last_gfn); + ASSERT(ot != nt); + ASSERT(p2m_is_changeable(ot) && p2m_is_changeable(nt)); + + p2m_lock(p2m); + + last_gfn = min(last_gfn, p2m->max_mapped_pfn); + while ( gfn <= last_gfn ) + { + get_gfn_query_unlocked(d, gfn, &t); + + if ( t == ot ) + p2m_change_type_one(d, gfn, t, nt); + + gfn++; + } + + p2m_unlock(p2m); +} + /* * Returns: * 0 for success diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h index 395f125..3d665e8 100644 --- a/xen/include/asm-x86/p2m.h +++ b/xen/include/asm-x86/p2m.h @@ -611,6 +611,13 @@ void p2m_change_type_range(struct domain *d, int p2m_change_type_one(struct domain *d, unsigned long gfn, p2m_type_t ot, p2m_type_t nt); +/* Synchronously change the p2m type for a range of gfns: + * [first_gfn ... last_gfn]. */ +void p2m_finish_type_change(struct domain *d, + unsigned long first_gfn, + unsigned long last_gfn, + p2m_type_t ot, p2m_type_t nt); + /* Report a change affecting memory types. */ void p2m_memory_type_changed(struct domain *d);