Received: by 10.223.164.202 with SMTP id h10csp21117wrb; Fri, 10 Nov 2017 01:53:00 -0800 (PST) X-Google-Smtp-Source: ABhQp+S6uvrQLzaJDjMBaOTXlge6m4pS5+oZtIU7mjL0qq/fkltaFdSsrNykFFN/Mi/DcwzQSXwv X-Received: by 10.84.236.74 with SMTP id h10mr3521369pln.2.1510307580695; Fri, 10 Nov 2017 01:53:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510307580; cv=none; d=google.com; s=arc-20160816; b=l7JJ6+lFsjnKDc0UvuT20zSMY0lSqX27RpB/awd6iSxsp0aLNqdaDA+53JEvw4y6v+ Q53XdoMvCjs6DKiR7jpskrML8A92uFe05y9trtoERZO6lh2nCgNd+7Iyrytyh+gXtwQt wL/qdIBopOnIKQ1NMJD5TUNt03fscORjHHXUVA9Q156bRAwkfShsFLl25oAZBVGbX1eW Dwft/Qk8bxHAWVP4OeSzFa05u8q/fMAhauQ0/fLW5FXLolv6QdZ+YLtz2CfWqGbkPfR+ U6f6w41m8FMTG8ddIxTfx2lXeU+g9HSSwntfR0s/NsMzMxbCY6lSMVKBEZPZOz3oM00s l2vA== 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=Yx+peeFexZeRjhBaHxz09RN1nC7cXGQfhRc/qaSMP8E=; b=a2Ms4RE0VXOz3IZ+OFS1vg1x3pU8rwxtKZ44WTrqNvmxE/E0RXknSlUzEE9IrmUtVX lQn0O1RD02NemxjsYthkG6glt1KW+7QZ1Z56wJaHFe3j6RxR7yxzoQ91wxtL36L7xK9+ R3sd8LL16kZ3/pACXv/3mNVa+YIMQdRqi28zVFSnDMpLMs9tiwJ9xYYuYW6NdHoYP/r7 y5KjAF4Yn5oAHgIidOnVkguxV9jEr2AS1WiH5+tj5lGkv3h/SEhSsB+TXe5UpH8NqcKm YmS8RJB60xGOzbdzGGyf5B6UJZR7u2iepZXPs9wZcR6CVYLSXooOpolTTgNqzMV0NV93 njAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=uHBftunk; 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 a5si8402241plh.517.2017.11.10.01.52.49; Fri, 10 Nov 2017 01:53:00 -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=uHBftunk; 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 S1752424AbdKJJvl (ORCPT + 81 others); Fri, 10 Nov 2017 04:51:41 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:45660 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752408AbdKJJt6 (ORCPT ); Fri, 10 Nov 2017 04:49:58 -0500 Received: by mail-pg0-f66.google.com with SMTP id l19so4438029pgo.2; Fri, 10 Nov 2017 01:49:58 -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=Yx+peeFexZeRjhBaHxz09RN1nC7cXGQfhRc/qaSMP8E=; b=uHBftunkr2PR5C3+1rRzatO6Tp38hEvjD8A88snNBTLEy99smCEDGpptVbM63qF7gb wNQqcZUi2JU5Tb8YDfeu00rcWIlpKFO7G3JllLa/jfTFtzVI1mFxRWEYrJ5U006AG2Pr Ph0GlDLHZ2+5ExZ7jTG37YkCuuMkbf7IjlexwV1kX+mSVvJ7NAvpvZyGUeenhE0sA192 SWq9LG8A4GywUkS+BUlkmt7Z+S+D8HxOZS7+379QSNcwqAXrnCpc5Xh3Vq0LRgL6526n T2MzcXwg/dtjOjU284cW0fGmltSkXW6VwfAZrc0xjG1Jfb0MakkE1JnjyDPtMnW+fyq0 Rg6A== 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=Yx+peeFexZeRjhBaHxz09RN1nC7cXGQfhRc/qaSMP8E=; b=fKlAWy4XG890ByI349mtVbRf4iy29Cu1c9zJyBEqQaJsgOPopgqoh+4znAcIrW6vPP h/JqgXxE8Sl6wUUQJAWmr7VRLap1MxiJeDX9TErIoNnvuSsK4ulUM7tcz5GrcAxlUa3u 7ECT7JYnBmmTr6dfVMz8ARdy8MNyJMWSZ72oO3ljzjLtjjQQIyz6AdQVMGWWb4GGsB2C mpSgO6G7+hdlnoSxTBWswO36LCgYfBR+mOQsk9smenA6QIvIFSnocDUqRpqCKPvTHBBP IVgZziGAW5ZYiwTzVoHgtpdn4J+9gB62bAs/XqkmbzNwzfiYJNkvXd8DsB8WJ53Gbt/6 XU+g== X-Gm-Message-State: AJaThX6TPy+3SbiF8TfcIhMwk6UJm9DObtYOF8eV/Hy1bSIqi4Ze5noJ Os9XLrRUduORT6tftnsipdHhgQ== X-Received: by 10.101.64.9 with SMTP id f9mr3610040pgp.114.1510307398087; Fri, 10 Nov 2017 01:49:58 -0800 (PST) Received: from localhost ([203.205.141.123]) by smtp.gmail.com with ESMTPSA id k24sm18545309pfj.151.2017.11.10.01.49.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Nov 2017 01:49:57 -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 v3 2/4] KVM: Add paravirt remote TLB flush Date: Fri, 10 Nov 2017 01:49:45 -0800 Message-Id: <1510307387-14812-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1510307387-14812-1-git-send-email-wanpeng.li@hotmail.com> References: <1510307387-14812-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 9ead1ed..a028479 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_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. @@ -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 66ed3bc..113c0aa 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 = src->preempted; + if ((state & KVM_VCPU_PREEMPTED)) { + if (cmpxchg(&src->preempted, state, state | + KVM_VCPU_SHOULD_FLUSH) == state) + __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 1583667464955493896@xxx Fri Nov 10 08:36:27 +0000 2017 X-GM-THRID: 1583661871160144366 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread