Received: by 10.223.164.202 with SMTP id h10csp2709590wrb; Sun, 12 Nov 2017 16:36:38 -0800 (PST) X-Google-Smtp-Source: AGs4zMZs6dhnK95+UhKvv3t65+vVe/BOsVAqW+xFaWkv5XcAmUDbxp00XEEdNf/ztc7D30KgdFzH X-Received: by 10.159.230.15 with SMTP id u15mr286611plq.392.1510533398684; Sun, 12 Nov 2017 16:36:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510533398; cv=none; d=google.com; s=arc-20160816; b=POn1vRY4rKxJGIyYslbTpAqi4ga54iHpCI+CZy3UEsxbazGhnRtZt6SjAtSOlJJ63P 52kS/TRrXw2TvJ0M1GdRxt6f/OyR5dbTBBr2tRXfqEDxdag2+XFNc9BDvDY/0M1Iqb2k AdhV9XYy0p+tP1Yn5kkl5jVFBmnXQMnIz734C8+jsQLkMPzoOWBvDSaX+pc0AYNos3+i 22Z7FYqRn+lzw6XALACM/oQZC5OuLgYwNcHplZ102Lr+p1+4+YHFJTlXPKTqPOAu6ZHU nRZZGQHGhS8verDNlRF/k+Wjd/nnALQOA8dluJe+1Y9x+RcI6XWHCZa4oBDjDe/g7SzV mvsQ== 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=HO0gqI5FDGaKKNA8ucnFojGfWq3L5oSSutbqrHQNOeo=; b=FFszC0DqM9CAdH6iCZi5RMQpAuoCQfXk0APzvwsYUHvJOh8E558IJC1FrjlE+rr4wi jn438uxQ6caKGplSAS6jl2Q2k6+1kK7jnmaOAANe65XYjx8tpBOMqNxmtH7iu42Pvnm9 n+fw4NSnjdxwARbItncqV80gn80fyjC6C0q2/w//bQjLE6kHWkTwmPVUw5HeDHqUxkZb /HRrco2rcOMR9rNjYIcSlCIT9aa3x6WC4xmErGeX6TUxYJPl7aVNWVibwotcM1kbtDa4 OKmO0Pu7pfeiqlCXnk8ODJB3bc+zxds3Aj/YpWF9PUK96IGXyaE/9Ahf6ed/wsurvmHl O/ug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=MNI80J+6; 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 4si2007955plc.324.2017.11.12.16.36.26; Sun, 12 Nov 2017 16:36:38 -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=MNI80J+6; 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 S1751683AbdKMAeV (ORCPT + 87 others); Sun, 12 Nov 2017 19:34:21 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:50165 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751335AbdKMAdf (ORCPT ); Sun, 12 Nov 2017 19:33:35 -0500 Received: by mail-pg0-f68.google.com with SMTP id g6so11447811pgn.6; Sun, 12 Nov 2017 16:33:34 -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=HO0gqI5FDGaKKNA8ucnFojGfWq3L5oSSutbqrHQNOeo=; b=MNI80J+6Kmm+GcRGC5KQrsLb9XN0rJKSgKgi3iCxUyhw5eMhLcYDcJ8R13D2EeZonc xnSsBp7I7gFQKbq1oEVdy2CsL30wBBpD2Bfn1VuUsCbD2VoCP33447UeprdqqWh8MuEH 92el/WmvatqEzFJbjDWDnu/0AB3/NPE5n5QLWRk1/ypuoT/luSmUh6lxoADhz6CqlbLQ dv3xi4ue3Qk05qaorJsrOeJ2Q80dnSTnrV2Sk/LEZBAl93bFjiKz9NEkXlNPOuMY7Qk7 sAh+yDBpJ9epC2pk5cpoHPuxB0PfDGWDafish0wMlFdWjt7tE3uMaenlrENTNlsLWYXE 2JTw== 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=HO0gqI5FDGaKKNA8ucnFojGfWq3L5oSSutbqrHQNOeo=; b=Db3BiA27ZiyAQTEiT+xnNFnnIIsLi+MLGGmL2wM4UtmgLnn9lGr4PR7bgzQgm3noLB yFbNa+VPSore+jqu/zzH7eCbOfxYQInF0C1kc18zHkWpTt5u5VB4H9s6JLXucFlErffU sOLOvEed4qv/KlrPS9MUSB3XmraZuL0SEz8zAorQqW1MLkOakneBDE9kvJaUIf8qhVlb 6Onf3RigZbP2MzLEbyFeivmzZQJU4BSnoMHmBX3QGvOEY0YL3nUYQrqeNKd+E0EiRcVk 6k8mEruBqxWqb9CGrdddUkdIgq2wUAaUAXiyeh/BpMS60i0w8+PDACHd++dMFM3G3XTo B/NQ== X-Gm-Message-State: AJaThX4xq/aD2B/P8uAmF6FGP/uUdolXPgu5ARHhJOlHnRvA7maBOZ0C u5PB4rp/QTv0fnZEBlojg3T+tw== X-Received: by 10.99.104.6 with SMTP id d6mr6966849pgc.319.1510533214255; Sun, 12 Nov 2017 16:33:34 -0800 (PST) Received: from localhost ([203.205.141.123]) by smtp.gmail.com with ESMTPSA id a4sm31020870pfj.72.2017.11.12.16.33.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 12 Nov 2017 16:33:33 -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 v4 2/4] KVM: X86: Add paravirt remote TLB flush Date: Sun, 12 Nov 2017 16:33:24 -0800 Message-Id: <1510533206-9821-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1510533206-9821-1-git-send-email-wanpeng.li@hotmail.com> References: <1510533206-9821-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, cpumask) { + 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 1583281783746855490@xxx Mon Nov 06 02:26:12 +0000 2017 X-GM-THRID: 1583281783746855490 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread