From patchwork Fri Jun 23 11:59:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wanpeng Li X-Patchwork-Id: 9806297 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 37CB960349 for ; Fri, 23 Jun 2017 12:00:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 29A1527FE4 for ; Fri, 23 Jun 2017 12:00:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1D63D28759; Fri, 23 Jun 2017 12:00:12 +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=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=unavailable 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 C956727FE4 for ; Fri, 23 Jun 2017 12:00:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752075AbdFWL76 (ORCPT ); Fri, 23 Jun 2017 07:59:58 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:35313 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751189AbdFWL75 (ORCPT ); Fri, 23 Jun 2017 07:59:57 -0400 Received: by mail-pf0-f193.google.com with SMTP id s66so7034433pfs.2; Fri, 23 Jun 2017 04:59:57 -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:mime-version :content-transfer-encoding; bh=uFxfv+wjI65R+e60kqD0mlhbWeM0F+TVeRVxxcyRy80=; b=kGT5JCgCDEZbLbfsYXitgaW5z4goJu/UpSJPtXuSjTgyYTrWltaxL1YsFeLl+BAiI1 jivUqhgsC9vtc440WQC2teByBSQrd+Y74+K02rSsJIxQQ0NDNnxBN3AzYtBC8DEFtuGd kaZjP8JMOUOArIF/LcZflY4ztg0oMmTgOaA6NctAQ3+uh1qfnpgnoV1MqouFZsza7ZH/ B1bSmYnSNC0JpDrZq7Fg6l189Lhs4ChcCinojcs1swFHV+v7ZTIYhTRNxHlCsgjC8Ojg PqnpbWDPrvghhMlqLeJITFESolh5zHRRHyfGmtoCVD7cDLPcRO3ymZuEZQObWI4fi6Yc KiWQ== 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:mime-version :content-transfer-encoding; bh=uFxfv+wjI65R+e60kqD0mlhbWeM0F+TVeRVxxcyRy80=; b=SN2tQ1lWFI3kiksQjEYAdh5HQb5qpsFpu5oRavfezGw0iwD9yPB2rfeMBjAHXUJzRM 2OOvbyUinsgQxd2EwlYPyd7xONqt1uhHojUnQUuEMvDGkKK8ba6CmYMRn+hpbY71xvEn 5Jo3a1Z4kbRKrGxqDeYFuKqJVdGSwT05BUmwiWRIWfiwVlpDJ6qE9iA+MWfdOj38cd0F G19ctSX/c3z4EQ7SihnLCLPcnpyqWfkz/QRAHCchjG4CsT/lMyt+dZmiKwu5KhCwPnfM sbRtvo3YQHaO4eKdmCWMzhGT7d4jFt/VpD/foWtkvIBD/azXaa7aA8jhPGJuNAniZMcl qW/A== X-Gm-Message-State: AKS2vOxM129DLvhkd1zX3LEKx75FetcqsZcrXHXY4M82zUPdKZuRniXL YpqIeFeC/Q86KLZ076k= X-Received: by 10.84.216.71 with SMTP id f7mr8594082plj.266.1498219196340; Fri, 23 Jun 2017 04:59:56 -0700 (PDT) Received: from localhost ([223.72.74.20]) by smtp.gmail.com with ESMTPSA id e189sm7120179pfe.100.2017.06.23.04.59.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 23 Jun 2017 04:59:55 -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?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Wanpeng Li Subject: [PATCH v2] KVM: LAPIC: Fix lapic timer injection delay Date: Fri, 23 Jun 2017 04:59:50 -0700 Message-Id: <1498219190-6457-1-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 2.7.4 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 Linux as a guest will prevent to program the next event to the clock event device when the event is in the past. However, it is not guaranteed by all the guests, the guest like kvm-unit-tests/apic.flat will write current tsc value visible in guest to MSR_IA32_TSCDEADLINE, lapic timer which is emulated by vmx preemption timer will program the absolute target tsc value to vmcs preemption timer field w/ delta == 0, then plays a vmentry and an upcoming vmx preemption timer fire vmexit dance, the lapic timer injection is delayed for this duration. Actually the lapic timer which is emulated by hrtimer can handle this correctly. This patch fixes it by firing the lapic timer and injecting a timer interrupt immediately during the next vmentry if guest programs an expired timer to the emulated timer device. This saves ~300 cycles on the tsc_deadline_timer test of apic.flat. Cc: Paolo Bonzini Cc: Radim Krčmář Signed-off-by: Wanpeng Li --- arch/x86/kvm/lapic.c | 7 ++++++- arch/x86/kvm/vmx.c | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index d24c874..08cf73d 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1504,12 +1504,17 @@ static void cancel_hv_timer(struct kvm_lapic *apic) static bool start_hv_timer(struct kvm_lapic *apic) { u64 tscdeadline = apic->lapic_timer.tscdeadline; + int ret = 0; if ((atomic_read(&apic->lapic_timer.pending) && !apic_lvtt_period(apic)) || - kvm_x86_ops->set_hv_timer(apic->vcpu, tscdeadline)) { + (ret = kvm_x86_ops->set_hv_timer(apic->vcpu, tscdeadline))) { if (apic->lapic_timer.hv_timer_in_use) cancel_hv_timer(apic); + if (ret == 1) { + apic_timer_expired(apic); + return true; + } } else { apic->lapic_timer.hv_timer_in_use = true; hrtimer_cancel(&apic->lapic_timer.timer); diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 2e906cf..2008e9b 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -11149,6 +11149,9 @@ static int vmx_set_hv_timer(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc) u64 guest_tscl = kvm_read_l1_tsc(vcpu, tscl); u64 delta_tsc = max(guest_deadline_tsc, guest_tscl) - guest_tscl; + if (delta_tsc == 0) + return 1; + /* Convert to host delta tsc if tsc scaling is enabled */ if (vcpu->arch.tsc_scaling_ratio != kvm_default_tsc_scaling_ratio && u64_shl_div_u64(delta_tsc,