Received: by 10.223.164.202 with SMTP id h10csp2563705wrb; Mon, 27 Nov 2017 20:07:12 -0800 (PST) X-Google-Smtp-Source: AGs4zMa+unbYBW//Jnbd+8cg8VbHo592G2qqFwK3RvrDCPZzNVwwAd5BPrVRobirIB8LogL2w48x X-Received: by 10.84.217.150 with SMTP id p22mr29220389pli.427.1511842031989; Mon, 27 Nov 2017 20:07:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511842031; cv=none; d=google.com; s=arc-20160816; b=0axd7TCMmqTauwXuK7mrNLmT6mTnGOnGmNYYBP2F+AuJs0rEqv4f6rwVgCrYIGrdHm 2U9aauQjrtgpyL+/TU4Pr0U/d0ysUvFUCHgUdL/MHFOM6GN3cQc7d2RHGinJ1fNgT0ZR YeSkHi2fp8mELK2F0Xone2YLGZjd+MQoTAf6dFiPx39qhDBBekVAcS5ZViPiPUwKB1cX 9VNSGpOKHXRSPGhrI6RzLDSotbE/sIlhiO9zGaGeY6Mt4amwmQYX727GFCmjIgQJr8j7 OG2+v1PmmYfRWREWq4pVBFx6Jcc9svanwVAaCegUwTLpedX+6IFdZjySQSFcjZMUJR3S HSQg== 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=curLrs3NqJIcGAkduRd+DBQiN1PT/KRaZ4eFWSaf5G8=; b=TqvSvGQpRS/kDVekWYWcPbqkSkQXHwpBxfrhRM8c+jSlt5xSQEIi0qAqz/NVTbdR72 y3dXf/0K0o1KZ0VP31x0MjfX0zYFt2oZgVt84Q7KisKOPfkX2u9SXo/8LW/JHLK9L65D 9SFnmMBJvE6WBYHCWYFDBk9UZbjPXVsoU//Kji1oG0gQ/uhy+GQggOU/qXBNxQaVZsbi URJ5Je93A2Hv4Pnh48K+S8DJcilzYh9SB7a9s6x4GrthP2+uSGWcmN+eQWVv64Fk2u8t Eq9qinvotSbYRJuxDMeaund/2hXzV//1lDRPYWcQLFXu0rteZuuAC6Hc6+jErL9c4hJt RN6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Axk0T0/s; 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 l7si23980826pgs.719.2017.11.27.20.07.00; Mon, 27 Nov 2017 20:07:11 -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=Axk0T0/s; 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 S1753650AbdK1EGM (ORCPT + 77 others); Mon, 27 Nov 2017 23:06:12 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:44555 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753398AbdK1EGI (ORCPT ); Mon, 27 Nov 2017 23:06:08 -0500 Received: by mail-pg0-f65.google.com with SMTP id c123so19713361pga.11; Mon, 27 Nov 2017 20:06:07 -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=curLrs3NqJIcGAkduRd+DBQiN1PT/KRaZ4eFWSaf5G8=; b=Axk0T0/sdl549qe59TBDHZphvd8nc0nDG47lnUyanG/3FlJi0FgybgsEpJyQcIM029 CYa7mCgwgQzmTnhQQkVbaLz+ugJrAAvCAZ7BwKKosjXJJDrJ09/rFzq4bEZUS9+1EUAX ad2qymjSpcIcuyFmt5vJjRY0AGH8Hw4PrTnA2EISBpZKScDU5TqjHFXVX/0KbZpqSOQE vjnSyaHkFbAkbOcSFzb+dKd8X6hKKaqgZuApBVAsLrFHr1p39r1ppqry//p1LlPolJS3 3BU43P28IkCenrT1PLSlVoADj001WEWISHLI/i4NuQVl9VdDlFR3lndWvn7fmu4dVTBU kmqg== 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=curLrs3NqJIcGAkduRd+DBQiN1PT/KRaZ4eFWSaf5G8=; b=dHQ03EdWPSasR6VBZ/HBS05/aw53d3DiTRLabGKHL//TYo5QOwDP7bOKOH5BcyLfKw 2f3lClQwz5OixuxWQgU97wAA3LMRQ/xYApAxV79x1W057ratkdcr4nZEnA4Jj9vjjIdR CQSBCVgfBYFFkuKdDw8eT2PicbAMf3wQoKbojYc1IS1sSFjYRgukVYOS03FELwCVE5Y5 qUbpbVYzH3sbdiBXKjmq3oZKvZrxMchV3khwV5zocUT3QE9lL3DYGCD7uxsVK5zoVCqJ Mfm+USaL4+Nnp+pUiOV3WgToL/xIgeACUaKlgriVtvn8eLF2vsbEXI7k6KVh3pyHZ6yJ JqFA== X-Gm-Message-State: AJaThX7y6WwszQyk2czH1rndpaaF4wc48RWANpYvkPNHOmJL/yDIqiod AozfR9Cj29f/A69oZ6uDaj4DKQ== X-Received: by 10.101.75.78 with SMTP id k14mr38825416pgt.272.1511841967246; Mon, 27 Nov 2017 20:06:07 -0800 (PST) Received: from localhost ([203.205.141.123]) by smtp.gmail.com with ESMTPSA id a24sm56501884pfc.79.2017.11.27.20.06.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 27 Nov 2017 20:06:06 -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?= , Wanpeng Li , Peter Zijlstra Subject: [PATCH v6 2/4] KVM: X86: Add Paravirt TLB Shootdown Date: Mon, 27 Nov 2017 20:05:53 -0800 Message-Id: <1511841955-7375-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1511841955-7375-1-git-send-email-wanpeng.li@hotmail.com> References: <1511841955-7375-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. Testing on a Xeon Gold 6142 2.6GHz 2 sockets, 32 cores, 64 threads, so 64 pCPUs, and each VM is 64 vCPUs. ebizzy -M vanilla optimized boost 1VM 46799 48670 4% 2VM 23962 42691 78% 3VM 16152 37539 132% 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 | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/Documentation/virtual/kvm/cpuid.txt b/Documentation/virtual/kvm/cpuid.txt index 3c65feb..dcab6dc 100644 --- a/Documentation/virtual/kvm/cpuid.txt +++ b/Documentation/virtual/kvm/cpuid.txt @@ -54,6 +54,10 @@ KVM_FEATURE_PV_UNHALT || 7 || guest checks this feature bit || || before enabling paravirtualized || || spinlock support. ------------------------------------------------------------------------------ +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 763b692..8fbcc16 100644 --- a/arch/x86/include/uapi/asm/kvm_para.h +++ b/arch/x86/include/uapi/asm/kvm_para.h @@ -25,6 +25,7 @@ #define KVM_FEATURE_STEAL_TIME 5 #define KVM_FEATURE_PV_EOI 6 #define KVM_FEATURE_PV_UNHALT 7 +#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. @@ -53,6 +54,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 6610b92..5645ed6 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -498,6 +498,37 @@ static void __init kvm_apf_trap_init(void) update_intr_gate(X86_TRAP_PF, async_page_fault); } +static DEFINE_PER_CPU(cpumask_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; + cpumask_t *flushmask = &per_cpu(__pv_tlb_mask, smp_processor_id()); + + 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); +} + static void __init kvm_guest_init(void) { int i; @@ -517,6 +548,9 @@ static void __init kvm_guest_init(void) pv_time_ops.steal_clock = kvm_steal_clock; } + if (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH)) + 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 1585281262875379228@xxx Tue Nov 28 04:07:04 +0000 2017 X-GM-THRID: 1585281262875379228 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread