From patchwork Tue Sep 6 05:17:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dongli Zhang X-Patchwork-Id: 9315661 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 DCB8760760 for ; Tue, 6 Sep 2016 05:21:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CFA6028B34 for ; Tue, 6 Sep 2016 05:21:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C459028B41; Tue, 6 Sep 2016 05:21:35 +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, UNPARSEABLE_RELAY 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 3B26D28B34 for ; Tue, 6 Sep 2016 05:21:34 +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 1bh8mg-0000y0-7L; Tue, 06 Sep 2016 05:18:58 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bh8me-0000xu-94 for xen-devel@lists.xen.org; Tue, 06 Sep 2016 05:18:56 +0000 Received: from [85.158.143.35] by server-9.bemta-6.messagelabs.com id 96/DF-28857-FB15EC75; Tue, 06 Sep 2016 05:18:55 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrBLMWRWlGSWpSXmKPExsXSO6nOVXd/4Ll wg62fmC2WfFzM4sDocXT3b6YAxijWzLyk/IoE1ox9574wFbyQqTj1cxpLA+MysS5GLg4hgVYm ib4Df5ghnK+MEs/mr2SBcDYwShy6/JG1i5ETyOlmlHh0OBHEZhPQkZh24BRYkYjAa0aJ/8/fM 4MkhAV8JFa+vANmswioSnRfbmUCsXkF3CVubfjIAmJLCMhJnDw2mRXCNpQ4/XAb4wRG7gWMDK sY1YtTi8pSi3SN9ZKKMtMzSnITM3N0DQ3M9HJTi4sT01NzEpOK9ZLzczcxAn3MAAQ7GDv+OR1 ilORgUhLlLVA9Gy7El5SfUpmRWJwRX1Sak1p8iFGGg0NJgtco4Fy4kGBRanpqRVpmDjDYYNIS HDxKIrxzQdK8xQWJucWZ6RCpU4yKUuK8S0ESAiCJjNI8uDZYgF9ilJUS5mUEOkSIpyC1KDezB FX+FaM4B6OSMO88kCk8mXklcNNfAS1mAlq8bvdpkMUliQgpqQbGiKsS2pyqNzw7w1S35T+8Y7 wu8t2KY5MbzSVKFbtU30zY8a/4bum2oEl2qYp/nmvbGcZNe7a1fy6HQ4jrRIWXDi69/leiEsO 5p7fVyx7Yxa4XoMKeeKmC0581zHhDzrq/X5PfOTkYZlb65GUK7q1av0u+1Upm0hO1TYWRj1Sf ipTYfv7/ZYESS3FGoqEWc1FxIgBEpxUiawIAAA== X-Env-Sender: dongli.zhang@oracle.com X-Msg-Ref: server-12.tower-21.messagelabs.com!1473139133!31828274!1 X-Originating-IP: [141.146.126.69] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMTQxLjE0Ni4xMjYuNjkgPT4gMjc3MjE4\n X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Received: (qmail 45913 invoked from network); 6 Sep 2016 05:18:54 -0000 Received: from aserp1040.oracle.com (HELO aserp1040.oracle.com) (141.146.126.69) by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 6 Sep 2016 05:18:54 -0000 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u865IkIX029740 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 Sep 2016 05:18:46 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u865IjWf021948 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 Sep 2016 05:18:45 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u865IhOM009398; Tue, 6 Sep 2016 05:18:44 GMT Received: from linux.cn.oracle.com (/10.182.70.252) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 Sep 2016 22:18:43 -0700 From: Dongli Zhang To: xen-devel@lists.xen.org, wei.liu2@citrix.com, tim@xen.org, sstabellini@kernel.org, konrad.wilk@oracle.com, jbeulich@suse.com, ian.jackson@eu.citrix.com, George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com Date: Tue, 6 Sep 2016 13:17:38 +0800 Message-Id: <1473139058-32003-1-git-send-email-dongli.zhang@oracle.com> X-Mailer: git-send-email 1.9.1 X-Source-IP: userv0021.oracle.com [156.151.31.71] Subject: [Xen-devel] [PATCH 1/1] xen: move TLB-flush filtering out into populate_physmap 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 This patch implemented parts of TODO left in commit id a902c12ee45fc9389eb8fe54eeddaf267a555c58. It moved TLB-flush filtering out into populate_physmap. Because of TLB-flush in alloc_heap_pages, it's very slow to create a guest with memory size of more than 100GB on host with 100+ cpus. This patch introduced a "MEMF_no_tlbflush" bit to memflag to indicate whether TLB-flush should be done in alloc_heap_pages or its caller populate_physmap. Once this bit is set in memflag, alloc_heap_pages will ignore TLB-flush. Signed-off-by: Dongli Zhang --- xen/common/memory.c | 26 ++++++++++++++++++++++++++ xen/common/page_alloc.c | 3 ++- xen/include/xen/mm.h | 2 ++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/xen/common/memory.c b/xen/common/memory.c index f34dd56..14ec5fa 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -141,6 +141,8 @@ static void populate_physmap(struct memop_args *a) unsigned int i, j; xen_pfn_t gpfn, mfn; struct domain *d = a->domain, *curr_d = current->domain; + bool_t need_tlbflush = 0; + uint32_t tlbflush_timestamp = 0; if ( !guest_handle_subrange_okay(a->extent_list, a->nr_done, a->nr_extents-1) ) @@ -149,6 +151,8 @@ static void populate_physmap(struct memop_args *a) if ( a->extent_order > (a->memflags & MEMF_populate_on_demand ? MAX_ORDER : max_order(curr_d)) ) return; + + a->memflags |= MEMF_no_tlbflush; for ( i = a->nr_done; i < a->nr_extents; i++ ) { @@ -213,6 +217,18 @@ static void populate_physmap(struct memop_args *a) i, a->nr_extents); goto out; } + + for ( j = 0; j < (1U << a->extent_order); j++ ) + { + if ( page[j].u.free.need_tlbflush && + (page[j].tlbflush_timestamp <= tlbflush_current_time()) && + (!need_tlbflush || + (page[j].tlbflush_timestamp > tlbflush_timestamp)) ) + { + need_tlbflush = 1; + tlbflush_timestamp = page[j].tlbflush_timestamp; + } + } mfn = page_to_mfn(page); } @@ -232,6 +248,16 @@ static void populate_physmap(struct memop_args *a) } out: + if ( need_tlbflush ) + { + cpumask_t mask = cpu_online_map; + tlbflush_filter(mask, tlbflush_timestamp); + if ( !cpumask_empty(&mask) ) + { + perfc_incr(need_flush_tlb_flush); + flush_tlb_mask(&mask); + } + } a->nr_done = i; } diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index 18ff6cf..79f633b 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -827,7 +827,8 @@ static struct page_info *alloc_heap_pages( BUG_ON(pg[i].count_info != PGC_state_free); pg[i].count_info = PGC_state_inuse; - if ( pg[i].u.free.need_tlbflush && + if ( !(memflags & MEMF_no_tlbflush) && + pg[i].u.free.need_tlbflush && (pg[i].tlbflush_timestamp <= tlbflush_current_time()) && (!need_tlbflush || (pg[i].tlbflush_timestamp > tlbflush_timestamp)) ) diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h index 58bc0b8..880ca88 100644 --- a/xen/include/xen/mm.h +++ b/xen/include/xen/mm.h @@ -221,6 +221,8 @@ struct npfec { #define MEMF_exact_node (1U<<_MEMF_exact_node) #define _MEMF_no_owner 5 #define MEMF_no_owner (1U<<_MEMF_no_owner) +#define _MEMF_no_tlbflush 6 +#define MEMF_no_tlbflush (1U<<_MEMF_no_tlbflush) #define _MEMF_node 8 #define MEMF_node_mask ((1U << (8 * sizeof(nodeid_t))) - 1) #define MEMF_node(n) ((((n) + 1) & MEMF_node_mask) << _MEMF_node)