From patchwork Tue Jun 11 12:17:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wanpeng Li X-Patchwork-Id: 10986717 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EB08914BB for ; Tue, 11 Jun 2019 12:17:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DB836206AF for ; Tue, 11 Jun 2019 12:17:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D01AC26256; Tue, 11 Jun 2019 12:17:48 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1BD0323B24 for ; Tue, 11 Jun 2019 12:17:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387801AbfFKMRY (ORCPT ); Tue, 11 Jun 2019 08:17:24 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:43766 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728556AbfFKMRW (ORCPT ); Tue, 11 Jun 2019 08:17:22 -0400 Received: by mail-pg1-f195.google.com with SMTP id f25so6875122pgv.10; Tue, 11 Jun 2019 05:17:22 -0700 (PDT) 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=tI3hDDTqnqdirzeRUyGFwfCtxp+U+fG86cEeE/MH7Ag=; b=NFLv/C6919OIXOKCc4m3w9M86HhoIyX2sr9xKoBaR//aTJ+4zkw6nS5GkYickv4tPW X2H/nRabt4pGXQ8CSNeN2rr6pQ0cZ31kZv+xUEus5a9nK7hMaiN5/kKFjkYgxagfJ/4x yTzy0wjngFbgevbzAe4pEbgh6gjm77MZn4Iv2pn4HkChi3Uz/xxYLJdnUGG9aCyAer+Q Up4GNmGqQGit9KM2ad1XlXWQyHlso1d4ReBznJ9xh1AuQQ9+Xg2nCus/t9xj8EdSOcwV NhkyWB47gDkk4A51bbVqkqSs6v4ne/PXlVhEghsMxRIIJpNwcwlSBTy1DY8MqOPDXzQB qrGQ== 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=tI3hDDTqnqdirzeRUyGFwfCtxp+U+fG86cEeE/MH7Ag=; b=dQpYYSXVWvFAje+HRc8ESbdpVTFDuYnJGY0OceZJAAf+hnI25KnaZlKbWVimIUJ8C5 6mS7LSiO5cgXR0wPaM29ryjLbdQrgEIWbWLBkDljyBRyXPaEYufAjIvXmg1frql1Fclu 0umZCPqjYawiwIAHAWILK8/BNdrNRgNVnkPeQJ3gqCsbvvMtZ9lmKTNsCPiPRZOa4vr+ AxxYCsZZ4BOWge0m2eG9jn19qyQpShvgqWzFnF/cnljhqRceAcvehNnV6DaefOY7kMha /MdI1Nyrp5ijE7vHB7PYX94mA3bteVAzaJ8loSX6En00Nd7l6L4H/gTmDU9xWD9MHwZY WUeg== X-Gm-Message-State: APjAAAU5Nd4Vfs7fJlXGWL3yd497/hTMxnSnXmeX6YTHGHa+MEKuoGLY FPFcL+0/fQQ8kyk+EjntCmRqL2SM X-Google-Smtp-Source: APXvYqySmdFBdQB2S20bpRa4V8kezNXzmkB2zhLDpGu7zRkf1zM/QLQcdt5iL7fwmK5UIYtwM+yNKg== X-Received: by 2002:a63:d658:: with SMTP id d24mr20326915pgj.191.1560255441515; Tue, 11 Jun 2019 05:17:21 -0700 (PDT) Received: from localhost.localdomain ([203.205.141.123]) by smtp.googlemail.com with ESMTPSA id v4sm19649478pff.45.2019.06.11.05.17.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Jun 2019 05:17:21 -0700 (PDT) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?utf-8?b?UmFkaW0gS3LEjW3DocWZ?= Subject: [PATCH v3 1/4] KVM: LAPIC: Make lapic timer unpinned when timer is injected by pi Date: Tue, 11 Jun 2019 20:17:06 +0800 Message-Id: <1560255429-7105-2-git-send-email-wanpengli@tencent.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1560255429-7105-1-git-send-email-wanpengli@tencent.com> References: <1560255429-7105-1-git-send-email-wanpengli@tencent.com> MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Wanpeng Li Make lapic timer unpinned when timer is injected by posted-interrupt, the emulated timer can be offload to the housekeeping cpus. The host admin should fine tuned, e.g. dedicated instances scenario w/ nohz_full cover the pCPUs which vCPUs resident, several pCPUs surplus for housekeeping, disable mwait/hlt/pause vmexits to occupy the pCPUs, fortunately preemption timer is disabled after mwait is exposed to guest which makes emulated timer offload can be possible. Cc: Paolo Bonzini Cc: Radim Krčmář Signed-off-by: Wanpeng Li --- arch/x86/kvm/lapic.c | 20 ++++++++++++++++---- arch/x86/kvm/lapic.h | 1 + arch/x86/kvm/vmx/vmx.c | 3 ++- arch/x86/kvm/x86.c | 5 +++++ arch/x86/kvm/x86.h | 2 ++ include/linux/sched/isolation.h | 2 ++ kernel/sched/isolation.c | 6 ++++++ 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index fcf42a3..e57eeba 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -127,6 +127,12 @@ static inline u32 kvm_x2apic_id(struct kvm_lapic *apic) return apic->vcpu->vcpu_id; } +inline bool posted_interrupt_inject_timer_enabled(struct kvm_vcpu *vcpu) +{ + return pi_inject_timer && kvm_vcpu_apicv_active(vcpu); +} +EXPORT_SYMBOL_GPL(posted_interrupt_inject_timer_enabled); + static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map, u32 dest_id, struct kvm_lapic ***cluster, u16 *mask) { switch (map->mode) { @@ -1581,7 +1587,9 @@ static void start_sw_tscdeadline(struct kvm_lapic *apic) likely(ns > apic->lapic_timer.timer_advance_ns)) { expire = ktime_add_ns(now, ns); expire = ktime_sub_ns(expire, ktimer->timer_advance_ns); - hrtimer_start(&ktimer->timer, expire, HRTIMER_MODE_ABS_PINNED); + hrtimer_start(&ktimer->timer, expire, + posted_interrupt_inject_timer_enabled(vcpu) ? + HRTIMER_MODE_ABS : HRTIMER_MODE_ABS_PINNED); } else apic_timer_expired(apic); @@ -1683,7 +1691,8 @@ static void start_sw_period(struct kvm_lapic *apic) hrtimer_start(&apic->lapic_timer.timer, apic->lapic_timer.target_expiration, - HRTIMER_MODE_ABS_PINNED); + posted_interrupt_inject_timer_enabled(apic->vcpu) ? + HRTIMER_MODE_ABS : HRTIMER_MODE_ABS_PINNED); } bool kvm_lapic_hv_timer_in_use(struct kvm_vcpu *vcpu) @@ -2320,7 +2329,8 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu, int timer_advance_ns) apic->vcpu = vcpu; hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC, - HRTIMER_MODE_ABS_PINNED); + posted_interrupt_inject_timer_enabled(vcpu) ? + HRTIMER_MODE_ABS : HRTIMER_MODE_ABS_PINNED); apic->lapic_timer.timer.function = apic_timer_fn; if (timer_advance_ns == -1) { apic->lapic_timer.timer_advance_ns = 1000; @@ -2509,7 +2519,9 @@ void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu) timer = &vcpu->arch.apic->lapic_timer.timer; if (hrtimer_cancel(timer)) - hrtimer_start_expires(timer, HRTIMER_MODE_ABS_PINNED); + hrtimer_start_expires(timer, + posted_interrupt_inject_timer_enabled(vcpu) ? + HRTIMER_MODE_ABS : HRTIMER_MODE_ABS_PINNED); } /* diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index f974a3d..7b85a7c 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h @@ -231,6 +231,7 @@ void kvm_lapic_switch_to_hv_timer(struct kvm_vcpu *vcpu); void kvm_lapic_expired_hv_timer(struct kvm_vcpu *vcpu); bool kvm_lapic_hv_timer_in_use(struct kvm_vcpu *vcpu); void kvm_lapic_restart_hv_timer(struct kvm_vcpu *vcpu); +inline bool posted_interrupt_inject_timer_enabled(struct kvm_vcpu *vcpu); static inline enum lapic_mode kvm_apic_mode(u64 apic_base) { diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index da24f18..6d3c0b1 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -7042,7 +7042,8 @@ static int vmx_set_hv_timer(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc, u64 tscl, guest_tscl, delta_tsc, lapic_timer_advance_cycles; struct kvm_timer *ktimer = &vcpu->arch.apic->lapic_timer; - if (kvm_mwait_in_guest(vcpu->kvm)) + if (kvm_mwait_in_guest(vcpu->kvm) || + posted_interrupt_inject_timer_enabled(vcpu)) return -EOPNOTSUPP; vmx = to_vmx(vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 6200d5a..35c4884 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -155,6 +156,9 @@ EXPORT_SYMBOL_GPL(enable_vmware_backdoor); static bool __read_mostly force_emulation_prefix = false; module_param(force_emulation_prefix, bool, S_IRUGO); +bool __read_mostly pi_inject_timer = 0; +module_param(pi_inject_timer, bool, S_IRUGO | S_IWUSR); + #define KVM_NR_SHARED_MSRS 16 struct kvm_shared_msrs_global { @@ -7030,6 +7034,7 @@ int kvm_arch_init(void *opaque) host_xcr0 = xgetbv(XCR_XFEATURE_ENABLED_MASK); kvm_lapic_init(); + pi_inject_timer = housekeeping_enabled(HK_FLAG_TIMER); #ifdef CONFIG_X86_64 pvclock_gtod_register_notifier(&pvclock_gtod_notifier); diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index 275b3b6..aa539d6 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -296,6 +296,8 @@ extern unsigned int min_timer_period_us; extern bool enable_vmware_backdoor; +extern bool pi_inject_timer; + extern struct static_key kvm_no_apic_vcpu; static inline u64 nsec_to_cycles(struct kvm_vcpu *vcpu, u64 nsec) diff --git a/include/linux/sched/isolation.h b/include/linux/sched/isolation.h index b0fb144..6fc5407 100644 --- a/include/linux/sched/isolation.h +++ b/include/linux/sched/isolation.h @@ -19,6 +19,7 @@ enum hk_flags { DECLARE_STATIC_KEY_FALSE(housekeeping_overridden); extern int housekeeping_any_cpu(enum hk_flags flags); extern const struct cpumask *housekeeping_cpumask(enum hk_flags flags); +extern bool housekeeping_enabled(enum hk_flags flags); extern void housekeeping_affine(struct task_struct *t, enum hk_flags flags); extern bool housekeeping_test_cpu(int cpu, enum hk_flags flags); extern void __init housekeeping_init(void); @@ -38,6 +39,7 @@ static inline const struct cpumask *housekeeping_cpumask(enum hk_flags flags) static inline void housekeeping_affine(struct task_struct *t, enum hk_flags flags) { } static inline void housekeeping_init(void) { } +static inline bool housekeeping_enabled(enum hk_flags flags) { } #endif /* CONFIG_CPU_ISOLATION */ static inline bool housekeeping_cpu(int cpu, enum hk_flags flags) diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c index 123ea07..ccb2808 100644 --- a/kernel/sched/isolation.c +++ b/kernel/sched/isolation.c @@ -14,6 +14,12 @@ EXPORT_SYMBOL_GPL(housekeeping_overridden); static cpumask_var_t housekeeping_mask; static unsigned int housekeeping_flags; +bool housekeeping_enabled(enum hk_flags flags) +{ + return !!(housekeeping_flags & flags); +} +EXPORT_SYMBOL_GPL(housekeeping_enabled); + int housekeeping_any_cpu(enum hk_flags flags) { if (static_branch_unlikely(&housekeeping_overridden)) From patchwork Tue Jun 11 12:17:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wanpeng Li X-Patchwork-Id: 10986711 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DF78E6C5 for ; Tue, 11 Jun 2019 12:17:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CEE331FF0B for ; Tue, 11 Jun 2019 12:17:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BFD2E23B24; Tue, 11 Jun 2019 12:17:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2C5911FF0B for ; Tue, 11 Jun 2019 12:17:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390190AbfFKMRZ (ORCPT ); Tue, 11 Jun 2019 08:17:25 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:45007 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387814AbfFKMRY (ORCPT ); Tue, 11 Jun 2019 08:17:24 -0400 Received: by mail-pg1-f195.google.com with SMTP id n2so6870404pgp.11; Tue, 11 Jun 2019 05:17:24 -0700 (PDT) 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=4jHs27FTKy0dRUgrWNghDEXPvRuXCxHm03+a+AGR4s4=; b=VOk1M317Lbm7Sbfn7Nxj7qZAfCpr0V4lAH690E3N9YjdmwnCIvePrixx9WG0r2iN56 OS9VEg1d2pW50ceSW0Uz1CQ2L3H9xxCAX5Jsw7IcVBBrWoL8Nro2rI3lR/5+rV9nUSMN MKxtGmvpwwlB1cKnOi+j4GsO2P2Ttal+SlOvHFSxnd7lNF4dcN3ejk2MDg4g6DxKTd1i 0m7YuDJEaRYnj1B5EqEhK6SKHpHMc125SkEQz/P2ob7OHTrL2cp0CAMjkFxZMq5v5ykh fuCHrI2iEoqpksdtEUWQvRQcCMtie0sAToKn/Jckwkp5VZJT51diN1CnOr7T58+YZ8vR rlXA== 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=4jHs27FTKy0dRUgrWNghDEXPvRuXCxHm03+a+AGR4s4=; b=qwJV0aXGDwPr3RCP1LdWlljNCwslzMwTZ4s1hZa08OsnHh7OgIJ9oVNeIY86R2ScX5 PQCs0GOyEUZI4XN6b+O1y4ZJkmIZD3o1zl63gWzBXL46MpgPhFo8Gd8zwqOmS7w8Q/Ks HEDRgkyPBZSbSGNdqM3sR5sVqi1ReELXL3Y3IWpx8EGZ9i2AVzH7IZ9Wd9euE21rtDRu 3KU2RYWs1VZGw+hWAZb52p/G5FploK6lBxHy4geHBrB7rQzam9WNw0ZxsmyRMB/hMVuV CiIV1eyUwiTV3G6jFNaE5wFMyGi4wykOm27arSuxVtazWMUqscZ1mi1CI6aYYvg3F9x1 lTPA== X-Gm-Message-State: APjAAAW6IPdEUPJQrvhiCneUkpn74Z8ei2kzfzxGR0RbhnCqEwn/2NYV ZF99fY5iyo7JOfoKzik+s8wu4ABP X-Google-Smtp-Source: APXvYqzX1CcHC3CySDnfEisveM4xqkQFrHz1g4OtmNuGGahNNSDnfH7dPxOTVyO/w6LX5pnR2ujNVA== X-Received: by 2002:a63:2c14:: with SMTP id s20mr19676175pgs.182.1560255443619; Tue, 11 Jun 2019 05:17:23 -0700 (PDT) Received: from localhost.localdomain ([203.205.141.123]) by smtp.googlemail.com with ESMTPSA id v4sm19649478pff.45.2019.06.11.05.17.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Jun 2019 05:17:23 -0700 (PDT) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?utf-8?b?UmFkaW0gS3LEjW3DocWZ?= Subject: [PATCH v3 2/4] KVM: LAPIC: lapic timer interrupt is injected by posted interrupt Date: Tue, 11 Jun 2019 20:17:07 +0800 Message-Id: <1560255429-7105-3-git-send-email-wanpengli@tencent.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1560255429-7105-1-git-send-email-wanpengli@tencent.com> References: <1560255429-7105-1-git-send-email-wanpengli@tencent.com> MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Wanpeng Li Dedicated instances are currently disturbed by unnecessary jitter due to the emulated lapic timers fire on the same pCPUs which vCPUs resident. There is no hardware virtual timer on Intel for guest like ARM. Both programming timer in guest and the emulated timer fires incur vmexits. This patch tries to avoid vmexit which is incurred by the emulated timer fires in dedicated instance scenario. When nohz_full is enabled in dedicated instances scenario, the emulated timers can be offload to the nearest busy housekeeping cpus since APICv is really common in recent years. The guest timer interrupt is injected by posted-interrupt which is delivered by housekeeping cpu once the emulated timer fires. ~3% redis performance benefit can be observed on Skylake server. w/o patch: VM-EXIT Samples Samples% Time% Min Time Max Time Avg time EXTERNAL_INTERRUPT 42916 49.43% 39.30% 0.47us 106.09us 0.71us ( +- 1.09% ) w/ patch: VM-EXIT Samples Samples% Time% Min Time Max Time Avg time EXTERNAL_INTERRUPT 6871 9.29% 2.96% 0.44us 57.88us 0.72us ( +- 4.02% ) Cc: Paolo Bonzini Cc: Radim Krčmář Signed-off-by: Wanpeng Li --- arch/x86/kvm/lapic.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index e57eeba..020599f 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -133,6 +133,12 @@ inline bool posted_interrupt_inject_timer_enabled(struct kvm_vcpu *vcpu) } EXPORT_SYMBOL_GPL(posted_interrupt_inject_timer_enabled); +static inline bool can_posted_interrupt_inject_timer(struct kvm_vcpu *vcpu) +{ + return posted_interrupt_inject_timer_enabled(vcpu) && + kvm_hlt_in_guest(vcpu->kvm); +} + static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map, u32 dest_id, struct kvm_lapic ***cluster, u16 *mask) { switch (map->mode) { @@ -1441,6 +1447,19 @@ static void apic_update_lvtt(struct kvm_lapic *apic) } } +static void kvm_apic_inject_pending_timer_irqs(struct kvm_lapic *apic) +{ + struct kvm_timer *ktimer = &apic->lapic_timer; + + kvm_apic_local_deliver(apic, APIC_LVTT); + if (apic_lvtt_tscdeadline(apic)) + ktimer->tscdeadline = 0; + if (apic_lvtt_oneshot(apic)) { + ktimer->tscdeadline = 0; + ktimer->target_expiration = 0; + } +} + static void apic_timer_expired(struct kvm_lapic *apic) { struct kvm_vcpu *vcpu = apic->vcpu; @@ -1450,6 +1469,11 @@ static void apic_timer_expired(struct kvm_lapic *apic) if (atomic_read(&apic->lapic_timer.pending)) return; + if (can_posted_interrupt_inject_timer(apic->vcpu)) { + kvm_apic_inject_pending_timer_irqs(apic); + return; + } + atomic_inc(&apic->lapic_timer.pending); kvm_set_pending_timer(vcpu); @@ -2386,13 +2410,7 @@ void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu) struct kvm_lapic *apic = vcpu->arch.apic; if (atomic_read(&apic->lapic_timer.pending) > 0) { - kvm_apic_local_deliver(apic, APIC_LVTT); - if (apic_lvtt_tscdeadline(apic)) - apic->lapic_timer.tscdeadline = 0; - if (apic_lvtt_oneshot(apic)) { - apic->lapic_timer.tscdeadline = 0; - apic->lapic_timer.target_expiration = 0; - } + kvm_apic_inject_pending_timer_irqs(apic); atomic_set(&apic->lapic_timer.pending, 0); } } From patchwork Tue Jun 11 12:17:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wanpeng Li X-Patchwork-Id: 10986713 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2C24C14BB for ; Tue, 11 Jun 2019 12:17:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1C7D81FF0B for ; Tue, 11 Jun 2019 12:17:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 108D123B24; Tue, 11 Jun 2019 12:17:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B2BAA1FF0B for ; Tue, 11 Jun 2019 12:17:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390305AbfFKMR3 (ORCPT ); Tue, 11 Jun 2019 08:17:29 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:45434 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387814AbfFKMR0 (ORCPT ); Tue, 11 Jun 2019 08:17:26 -0400 Received: by mail-pf1-f194.google.com with SMTP id s11so7314925pfm.12; Tue, 11 Jun 2019 05:17:26 -0700 (PDT) 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=C85xdLoYButUPajJYZit35xlgLlMDLoD1qAApOa6BQQ=; b=UCjxVbrc2tjXQ9WJjYfs1+fB8TWMh9eFrpuYaSJvgT4csH64ottA07RVxknP66eyYR pLo7/MJRgPXgIHWmglJyXh+yDfzQxSaAO+fINxbbn7kADkdkGFQbluuG1YmizUCbZjyz hBu/oMo350ZPdULEl4NlTYSImkAQc8ogideI10zT7G8nEIjN9kltHRK6Dxa4GZ1zZ4lH 89a+a0pAQ1HN7dtltAJOj84jVAdd1NfBQoNHfqOCk6KRJVFbmwKW/a/2lNNlHRGz7t7S CW/bC1cimoK+oGE3Kkf94qEF0vxCzaL9ikhkgiApWy9ONIJxLmIJ9mkfaCMxHyDc0rXF 8jRw== 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=C85xdLoYButUPajJYZit35xlgLlMDLoD1qAApOa6BQQ=; b=LnCp+IOyyhIrHj4tHAIOFfI2q9Cs1PsoZW/7H3iPvl2MibbQa+Cfwn9EO2IOqgINec SDbkHpfgLmeQdrsUCiXBgkgEO8PydTLLtHQoYwDLhDslUpj6rnwXdLuLeM3TdWD07gJw Ml56G0LfM1U40V3EVOOJy8iPMOHqhN6TwLlSTSwMYrDJOkZEJjvy/9MtJp+aiBNA6mH5 9lRaS0Jg/Wli0wlOTZDbcSYsEhFre4n6fMQaqsuHMtppxZQXb4ZNRBpqrlEQMSyyQHVT +BwAByweH4YTK5NRkRJ4UMZozs43J3EqwkiO1FwbCxm4tYKr4ADOyiQUjuU/l6cPZOlY /8tg== X-Gm-Message-State: APjAAAUBlT615x8dDz3lUGKNlwPiiYRVeuUtoWBSQa67Pvf7xfPPhw3I 2fcldvF69jvbRTaqRhWVIGAEFDHK X-Google-Smtp-Source: APXvYqxZpcvhn41T2+H67v0pF71TKx4D4jm06aNhF/Z6TCdp2QktYzTd/iyOfAnVHY4O8PQZj2ESFQ== X-Received: by 2002:a62:2cc2:: with SMTP id s185mr78701453pfs.106.1560255445743; Tue, 11 Jun 2019 05:17:25 -0700 (PDT) Received: from localhost.localdomain ([203.205.141.123]) by smtp.googlemail.com with ESMTPSA id v4sm19649478pff.45.2019.06.11.05.17.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Jun 2019 05:17:25 -0700 (PDT) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?utf-8?b?UmFkaW0gS3LEjW3DocWZ?= Subject: [PATCH v3 3/4] KVM: LAPIC: Ignore timer migration when lapic timer is injected by posted-interrupt Date: Tue, 11 Jun 2019 20:17:08 +0800 Message-Id: <1560255429-7105-4-git-send-email-wanpengli@tencent.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1560255429-7105-1-git-send-email-wanpengli@tencent.com> References: <1560255429-7105-1-git-send-email-wanpengli@tencent.com> MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Wanpeng Li When lapic timer is injected by posted-interrupt, the emulated timer is offload to the housekeeping cpu. The timer interrupt will be delivered properly, no need to migrate timer. Cc: Paolo Bonzini Cc: Radim Krčmář Signed-off-by: Wanpeng Li --- arch/x86/kvm/lapic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 020599f..c21bab2 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2532,7 +2532,8 @@ void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu) { struct hrtimer *timer; - if (!lapic_in_kernel(vcpu)) + if (!lapic_in_kernel(vcpu) || + posted_interrupt_inject_timer_enabled(vcpu)) return; timer = &vcpu->arch.apic->lapic_timer.timer; From patchwork Tue Jun 11 12:17:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wanpeng Li X-Patchwork-Id: 10986715 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5AA7914BB for ; Tue, 11 Jun 2019 12:17:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4BB94206AF for ; Tue, 11 Jun 2019 12:17:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3FDEF26256; Tue, 11 Jun 2019 12:17:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D1AAF206AF for ; Tue, 11 Jun 2019 12:17:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390279AbfFKMR3 (ORCPT ); Tue, 11 Jun 2019 08:17:29 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:33744 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390255AbfFKMR2 (ORCPT ); Tue, 11 Jun 2019 08:17:28 -0400 Received: by mail-pg1-f195.google.com with SMTP id k187so6387109pga.0; Tue, 11 Jun 2019 05:17:28 -0700 (PDT) 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=Zl129qCafYKm/UgUhbto8qNJe6wjq7BYqf7bJFFzUjo=; b=fj005MJvwJ8AqqO6dU9s1PH7QL1JXBhN4sDYVRVOCaksASvnxV2Hx4ju3fbjyv2LwL QGJN0AP6XFEACZh6LZnMRduy5r+c+4zgH3biQxPCzSRI536lAHR8xIh7X4/cMrIUFGUn +CFyU+CibjYbbzqWqcDsSL5wRdD8z2ECXdapQudcHcHQ364LlWMib9pVesgvEKlM3NjW tO89fLXbPZEoJYZLcYlrnswSq9x2aQ3Eum3MOKdZ7mZcm9H7ejOvB2Y59kOQ7M3l/oNr yE0d+7ZyEQudeSvf0eeFlfRrmG0ARNfgJnL1Lfk5C+u535TMR+4u9jRrjZT7OdHXX0YI r6xg== 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=Zl129qCafYKm/UgUhbto8qNJe6wjq7BYqf7bJFFzUjo=; b=t9RvQ50N7O+6CyJy3+vpfIld2g/Lhv24ssj1LcBzTsSizietNUi6Rmcy+u90WQ6lDR 6DGF7GEXlpdptgTSImN6wt29ICGr3+twFZFVMDDMP4sLaGV03Ps4zI0x6vcFtH0I7GL7 DfAUNqQl8r7CUsmaH2rs4b3+dyktDWsaLKSYLI7b6qKA2iNhhMfbl7PYsvBI9X/6cuhK 6e7Q9l3J+XzurdA6TNl81zVDVXWXkDiEda+gWHq3zqpvWag/hVQLsCmRr5vE3IViI62w XrmGqBCxK6/YHJVwbhZ7zMu+d1jwVHFOJxYfoteLGS0ykSU9N2SBVHXeqLYxvyxiyWPV bxoA== X-Gm-Message-State: APjAAAVLlerByurNmkjQidc/t6E0w+ZqdjqPJtx7BFji+ZYnUj6gMUbe POrmq0d6Sl02QtCg67EWx60ApMSC X-Google-Smtp-Source: APXvYqz9bh8LBHagGEr/glCqWR8X4LH7zy42kImlhi+fW4kAeB5HdKPZ3Clh7f0EqRJ9M0kfmhayMQ== X-Received: by 2002:a62:a508:: with SMTP id v8mr78125294pfm.87.1560255447865; Tue, 11 Jun 2019 05:17:27 -0700 (PDT) Received: from localhost.localdomain ([203.205.141.123]) by smtp.googlemail.com with ESMTPSA id v4sm19649478pff.45.2019.06.11.05.17.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Jun 2019 05:17:27 -0700 (PDT) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?utf-8?b?UmFkaW0gS3LEjW3DocWZ?= Subject: [PATCH v3 4/4] KVM: LAPIC: add advance timer support to pi_inject_timer Date: Tue, 11 Jun 2019 20:17:09 +0800 Message-Id: <1560255429-7105-5-git-send-email-wanpengli@tencent.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1560255429-7105-1-git-send-email-wanpengli@tencent.com> References: <1560255429-7105-1-git-send-email-wanpengli@tencent.com> MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Wanpeng Li Wait before calling posted-interrupt deliver function directly to add advance timer support to pi_inject_timer. Cc: Paolo Bonzini Cc: Radim Krčmář Signed-off-by: Wanpeng Li --- arch/x86/kvm/lapic.c | 6 ++++-- arch/x86/kvm/lapic.h | 2 +- arch/x86/kvm/svm.c | 2 +- arch/x86/kvm/vmx/vmx.c | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index c21bab2..8f1fc94 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1470,6 +1470,8 @@ static void apic_timer_expired(struct kvm_lapic *apic) return; if (can_posted_interrupt_inject_timer(apic->vcpu)) { + if (apic->lapic_timer.timer_advance_ns) + kvm_wait_lapic_expire(vcpu, true); kvm_apic_inject_pending_timer_irqs(apic); return; } @@ -1561,7 +1563,7 @@ static inline void adjust_lapic_timer_advance(struct kvm_vcpu *vcpu, apic->lapic_timer.timer_advance_ns = timer_advance_ns; } -void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu) +void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu, bool pi_inject) { struct kvm_lapic *apic = vcpu->arch.apic; u64 guest_tsc, tsc_deadline; @@ -1569,7 +1571,7 @@ void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu) if (apic->lapic_timer.expired_tscdeadline == 0) return; - if (!lapic_timer_int_injected(vcpu)) + if (!lapic_timer_int_injected(vcpu) && !pi_inject) return; tsc_deadline = apic->lapic_timer.expired_tscdeadline; diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index 7b85a7c..4520164 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h @@ -220,7 +220,7 @@ static inline int kvm_lapic_latched_init(struct kvm_vcpu *vcpu) bool kvm_apic_pending_eoi(struct kvm_vcpu *vcpu, int vector); -void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu); +void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu, bool pi_inject); bool kvm_intr_is_single_vcpu_fast(struct kvm *kvm, struct kvm_lapic_irq *irq, struct kvm_vcpu **dest_vcpu); diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 302cb40..049ba64 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -5648,7 +5648,7 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) if (lapic_in_kernel(vcpu) && vcpu->arch.apic->lapic_timer.timer_advance_ns) - kvm_wait_lapic_expire(vcpu); + kvm_wait_lapic_expire(vcpu, false); /* * If this vCPU has touched SPEC_CTRL, restore the guest's value if diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 6d3c0b1..155aba6 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -6447,7 +6447,7 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu) if (lapic_in_kernel(vcpu) && vcpu->arch.apic->lapic_timer.timer_advance_ns) - kvm_wait_lapic_expire(vcpu); + kvm_wait_lapic_expire(vcpu, false); /* * If this vCPU has touched SPEC_CTRL, restore the guest's value if