Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1673817pxb; Thu, 4 Mar 2021 18:18:56 -0800 (PST) X-Google-Smtp-Source: ABdhPJwkgTLO0pz6x1TxMXVZdmPnHpdYFpdy/aFWo3z8MCPa+V1Gd2/ojF990tFE8kh4urXXWcX9 X-Received: by 2002:a6b:6e06:: with SMTP id d6mr6151257ioh.116.1614910736188; Thu, 04 Mar 2021 18:18:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614910736; cv=none; d=google.com; s=arc-20160816; b=oJ4/YaUpeWInNM1vNOEZ2tXcV9PiLyxojXnxzapTBjC1eqDWHOCQ5VfRx1iThn3kwo h1F0h8dIz0E5NDYQNZdY4QKok6Txln7xftmXKqNwCS9PY8bZehT/t5pjyBirxo6slE7u 44rx3lZ9y7EcjQr+EXzhliBExlZY6pbBilPqOEKNTzKbf6ZSWnYr+xG0g1r/0b2vocYD QDU3W3nr5SQjoVnfrZvXCCEAt1Ntv/tq98DO1o5uOHYg0kAMp2CM2L3eLspTrMiWlrJ4 78JlJC8uM3PihgSRRhBHp8VgVtpj7+FNWwNVyEV1YMcc50hzgTN9XOhB0v/R8hXTW7sO Xw/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:mime-version:message-id:date :reply-to:sender:dkim-signature; bh=iFsu/EdgzPCi1WqYdYUBcFgRLZpgieXshXK9nnq/e2Q=; b=w4e9z7r3oDEkDIFQeEH00LpNYW6KMHKOdQ/D2PcpAy4PfIctT34AXkm66yVGoCSuvr 7d3YEzqI1564SwR3oAgnldz7TFcMY8C96BigChnbqpN32r8eA59gaGE4/4N6LSPurqyx DtKcJLPlkwR087cVPJV+SMss34dcJ1S4/JGRW4EQzxLRVKDssf85U3KVmuePmsnDkLc0 n9ei7mSEaFBm3PtCV48Ap1UU4PTULkzJu3/17lcSyx4BASLLGlkvJOk6ObGNaBw2DZ5y brkNfwkgRilhtr1b0FjoMIJSuPBY8J7xkVKvgswrpud2rqtfNUdKqs3ejQa/Cy7mHeEP 0ZYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=Dm7EqRrQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g3si980306ild.84.2021.03.04.18.18.42; Thu, 04 Mar 2021 18:18:56 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=Dm7EqRrQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229719AbhCECSR (ORCPT + 99 others); Thu, 4 Mar 2021 21:18:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47096 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229463AbhCECSQ (ORCPT ); Thu, 4 Mar 2021 21:18:16 -0500 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3336DC061756 for ; Thu, 4 Mar 2021 18:18:15 -0800 (PST) Received: by mail-qk1-x749.google.com with SMTP id i69so473609qke.19 for ; Thu, 04 Mar 2021 18:18:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:reply-to:date:message-id:mime-version:subject:from:to:cc; bh=iFsu/EdgzPCi1WqYdYUBcFgRLZpgieXshXK9nnq/e2Q=; b=Dm7EqRrQGHwk4GNJMLxWsQTTtpmjMKr5XzzRltH4yF4XLUzdFFiyvsjnp1NTrFqAWD CjfRG3hCuW1YFGc6A9Y05LccX7aY94QO+wvrTna8ER7QCPvAqc9cTr+SDbDE7Ldpjw3t rgtktSM2aFRd0K33Dqco70ItekgC6OfWuwo0KQ+vkE9LIdkGuecrItyAYNY5IrqvtPnf IM5vybBlZZIJb6OQHKcf0RcSJiUJryCWGAhm5Qi0FNJWVncKswsoai/pll1Euh2JIGiA gbO6fIcNJdAVjAQtSPfOZWTgAaL5JAINvcWY30PuSr1We+YkowOrraGVXDfiXT9XhhEG nq9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:reply-to:date:message-id:mime-version :subject:from:to:cc; bh=iFsu/EdgzPCi1WqYdYUBcFgRLZpgieXshXK9nnq/e2Q=; b=kiy3Aq7bWCO6vINsJjznvw6FB2FB5IUbVmfSzHbQGtp20AwULJeHqP/0AheBbCMz1i GlHo0FHaHdB4yMYZUdciaSa53SOAMlN01kYKH5N4CDdwa950z9DtwyMAq1qvxwt8c3N3 +zGgARnhjTwVZsa8KGO/Z5umBcRj+NQ7vb6uY9VdEHuIGGpRD7u5aSDHmk0PJxDsCGCz WkXZfYKbcidzj/6drPJZAysrr3M0GT1RA42ct/xF3HAnKUbjDNXNjXY4xt493H+Ou32t sOFyofifILzcmyTtvVfjdK68omFEj9QNtUKNo4vCX/ZSfL7GumtfuzCNfh6Q2I8YTJRg jrpg== X-Gm-Message-State: AOAM532ZS+XLl2LCozcsG3qlbKwMs/nZJDPrks7EjJgbtaL+SlC44Vry rgHekTvtF8TyXZg+4MrM/bbOYE7Lvrw= Sender: "seanjc via sendgmr" X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:9857:be95:97a2:e91c]) (user=seanjc job=sendgmr) by 2002:a0c:fec8:: with SMTP id z8mr7027044qvs.59.1614910691867; Thu, 04 Mar 2021 18:18:11 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 4 Mar 2021 18:18:08 -0800 Message-Id: <20210305021808.3769732-1-seanjc@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.30.1.766.gb4fecdf3b7-goog Subject: [PATCH] KVM: x86: Ensure deadline timer has truly expired before posting its IRQ From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When posting a deadline timer interrupt, open code the checks guarding __kvm_wait_lapic_expire() in order to skip the lapic_timer_int_injected() check in kvm_wait_lapic_expire(). The injection check will always fail since the interrupt has not yet be injected. Moving the call after injection would also be wrong as that wouldn't actually delay delivery of the IRQ if it is indeed sent via posted interrupt. Fixes: 010fd37fddf6 ("KVM: LAPIC: Reduce world switch latency caused by timer_advance_ns") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 45d40bfacb7c..cb8ebfaccfb6 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1642,7 +1642,16 @@ static void apic_timer_expired(struct kvm_lapic *apic, bool from_timer_fn) } if (kvm_use_posted_timer_interrupt(apic->vcpu)) { - kvm_wait_lapic_expire(vcpu); + /* + * Ensure the guest's timer has truly expired before posting an + * interrupt. Open code the relevant checks to avoid querying + * lapic_timer_int_injected(), which will be false since the + * interrupt isn't yet injected. Waiting until after injecting + * is not an option since that won't help a posted interrupt. + */ + if (vcpu->arch.apic->lapic_timer.expired_tscdeadline && + vcpu->arch.apic->lapic_timer.timer_advance_ns) + __kvm_wait_lapic_expire(vcpu); kvm_apic_inject_pending_timer_irqs(apic); return; } -- 2.30.1.766.gb4fecdf3b7-goog