Received: by 10.223.164.202 with SMTP id h10csp1170897wrb; Thu, 9 Nov 2017 23:07:32 -0800 (PST) X-Google-Smtp-Source: ABhQp+Q80ErzWYZR2DRizqWl3pziETcmRtk/jJpY0nDgLBRlq22/SUEAjSEpGWS+zzAFIx+Uk2E0 X-Received: by 10.98.16.66 with SMTP id y63mr3352043pfi.192.1510297652285; Thu, 09 Nov 2017 23:07:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510297652; cv=none; d=google.com; s=arc-20160816; b=flTsLDCVY9c8DeVvDGN436nGBsTDlTnof/0MtDU86G7zLU8sIdcmqM5mxhc21gg9lT e4FA8w+gbbZLKBI2wqPU7xns/2oygmMpZQqtwnltNtNau3rUPaQShTVrBTuUXDjGSobM IA1gRBJlk6t9j8myFbFkfupVzOh30zkBzB/X9gm24nl8B30PPUIU/k3VXl1CgHdxDlN5 JqDNwnMJ2Yl811aG158f9CYcrfGSB+NRcRYhL+07EbrjBAiohRjdBXkH9Kz6Md8HAJoP Aff4M1nVA6iIRub/4AHLhgMRWYhMt3QCPc72ZeXZ1VFce47fbrHSF8oxB621RrQkzHvo pMqg== 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=J1Dn+fIiqHe///vGc47gR+QKzpFmHrxhLypvLYO3POw=; b=Mnr22QIuq0JHYyqgaDbzqq/KNAfy7lnoElcuCpR8pZslwpIHVnfh48GyRuE0Oa/a+Y j4pIeReO36o6hHi3i1KL5+BuaI4OM8Pxul//9TG+yu+xe9Zv6fsYtc0Ik+2DSRGKTgWf sBp8mQJwc/EechtFWiC720jSj40JrCx+XSufG0eXgLURaImUCQj9pyDQV0bwKATZjjms QETVNS018hX6vpB0MBfX7K7btc+xSziHHnBfnpZDBfNWf0TJvryijZDnIV91rnaiOAxg Mjxkoy/nPKglvDIf+heJzfXDOse2PFMDgBjm04pKWPWeNuCTUEx9pyqXbitXN/Ht/JlE dq/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=AuBLjQHa; 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 c25si8134870pgn.756.2017.11.09.23.07.20; Thu, 09 Nov 2017 23:07:32 -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=AuBLjQHa; 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 S1755884AbdKJHFy (ORCPT + 83 others); Fri, 10 Nov 2017 02:05:54 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:48807 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755398AbdKJHFI (ORCPT ); Fri, 10 Nov 2017 02:05:08 -0500 Received: by mail-pg0-f66.google.com with SMTP id s11so1302044pgc.5; Thu, 09 Nov 2017 23:05:08 -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=J1Dn+fIiqHe///vGc47gR+QKzpFmHrxhLypvLYO3POw=; b=AuBLjQHaw21hj1lGk2nn4HPbbWW2bl7NQ1dCN1gvN21IdQXdZHe4dWNfm57R62rDdb VPD1S/MuR6XQVRzKQR31T/15CuwPJlSukBzZxhvz/g6oMbSGa298UNbXGhcP+eq4tuvz KntveZTsgMxXYLjqbyH1uSpUfIfgfSFC9LHUa7AZOlvTjIGKTC7nq5OhulYfsjGwqW+E dhnSMfF8anCER7G0GtZ2Z3EfcL6D2EmCDndpR+qh5Z3kBSJkoJ5bf2+SLkR7IO9d3+P2 4Y3RuKiwCestYZDm2zABmzsvQGBTCr1Yt725lNGQ9/YahXIIhybJXdI5p4ocqoGJnbs5 wmgA== 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=J1Dn+fIiqHe///vGc47gR+QKzpFmHrxhLypvLYO3POw=; b=bPvbnQqiDdpwxkgv30dxu+9QtMETO8zAUYtfEVPWFacbwHv7gwMYRk734zRE8FRxW0 /95xhrKppcDCzzSm+W+HypiaFJyw3zBNTtZ617IiSRfun+lIi0SKIowWG6KMAyojdJdH m4JSGoe/Rfp7r5Kc8VuwCjAAI5poPcfn2p/gIW45QSLEWctnzlS9o4RtLarmWM2630Xv D08Hm31bEh9R6TfUneFgsmI50VwNQanlCyJAinEPSssB/hpF3HaTrQxSkcbNIi2+LWHX bMC0WYDh82Zwsi77gvmT59AkNRyg5Nj6pVVGGb61jDNtWRLUo2HE1RmKAjXYixBijxcK +Atw== X-Gm-Message-State: AJaThX7GNKA9vEW8HlS93CNoFJAYxVYk6bJCrUrYSmnBflnjGSUYK58x c6eUECuBtfzWqnVqSg8kB8XGMQ== X-Received: by 10.99.126.78 with SMTP id o14mr3140977pgn.159.1510297507808; Thu, 09 Nov 2017 23:05:07 -0800 (PST) Received: from localhost ([203.205.141.123]) by smtp.gmail.com with ESMTPSA id b9sm13486597pgu.20.2017.11.09.23.05.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Nov 2017 23:05:07 -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 Subject: [PATCH v2 2/4] KVM: Add paravirt remote TLB flush Date: Thu, 9 Nov 2017 23:04:55 -0800 Message-Id: <1510297497-10063-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1510297497-10063-1-git-send-email-wanpeng.li@hotmail.com> References: <1510297497-10063-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ář 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 | 31 +++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) 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..50f4b6a 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -465,6 +465,33 @@ static void __init kvm_apf_trap_init(void) update_intr_gate(X86_TRAP_PF, async_page_fault); } +static cpumask_t flushmask; + +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_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; @@ -484,6 +511,10 @@ 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)) + 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 1584276423924678621@xxx Fri Nov 17 01:55:35 +0000 2017 X-GM-THRID: 1584223648113750422 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread