Received: by 10.223.164.202 with SMTP id h10csp29367wrb; Mon, 13 Nov 2017 02:03:14 -0800 (PST) X-Google-Smtp-Source: AGs4zMZeKTj79LxADyq2jjgLJRZDklfaZ3kqHz4WF4SzbSSXisOVi54ycw/NGyV2k8FCp0OwGQX1 X-Received: by 10.101.64.133 with SMTP id t5mr7914759pgp.299.1510567394291; Mon, 13 Nov 2017 02:03:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510567394; cv=none; d=google.com; s=arc-20160816; b=zyjZMdScq0S/Mzi5ZdnmHktPPh7H3UxBY07a18yT6cm0KyEgI7rFk852AJkiDVGYDT MF8fe8ND7JlCSbXKKMSw7WkPtT6BvBmBbkmQDBqFOevh0LeozyN+kbS3+gNZ0ZH1daU7 Jf7nT1aQOGnnnHml2IEUVS82OtM07MjPxSZ/GQ7RgkwIxJa+StIzHQnXFnevK+zptvDO zZhL0Od0EYt4vSudb6mUHNrjOMoHB4gFLYIT8Cik18GfJd9N0jJ+mcQ7DCjCjAWMOTGG RahtXEXoTOxe5HH7i7UqiMN3qL36H1sRlNuSlRNEg2ic6Qf5wsmP/abMScqkvG0TOabK JSZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=xGyYrSaoI9kH6IUsJZy+OP0x7k9DASAzeAgbAnCmntI=; b=Cn7atxqpTI1KZjjQFbimiL/gV/A8WnvSIs8Io2eQNt4Fy9pmkBT/f6+/ptNELHuI0N TSMOALx06tVtT73WKAOuwoNpabKH7td/xCGtgMq5Ef2nGgJUrACZujIw3eq27DsCk6B7 CFgr74I+ZwMZAmxk0Sz8Ql7nsjRAXlx/2ZCB9SkMXevQ18Hhpthb2NIv1PCmtdTrunes dT1AaCMHnYjpiFTFI8ONPym/i2nJuBerBYcfbTNtowXVOFSnzKTn6KjNlkZrZjRBiry+ bw2erlqNzqskrAp2WNkAbyuEPa8l5g6J2jZfrphuFV5fcVXAgmh5LCLVKN9NBm3es5ig ThgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Q1RT/wLL; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g3si13865498plb.276.2017.11.13.02.03.01; Mon, 13 Nov 2017 02:03:14 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Q1RT/wLL; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752260AbdKMKCL (ORCPT + 93 others); Mon, 13 Nov 2017 05:02:11 -0500 Received: from mail-pf0-f193.google.com ([209.85.192.193]:54479 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751523AbdKMKBa (ORCPT ); Mon, 13 Nov 2017 05:01:30 -0500 Received: by mail-pf0-f193.google.com with SMTP id n89so11471679pfk.11; Mon, 13 Nov 2017 02:01:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=xGyYrSaoI9kH6IUsJZy+OP0x7k9DASAzeAgbAnCmntI=; b=Q1RT/wLLqsf6COepS4BZek8SxQVD0VM+OxjelI3aTB7JZJ8qM/Yo/82jAABMbAs3Xi ygWxYfHMX3eIEDczGcOPLYFTGeI1QpuL9K8K5Z31Y9LPA4/25ce+v+Mh8ij7iblqQlUy gfikAuElIL1HcCZl3e7klsmq+zDKoVPOQMP//+n93WkxEmTYiMSIUR47D302LUyq8h45 IzYSBgZZG1nZ16YTg06eXLWq7XqWh5HabvsuvTDV0LmBNSFFVZfPd8YMS9Sp97V+oyAC jkKuOfBoRBzrVPnan3vYiLvho6Fwze8vdZxJGGtpMCFPI/37pE0zI3s6OUJ2ztb7E95T TDPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xGyYrSaoI9kH6IUsJZy+OP0x7k9DASAzeAgbAnCmntI=; b=gF8etRhbfTq2bZAnmovwrCIZDe3/Edpqa4gbWAHYvz2TaO/EQ2V8oVAt0UZ9/2ZU+J UQ7p0kBuvNkCctwQsxbwMCguCslkF/4JngkbFJWuRnpEz1vLW9HhhhQoQYpGJMOs50/a tY5qQ0/CH0k5b0+WckyIzt2dw4yiEHC9i069wcttAuwWBW3q3Q9XtuiGLXLyGqxRzL8u /Ex51OwBnEpDmXeCBCTrk5dNo6jGjHCMgJxxQK3ma7jKQluC5PFmTIdvU3Ebg6gn7e0p 9DMCbYXH1IqaGivSUqsWAbXyVreWKxuF/nLT7R9JYUf+ARD9iOXDOf0l/qXdhym0PzrP LMbQ== X-Gm-Message-State: AJaThX4FXcVLwU/guof6qbL3r1hPGkIwhZiQIkD9RMchvtTlbV0m95nX 3RfqVeC6zLXpZh7IOA5hatrI9g== X-Received: by 10.84.213.9 with SMTP id f9mr8167814pli.76.1510567289520; Mon, 13 Nov 2017 02:01:29 -0800 (PST) Received: from localhost ([203.205.141.123]) by smtp.gmail.com with ESMTPSA id t84sm5230816pfe.160.2017.11.13.02.01.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Nov 2017 02:01:28 -0800 (PST) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Peter Zijlstra , Wanpeng Li Subject: [PATCH v5 2/4] KVM: X86: Add paravirt remote TLB flush Date: Mon, 13 Nov 2017 02:01:18 -0800 Message-Id: <1510567280-19376-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1510567280-19376-1-git-send-email-wanpeng.li@hotmail.com> References: <1510567280-19376-1-git-send-email-wanpeng.li@hotmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wanpeng Li Remote flushing api's does a busy wait which is fine in bare-metal scenario. But with-in the guest, the vcpus might have been pre-empted or blocked. In this scenario, the initator vcpu would end up busy-waiting for a long amount of time. This patch set implements para-virt flush tlbs making sure that it does not wait for vcpus that are sleeping. And all the sleeping vcpus flush the tlb on guest enter. The best result is achieved when we're overcommiting the host by running multiple vCPUs on each pCPU. In this case PV tlb flush avoids touching vCPUs which are not scheduled and avoid the wait on the main CPU. Test on a Haswell i7 desktop 4 cores (2HT), so 8 pCPUs, running ebizzy in one linux guest. ebizzy -M vanilla optimized boost 8 vCPUs 10152 10083 -0.68% 16 vCPUs 1224 4866 297.5% 24 vCPUs 1109 3871 249% 32 vCPUs 1025 3375 229.3% Cc: Paolo Bonzini Cc: Radim Krčmář Cc: Peter Zijlstra Signed-off-by: Wanpeng Li --- Documentation/virtual/kvm/cpuid.txt | 4 ++++ arch/x86/include/uapi/asm/kvm_para.h | 2 ++ arch/x86/kernel/kvm.c | 42 +++++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Documentation/virtual/kvm/cpuid.txt b/Documentation/virtual/kvm/cpuid.txt index 117066a..9693fcc 100644 --- a/Documentation/virtual/kvm/cpuid.txt +++ b/Documentation/virtual/kvm/cpuid.txt @@ -60,6 +60,10 @@ KVM_FEATURE_PV_DEDICATED || 8 || guest checks this feature bit || || mizations such as usage of || || qspinlocks. ------------------------------------------------------------------------------ +KVM_FEATURE_PV_TLB_FLUSH || 9 || guest checks this feature bit + || || before enabling paravirtualized + || || tlb flush. +------------------------------------------------------------------------------ KVM_FEATURE_CLOCKSOURCE_STABLE_BIT || 24 || host will warn if no guest-side || || per-cpu warps are expected in || || kvmclock. diff --git a/arch/x86/include/uapi/asm/kvm_para.h b/arch/x86/include/uapi/asm/kvm_para.h index 6d66556..e267d83 100644 --- a/arch/x86/include/uapi/asm/kvm_para.h +++ b/arch/x86/include/uapi/asm/kvm_para.h @@ -26,6 +26,7 @@ #define KVM_FEATURE_PV_EOI 6 #define KVM_FEATURE_PV_UNHALT 7 #define KVM_FEATURE_PV_DEDICATED 8 +#define KVM_FEATURE_PV_TLB_FLUSH 9 /* The last 8 bits are used to indicate how to interpret the flags field * in pvclock structure. If no bits are set, all flags are ignored. @@ -54,6 +55,7 @@ struct kvm_steal_time { #define KVM_VCPU_NOT_PREEMPTED (0 << 0) #define KVM_VCPU_PREEMPTED (1 << 0) +#define KVM_VCPU_SHOULD_FLUSH (1 << 1) #define KVM_CLOCK_PAIRING_WALLCLOCK 0 struct kvm_clock_pairing { diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 66ed3bc..78794c1 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -465,9 +465,40 @@ static void __init kvm_apf_trap_init(void) update_intr_gate(X86_TRAP_PF, async_page_fault); } +static DEFINE_PER_CPU(cpumask_var_t, __pv_tlb_mask); + +static void kvm_flush_tlb_others(const struct cpumask *cpumask, + const struct flush_tlb_info *info) +{ + u8 state; + int cpu; + struct kvm_steal_time *src; + struct cpumask *flushmask = this_cpu_cpumask_var_ptr(__pv_tlb_mask); + + if (unlikely(!flushmask)) + return; + + cpumask_copy(flushmask, cpumask); + /* + * We have to call flush only on online vCPUs. And + * queue flush_on_enter for pre-empted vCPUs + */ + for_each_cpu(cpu, flushmask) { + src = &per_cpu(steal_time, cpu); + state = READ_ONCE(src->preempted); + if ((state & KVM_VCPU_PREEMPTED)) { + if (try_cmpxchg(&src->preempted, &state, + state | KVM_VCPU_SHOULD_FLUSH)) + __cpumask_clear_cpu(cpu, flushmask); + } + } + + native_flush_tlb_others(flushmask, info); +} + void __init kvm_guest_init(void) { - int i; + int i, cpu; if (!kvm_para_available()) return; @@ -484,6 +515,15 @@ void __init kvm_guest_init(void) pv_time_ops.steal_clock = kvm_steal_clock; } + if (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH) && + !kvm_para_has_feature(KVM_FEATURE_PV_DEDICATED)) { + for_each_possible_cpu(cpu) { + zalloc_cpumask_var_node(per_cpu_ptr(&__pv_tlb_mask, cpu), + GFP_KERNEL, cpu_to_node(cpu)); + } + pv_mmu_ops.flush_tlb_others = kvm_flush_tlb_others; + } + if (kvm_para_has_feature(KVM_FEATURE_PV_EOI)) apic_set_eoi_write(kvm_guest_apic_eoi_write); -- 2.7.4 From 1583938707897150590@xxx Mon Nov 13 08:27:44 +0000 2017 X-GM-THRID: 1583909069046568739 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread