From patchwork Fri Jan 6 01:12:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39857 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp576572wrt; Thu, 5 Jan 2023 17:15:02 -0800 (PST) X-Google-Smtp-Source: AMrXdXuqKlb+NZUl0LFQmB0e65ztejAjJAiJvXeK926B9S5/y5zupbkdvD9QN/J31axBlofMvHBJ X-Received: by 2002:a17:906:b056:b0:7af:bc9:5e51 with SMTP id bj22-20020a170906b05600b007af0bc95e51mr42585374ejb.41.1672967702823; Thu, 05 Jan 2023 17:15:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967702; cv=none; d=google.com; s=arc-20160816; b=UxPXW0l9zIS4RtGEpuPzSqz6Im7oLPK6FPN9jDnzK9RCvFeuv7C42+csNJqtSpdMRA 36p9o2CUttkUprtfIVE9bjMAGTqejh7u81dvB+4A1Ta0DFm+IWDiWPStYpSZ6GQNGPzM tazR5CaUvq/H/cAqDuYRqw701NJQICh1ONtH99HiclVXr5PkUC3RLOIRSm7qFuO8b2fY r/eRG1UmGt+QchiKy7BDnH+gb2RDmdx/ymEv6qpCiF8imgSQjKnHWngVxMmJ6aj0vR7E rOVRpEcmqTILqpiS+oHitd15HQ9jSeMzj+ETbxTfU7j7IueSbKNwxFdx39iAQ2xcjcET 2GzQ== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=O/yK9t38GUx7xAC8BnI1OsbEu+wskTkGWc8pHxjCI1M=; b=qHvKR/8ptVUDGCZy/5IkUK77C8OGQ3AeEl1/KX6qQ9ImVQKm6AeQknCXJICwjKW3A4 S1v2Imp9ygoXoyfGP3vPH5eWgJ0QpRCtiCnwlu0lPfypZV3wQd80D5UwYrr7/xpaasqS rNtspNtOaTnV5Ldg3eo9WXIggE36T34DycC7tU29yMPAmw3hq/Nyv26I4Ltz3lVdUUEN NDHc7Er22sYWRwtuLokF72bVyavNL3QduJpQdbaLtoBgMApOYuGcgSV72RNQ4KUrplai /PI7JfR8yHtWLMt677L8wcKG6iKShCbAujOUQCMIyopPbrWyD4gYmQ0uxn1T4RGCaaY4 IduQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=XC1QRawb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t18-20020a1709063e5200b007c16fb7f176si27880992eji.956.2023.01.05.17.14.39; Thu, 05 Jan 2023 17:15:02 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=XC1QRawb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236797AbjAFBNi (ORCPT + 99 others); Thu, 5 Jan 2023 20:13:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37216 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236747AbjAFBNR (ORCPT ); Thu, 5 Jan 2023 20:13:17 -0500 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6585B71FFF for ; Thu, 5 Jan 2023 17:13:16 -0800 (PST) Received: by mail-pj1-x104a.google.com with SMTP id z4-20020a17090ab10400b002195a146546so2085980pjq.9 for ; Thu, 05 Jan 2023 17:13:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=O/yK9t38GUx7xAC8BnI1OsbEu+wskTkGWc8pHxjCI1M=; b=XC1QRawbtqcuGIvkyZGXfO4dWvKusbHvx7Ceuk2s9f1EDWyGwTXKxmEF/7/RoIyTQl 83ZnpCeWlNJvN0EszGtRNrqExAEYtasediUZNG+ehmTQiMkhoIjKnQhWX+hIoogU83y5 xCHw6f+G8TqjvtBXoV0fhoUCuqOQwLxYgvCx9gO1Yv6C08Kbd4rG0qe2BBVTMw5geDsF YPuiC4gu1ZtesL5MNl+S7dkrBrISA94kw1YYFc7EnChdP1MFnbPrSXyA/2qtyEzjSHcX TfB3JBGQsJtAUeyHu6mN2XX8OUtEzSnJzI4Mv2SeSy55WQ4uXyfv6rzWDVYiIitmKYhS xNBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=O/yK9t38GUx7xAC8BnI1OsbEu+wskTkGWc8pHxjCI1M=; b=7/rzBzGPaR6a+u6jsRU4g0NWZhPtzBdclwvvwUHJVEfxHXsd/XC2o7Syhmd5nAyNJr hMSUpzIeDY2BtEOW3qnF1EfGnnFwlxRVkJhQNWG93VTRDAWdIkbsjVQUcKIJHAe/4/wh j/8iy0FZPSFoDQB9aI+6g5TgZXW9jIx2VtWGkHeZ2G1B2O6bkDP+18jYyus13NW8w5LP QE7QgjBSlTr3lnT8HdkMQplB0iC5b8HQHhuQs0od4S38rArOdQhbNso2Cq9QEvQdhUAY FNJ3f7sWeZ13TXWRlC7wkgvLm5EHq/G0osYx+clYyLSMJLVaX+wMOFbToOzahAWXByFO rDVA== X-Gm-Message-State: AFqh2kqyEbdWGvZYl6p8A6pHRQf4b9NmRx6pxmuJqQuFv6AGrlG752Ui 8GVjB9/BBb3+fZbIMv+5/6vgjKIHLwI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:40c8:b0:189:7a15:134b with SMTP id t8-20020a17090340c800b001897a15134bmr2814877pld.143.1672967595896; Thu, 05 Jan 2023 17:13:15 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:34 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-2-seanjc@google.com> Subject: [PATCH v5 01/33] KVM: x86: Blindly get current x2APIC reg value on "nodecode write" traps From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233781831618384?= X-GMAIL-MSGID: =?utf-8?q?1754233781831618384?= When emulating a x2APIC write in response to an APICv/AVIC trap, get the the written value from the vAPIC page without checking that reads are allowed for the target register. AVIC can generate trap-like VM-Exits on writes to EOI, and so KVM needs to get the written value from the backing page without running afoul of EOI's write-only behavior. Alternatively, EOI could be special cased to always write '0', e.g. so that the sanity check could be preserved, but x2APIC on AMD is actually supposed to disallow non-zero writes (not emulated by KVM), and the sanity check was a byproduct of how the KVM code was written, i.e. wasn't added to guard against anything in particular. Fixes: 70c8327c11c6 ("KVM: x86: Bug the VM if an accelerated x2APIC trap occurs on a "bad" reg") Fixes: 1bd9dfec9fd4 ("KVM: x86: Do not block APIC write for non ICR registers") Reported-by: Alejandro Jimenez Cc: stable@vger.kernel.org Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 4efdb4a4d72c..5c0f93fc073a 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2284,23 +2284,18 @@ void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset) struct kvm_lapic *apic = vcpu->arch.apic; u64 val; - if (apic_x2apic_mode(apic)) { - if (KVM_BUG_ON(kvm_lapic_msr_read(apic, offset, &val), vcpu->kvm)) - return; - } else { - val = kvm_lapic_get_reg(apic, offset); - } - /* * ICR is a single 64-bit register when x2APIC is enabled. For legacy * xAPIC, ICR writes need to go down the common (slightly slower) path * to get the upper half from ICR2. */ if (apic_x2apic_mode(apic) && offset == APIC_ICR) { + val = kvm_lapic_get_reg64(apic, APIC_ICR); kvm_apic_send_ipi(apic, (u32)val, (u32)(val >> 32)); trace_kvm_apic_write(APIC_ICR, val); } else { /* TODO: optimize to just emulate side effect w/o one more write */ + val = kvm_lapic_get_reg(apic, offset); kvm_lapic_reg_write(apic, offset, (u32)val); } } From patchwork Fri Jan 6 01:12:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39870 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577258wrt; Thu, 5 Jan 2023 17:16:47 -0800 (PST) X-Google-Smtp-Source: AMrXdXsvPkuALVX9NlccIwLX6QkAgMlIn5/Jr/mzggUXIHyfGH6cKwAlB6YfSCyMmu9MHSlx2DBL X-Received: by 2002:a17:906:3707:b0:828:76a3:e6bf with SMTP id d7-20020a170906370700b0082876a3e6bfmr56985721ejc.50.1672967807547; Thu, 05 Jan 2023 17:16:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967807; cv=none; d=google.com; s=arc-20160816; b=DfQEuWWSWM4L37BHVof18ge6IHltXAPe8iaSkgQfdoOetEMcD5riHDhZWnDzyFGuME UB1ECejcz72LolRnrkLxk/ord97WdG7XJuNwvBKOnbPHQbickKVAPs3OSEtsMaYofYOG WHJoM5la90fVTuW3EFHk/JGDa4ynUbRjrxlh8ivqUqBZNOJxjWIpNPugQ/BSLXrsOEQF ouVZ7vMSmWHtp4O66ggvi6uMOQ4o4Zy/u8ItOLoSGbMtsAZSRg4EIG3vrLmWRrx+Qii0 Z0CjTYPhyEABoBUib2qIwN4+ILP0NjbjC+vYiQPILw/3uV/UKcWkGRo6YOYqqAi8Iwq0 Ewig== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=U8maFLX/9emtR9Ry3/JNGkiRA36hfakt5AevFKMRuP8=; b=HvmCqV/A+iCO9xaArhjgG2jvWPWXpV206DexhrG1R1X82yZq1QqhyefEb+txP4lzD5 rBPf+sAP7JsceNolAhWwn0Li1Bs/0qh6bs8OBI/aufSha5+1sNaTYMqqcG45OcxQcWTk QwfnkAl9qg+32BAiiApk3PT2sfqJky8OuEeQ3E7lTLFIBKp2SVCXMbmsgM1JG0nRHRvC euq474SwfMVtrMaGMKGBpuDH/AHdU2xnxpmXysmGm73Yqnfb2RgDSNqBqYj1I9xOX5VB P6EeKf8/p/jio7ov+eETgMFmleQZFeLSQ6vKISn7+hfUBh6YdmpHS8QpMSBx2RtQasFH KMOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=FDPrant3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ho6-20020a1709070e8600b007ae186b15f9si19558727ejc.597.2023.01.05.17.16.23; Thu, 05 Jan 2023 17:16:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=FDPrant3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236822AbjAFBNp (ORCPT + 99 others); Thu, 5 Jan 2023 20:13:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37230 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236749AbjAFBNT (ORCPT ); Thu, 5 Jan 2023 20:13:19 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7197771FFF for ; Thu, 5 Jan 2023 17:13:18 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id e12-20020a25500c000000b007b48c520262so404740ybb.14 for ; Thu, 05 Jan 2023 17:13:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=U8maFLX/9emtR9Ry3/JNGkiRA36hfakt5AevFKMRuP8=; b=FDPrant3hMVGIRHqyuyr8ArImAU9GINekaycon8t2xlOdFMNVNZY2cfGp0nNw3dW54 1YV8Mw5cRxet3a+fCY7wJLIyCFO+s+iduPSgPyfflvb4tI3HdFebsvVT/RF4xz+4pSLV y7TOm5efaEc8M6aB8SfVAptefpHTx7ufHNShtJqwyMyfJpJahK5EL2U96+WqZ8FMIgVA kq1odA7Dq6Tu960vucowHuolVI4IKR8t0nCJ5A42s5tnCxEgJYQOG66ZPcBVtw3fOblC DAR7OoG1RW2vUBQAGf7wezgsWKDd2kS64Z/vT8wohB9aNZGcNQqnf2tO3CsF/v7HnCxc BPEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=U8maFLX/9emtR9Ry3/JNGkiRA36hfakt5AevFKMRuP8=; b=yd+RzVMa1EGEijy9r+xt5lKc/ISzB8ztoWkOt5WXzp7piRvrRnRssdlrwlRLeLIoqL msmqbxrssCTVNpFVlatjY2vqJwdvjr7sqZPYYuYK0+mnCSK9B66nWBvqQOoS/jvdtIEB dHgu1i0CA0fiRdwhad2VazilXlo0jbo1N+TT+r70MrhfAxzWVRH95Q1vqzIQFne1PiCL 2bEJKF/HdYRTw7Tefa/cRHN0RwQLiOsIxMIQE7EZJgzCWrFBCXBQIY83j+hXlBrx9hOT nmRpTxw+JOkC8XmSQ+2oFnhh9t0VVJWw6ChxSf+SvoFKmf9BY+Nwis4z5fqXvLQ9DvII g9vA== X-Gm-Message-State: AFqh2kqClANCOTa1HgPrxeRnaTnUJk0ic8YNYekCWCUHTUeiMoCThwEz YFG+XGcGremlKW32x4T8850C/3dMPRs= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:a087:0:b0:700:a7b4:1af9 with SMTP id y7-20020a25a087000000b00700a7b41af9mr3497734ybh.227.1672967597770; Thu, 05 Jan 2023 17:13:17 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:35 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-3-seanjc@google.com> Subject: [PATCH v5 02/33] KVM: x86: Purge "highest ISR" cache when updating APICv state From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233891738046643?= X-GMAIL-MSGID: =?utf-8?q?1754233891738046643?= Purge the "highest ISR" cache when updating APICv state on a vCPU. The cache must not be used when APICv is active as hardware may emulate EOIs (and other operations) without exiting to KVM. This fixes a bug where KVM will effectively block IRQs in perpetuity due to the "highest ISR" never getting reset if APICv is activated on a vCPU while an IRQ is in-service. Hardware emulates the EOI and KVM never gets a chance to update its cache. Fixes: b26a695a1d78 ("kvm: lapic: Introduce APICv update helper function") Cc: stable@vger.kernel.org Cc: Suravee Suthikulpanit Cc: Maxim Levitsky Reviewed-by: Paolo Bonzini Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 5c0f93fc073a..33a661d82da7 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2424,6 +2424,7 @@ void kvm_apic_update_apicv(struct kvm_vcpu *vcpu) */ apic->isr_count = count_vectors(apic->regs + APIC_ISR); } + apic->highest_isr_cache = -1; } void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event) @@ -2479,7 +2480,6 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event) kvm_lapic_set_reg(apic, APIC_TMR + 0x10 * i, 0); } kvm_apic_update_apicv(vcpu); - apic->highest_isr_cache = -1; update_divide_count(apic); atomic_set(&apic->lapic_timer.pending, 0); @@ -2767,7 +2767,6 @@ int kvm_apic_set_state(struct kvm_vcpu *vcpu, struct kvm_lapic_state *s) __start_apic_timer(apic, APIC_TMCCT); kvm_lapic_set_reg(apic, APIC_TMCCT, 0); kvm_apic_update_apicv(vcpu); - apic->highest_isr_cache = -1; if (apic->apicv_active) { static_call_cond(kvm_x86_apicv_post_state_restore)(vcpu); static_call_cond(kvm_x86_hwapic_irr_update)(vcpu, apic_find_highest_irr(apic)); From patchwork Fri Jan 6 01:12:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39872 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577301wrt; Thu, 5 Jan 2023 17:16:54 -0800 (PST) X-Google-Smtp-Source: AMrXdXtccZ5tploH3VgWGIhOzoJJ/YKh7k04RyKDWIb6KfEdS+FWtPaam6jP1XosdN9oYlKWsDGF X-Received: by 2002:a17:907:8c81:b0:7c1:962e:cf28 with SMTP id td1-20020a1709078c8100b007c1962ecf28mr47895792ejc.23.1672967814125; Thu, 05 Jan 2023 17:16:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967814; cv=none; d=google.com; s=arc-20160816; b=k0vkrSBx5aFTAUnZ1ECV3qpcpOQVwZodUMuJiT9ICOa1e/4+tw6sqNdMq1zBbsOhVf 5HNpm6bjteJXNQ+DEJaJjgSoL1/aJbnbrfAv2Msk5pfc7riUMIaAbX9lCZg/HVhSE5td RIBrX4EwRfamweM0Obc/XFSzqJbVdBlBFeXxmU+Ejp9Dpq9t3n6wKH1Vll4UauMPbx0n 6oQija4xpD1gPLvL8mltWQM8bMSQzUoxl1dawBrdFkhBaol/5cq++y5BobukrYgQTB6R HFbnvF36Fhm9Vfsf4q6dijInO4sol0RGQOs/pcxT3jbhwEu87Lb6wdk+83VVElQ5nwT8 6iWQ== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=u78lWz0VYuMoumoWecLZd2qogPK5CLyQBtm8aEankL8=; b=Ff9cnMQ+omBGfiFhiJB1MnLHpXbW1qJs0gPW2o6QLuOhxvkMRoWOxUqpQJQIS/9aqt EHJoKNJWBD+NCTc3jToJoF7FnKkWSPOCVVvz1L1+KZ4kd8WwPOm1Oog615q9D/kl3zEt ULLScVWwcJPUY+9JhjuRv+XEOR/TwPj748uguu6E6qwuQWoJcHwpXwc5cvWHlZXSand1 JAAZAANK8+MOw6ET1JxlyvYvFA6HjOz6/Ho4trSZaqwBiCNc5yWSQy7pX/RCnCrUgvk2 ctnEG9CZuOop/Q8xJKkwjcJPxoAUchCoM/7Q1HOKsHnm+kyWCAk3GPdJSsEzHWaBc+D8 Cc4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=r72UhPty; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id va28-20020a17090711dc00b0084d14d255ebsi1416321ejb.291.2023.01.05.17.16.30; Thu, 05 Jan 2023 17:16:54 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=r72UhPty; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236308AbjAFBNs (ORCPT + 99 others); Thu, 5 Jan 2023 20:13:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37240 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236751AbjAFBNV (ORCPT ); Thu, 5 Jan 2023 20:13:21 -0500 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A838571FC2 for ; Thu, 5 Jan 2023 17:13:20 -0800 (PST) Received: by mail-pf1-x449.google.com with SMTP id ca10-20020a056a00418a00b00581dff62bb7so44734pfb.13 for ; Thu, 05 Jan 2023 17:13:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=u78lWz0VYuMoumoWecLZd2qogPK5CLyQBtm8aEankL8=; b=r72UhPty8x9ytF8Iu0v50uaCclT3TpYbGwsVR9/P8cMx301hLhNCR327Vpg9/8+MKB FZwWPgFTEkCRezgF/NvAylGFY+ZVbioXnCFi5a4Do3aPoA4V1Ftp++44CtX/vg1fIbDY 7F/lyInJV2zTpqirwvtfT9mgRfECdomLHhkVgaa+1zZ2tyWa40y6t/mkrAV6nmFDIBA9 1ZxO8XSBX6fp+ikrFwNcH9mdoqlMFc3kBeyaFkjOK1H3LRw7sw+QMGDSC/6IPCJksiBe ZDtQJmFGPZ2SZEK3y584t36Qvgyw61f4Uv0vX2ffYYxcMdxJEMAIGxxQy4Li2OlOCX5j lHGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=u78lWz0VYuMoumoWecLZd2qogPK5CLyQBtm8aEankL8=; b=LoLr8fB7nLR8oyLSs1hv/JP0W39jFTonpyReB1cSEMph0uRv3Xlj8Ys5OKJ0z2ooeS nGQ8f82dmXHLqlL6GcKNlTGfb84qCIPjqGv3QSC6PlLaP/i5zW/VNpmG49xySrf3nn4z cy9VLxBZpaPEqCQhzp4aLIEhUoMMj/L13hCoxFMam8ycptV/9VAUWpPBIa0ixAavEdyH VRldN6AagUKst/24QaH9t33nVbxcJeaOlfSLoHu3QgfbKmnxih0oBREpfzfDEFzUu28r 4aIxyg4bn8gLgnPllJ6T3k59bQ9VrvlpfhtEnQ6KBVsvk9IxmzUw5wKHOIcgUCWRo3UC me1Q== X-Gm-Message-State: AFqh2kofwVOaP1eNqdH7+jT6pvE2PU+O9nsl/mQI6e+8lSXyIFNRm04q A/QAPtEy/QciVa50M3ruf2T0/NT+SFU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90b:378f:b0:219:a032:1760 with SMTP id mz15-20020a17090b378f00b00219a0321760mr3216899pjb.88.1672967599607; Thu, 05 Jan 2023 17:13:19 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:36 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-4-seanjc@google.com> Subject: [PATCH v5 03/33] KVM: SVM: Flush the "current" TLB when activating AVIC From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233898205465941?= X-GMAIL-MSGID: =?utf-8?q?1754233898205465941?= Flush the TLB when activating AVIC as the CPU can insert into the TLB while AVIC is "locally" disabled. KVM doesn't treat "APIC hardware disabled" as VM-wide AVIC inhibition, and so when a vCPU has its APIC hardware disabled, AVIC is not guaranteed to be inhibited. As a result, KVM may create a valid NPT mapping for the APIC base, which the CPU can cache as a non-AVIC translation. Note, Intel handles this in vmx_set_virtual_apic_mode(). Reviewed-by: Paolo Bonzini Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/svm/avic.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 6919dee69f18..712330b80891 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -86,6 +86,12 @@ static void avic_activate_vmcb(struct vcpu_svm *svm) /* Disabling MSR intercept for x2APIC registers */ svm_set_x2apic_msr_interception(svm, false); } else { + /* + * Flush the TLB, the guest may have inserted a non-APIC + * mapping into the TLB while AVIC was disabled. + */ + kvm_make_request(KVM_REQ_TLB_FLUSH_CURRENT, &svm->vcpu); + /* For xAVIC and hybrid-xAVIC modes */ vmcb->control.avic_physical_id |= AVIC_MAX_PHYSICAL_ID; /* Enabling MSR intercept for x2APIC registers */ From patchwork Fri Jan 6 01:12:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39864 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577045wrt; Thu, 5 Jan 2023 17:16:14 -0800 (PST) X-Google-Smtp-Source: AMrXdXtcz8tXDGUQTCkrAYIlVcJGgV591OaNY+7vB1T19amiqVz10RVq3sUH+ofpHYZRaU5Dle65 X-Received: by 2002:a05:6402:2890:b0:47e:eaae:9a56 with SMTP id eg16-20020a056402289000b0047eeaae9a56mr54094984edb.5.1672967774732; Thu, 05 Jan 2023 17:16:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967774; cv=none; d=google.com; s=arc-20160816; b=FGCKzT/oWOZABgJ0lS6uZ9rha2tzQCs98s2CgOYd1YCZXufBsaqFLgZwrOboc+u7V6 ysFiDKxxI/25a31v8lj+v/eAjD1/pYvbNnhC/Or1Mw2DQ9YWjGSAKilljeSwjjg0ej+f dyVy1keorJPtyEhg90tgas2HhG/wKEPRQRCkGkPXQNIVnO2CVFC22ACz7Ei2zRy2XpQy JgtezGUfffjrMl0PCbv6/xJ0Yaefd8dxpkeoUm7q3AFpGoOCkFsJFu8vnI1e7kJHxMon C/SrDNg5nurgqMfDqvZWOEGl8vmNrgYQbHQzznU240dfKe/MR1TxqUx746rv+o0lJY8C xpXw== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=CYYJmfZ9mNFDGGWa3J2yKpONItWzTZPphAVz+Kbcn3U=; b=CmvLWruIDjUtDbQx6UWoSZoidJMdlvUl+KebV5OkZ/WXYhEmZIdHuGMmIE5x5Yl13D G9J8NhEQu3UFin1fak5fHDta1TXBi5v48K/TZUtBdOamfVwhjLBN12GXrAM88c33TOaY FzvEbYHsW72pnRgna779FJEE09NLpZu+SQdw0y6iL+gqUMLslWu+CMhA2AU1gCYMrJ15 UJnlvSC4xFJQA7TcjExjWLg7jNecQuoC8GWyn+3ED5GTOm0k5JoF2DkSX/riiy8u0RGU YExjgEgxxdfggliYqiDV3f3mFFqr8fPhQsNQiA/ZvZ7g7xXFuc5oTWpaorT8vv07zvgF jAzw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=KX8XYL9r; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j19-20020a05640211d300b004700047ef96si41686196edw.289.2023.01.05.17.15.50; Thu, 05 Jan 2023 17:16:14 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=KX8XYL9r; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236685AbjAFBNx (ORCPT + 99 others); Thu, 5 Jan 2023 20:13:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37252 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236762AbjAFBNX (ORCPT ); Thu, 5 Jan 2023 20:13:23 -0500 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8A80271FC2 for ; Thu, 5 Jan 2023 17:13:22 -0800 (PST) Received: by mail-pj1-x104a.google.com with SMTP id a11-20020a17090acb8b00b00226d4edae5dso50530pju.2 for ; Thu, 05 Jan 2023 17:13:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=CYYJmfZ9mNFDGGWa3J2yKpONItWzTZPphAVz+Kbcn3U=; b=KX8XYL9rvgWNlKIscy8mzK0MqUP7L1Eptt11dNZ8Y2gjLSZ2roViegLOvfCmQkXRpm tml1DSPvp1xePvkNESZNRVZ+J0GMlShsFDneY4BlLYyDCUG7XQ5iL1F274CUEEJ1tgKa V8Bmg8gNqLoK/+hlNaN6q/SnxniCnTNq0p+Jzh4HM0ZtHbTvl0U7KvUjA+LpZaAMvbN9 KL/0k8zHeUTiHCcLolVAs7suPaPLUxTiylIKf+h45lufC9nHXuCUKBe9dKVFeUb2gCMK /5yjguwvs7UF6e3mk61i5V/mB5cMIaUnGPfbiZ0dtfjJbOjkt38R2pXpIRo8BAsY9uSA Pe5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=CYYJmfZ9mNFDGGWa3J2yKpONItWzTZPphAVz+Kbcn3U=; b=miVRCUfDAEXE5Wu7IyRwZGHJGBh3f37opFJzp40W/4N3ZH9+CHDPvk9fdakyE/d01f D8CVU4HlFfIwwaqCpVjUUm1KDpk9TZfaUizmfpDTcVsG5Qa52r8s4TkGHQe83clSSa1A P5dTNaooPvnOnOsSKP321IQIbfu3pvTYoa4ms9rpKAkizL8qB3dfhNDQl0LXGqUIZYmB ywJJD7e8ukMa3/6YG7xKnXkZmRgxzPH5ZoKem3SHAHCUSqe15gLCcLDiQNiQ+xMHiuCH Kg58YcIQ21JAdmHhApgdf1zxNNMkDw76w0zxWjuiJRoPB/lL0hn6WUwgjI8YEPUYWtH1 NHkw== X-Gm-Message-State: AFqh2krmCYt0ma6DliLROj8+uPSzDIkvuYI7mRbwCH979KK+ZuvVtyzD XJI/UudbyrF4nr9AhUQhT0rlHUTbXPU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:b207:b0:189:5ba2:4907 with SMTP id t7-20020a170902b20700b001895ba24907mr3964708plr.113.1672967602066; Thu, 05 Jan 2023 17:13:22 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:37 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-5-seanjc@google.com> Subject: [PATCH v5 04/33] KVM: SVM: Process ICR on AVIC IPI delivery failure due to invalid target From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233857250923867?= X-GMAIL-MSGID: =?utf-8?q?1754233857250923867?= Emulate ICR writes on AVIC IPI failures due to invalid targets using the same logic as failures due to invalid types. AVIC acceleration fails if _any_ of the targets are invalid, and crucially VM-Exits before sending IPIs to targets that _are_ valid. In logical mode, the destination is a bitmap, i.e. a single IPI can target multiple logical IDs. Doing nothing causes KVM to drop IPIs if at least one target is valid and at least one target is invalid. Fixes: 18f40c53e10f ("svm: Add VMEXIT handlers for AVIC") Cc: stable@vger.kernel.org Reviewed-by: Paolo Bonzini Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 712330b80891..3b2c88b168ba 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -502,14 +502,18 @@ int avic_incomplete_ipi_interception(struct kvm_vcpu *vcpu) trace_kvm_avic_incomplete_ipi(vcpu->vcpu_id, icrh, icrl, id, index); switch (id) { + case AVIC_IPI_FAILURE_INVALID_TARGET: case AVIC_IPI_FAILURE_INVALID_INT_TYPE: /* * Emulate IPIs that are not handled by AVIC hardware, which - * only virtualizes Fixed, Edge-Triggered INTRs. The exit is - * a trap, e.g. ICR holds the correct value and RIP has been - * advanced, KVM is responsible only for emulating the IPI. - * Sadly, hardware may sometimes leave the BUSY flag set, in - * which case KVM needs to emulate the ICR write as well in + * only virtualizes Fixed, Edge-Triggered INTRs, and falls over + * if _any_ targets are invalid, e.g. if the logical mode mask + * is a superset of running vCPUs. + * + * The exit is a trap, e.g. ICR holds the correct value and RIP + * has been advanced, KVM is responsible only for emulating the + * IPI. Sadly, hardware may sometimes leave the BUSY flag set, + * in which case KVM needs to emulate the ICR write as well in * order to clear the BUSY flag. */ if (icrl & APIC_ICR_BUSY) @@ -525,8 +529,6 @@ int avic_incomplete_ipi_interception(struct kvm_vcpu *vcpu) */ avic_kick_target_vcpus(vcpu->kvm, apic, icrl, icrh, index); break; - case AVIC_IPI_FAILURE_INVALID_TARGET: - break; case AVIC_IPI_FAILURE_INVALID_BACKING_PAGE: WARN_ONCE(1, "Invalid backing page\n"); break; From patchwork Fri Jan 6 01:12:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39858 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp576846wrt; Thu, 5 Jan 2023 17:15:45 -0800 (PST) X-Google-Smtp-Source: AMrXdXuYOjvnR8y8UN9c0Tle3AvHiZfEh261UFHpF1EItJl3XhuEWI+iRQ8G8pRmUixLWI0hToej X-Received: by 2002:a17:907:8e93:b0:7c1:7226:c936 with SMTP id tx19-20020a1709078e9300b007c17226c936mr48018114ejc.64.1672967744838; Thu, 05 Jan 2023 17:15:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967744; cv=none; d=google.com; s=arc-20160816; b=lxMJl2c4LXU3I7YUWf8t1SJgWdXcNe5g965Zbg8+A+/plXEfg9wHSqCWAMA8IMhbwW bWQtBnV38MehbevoFImTS96v6SYB8TjGutpIWtXxlke7+OZrTaeXeAWKLeZ9P/TiEeve uV6gVUQ754aMxPQjAcotUvIWQYTt9Lib45mjqKGTPY4Mi37Ht7hawBbYyqOFaPNR8SXg 98RTIczv8l+38bWMr4HV3wA0C67zColZwFprcZd9GSsIKFbO60LRpUD1Vk1Jg0BLZ/Hi ytpK8z3aFAWMOhMxmFg061xiTjJGg0W7oEoBkHg/ybNcYQFJD+dyHLLh18T3ro5scnJF dUGQ== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=skmNHPbTYLwyxoraHBJpLpuS512+i4UR+d4KzIFrXzo=; b=OvdkZX7trse3AGtUbWr+s97r6LwoV8G8TI5Tp906rk2w9RfrM+Ofi7H0WRo2s8FCYJ jzvgmbHHElWAug/l/TXwiHv/yHnGl86L3XZq3m7vDiCtNgZOTUHuvbGYD32vqjn6zCUP WqVnqGePQCfogYxjLo7V2LZgPqi91hAbVACjZ0OO26hzD/IOvA5VgIvc2e3/EHmIkJpu 7Vt7CY/kDdQZU3iKMsFabv1IZIJNX7qW2wwFD82t4P7MlG8iX+bwZzWkwbNaXPNNuOUM fjnA8zttlR4Fc9GQCbohCXn+2suPr4KYKnqZbE7y7N7zs6WPHYS0E3kBT1Sqov+NXIlw gQ1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=eHspZ09D; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qw1-20020a1709066a0100b00832054a6248si21548839ejc.247.2023.01.05.17.15.21; Thu, 05 Jan 2023 17:15:44 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=eHspZ09D; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236245AbjAFBOD (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37274 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236642AbjAFBNZ (ORCPT ); Thu, 5 Jan 2023 20:13:25 -0500 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 48F5F71FF6 for ; Thu, 5 Jan 2023 17:13:24 -0800 (PST) Received: by mail-pg1-x549.google.com with SMTP id d10-20020a631d4a000000b00491da16dc44so198549pgm.16 for ; Thu, 05 Jan 2023 17:13:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=skmNHPbTYLwyxoraHBJpLpuS512+i4UR+d4KzIFrXzo=; b=eHspZ09DmK7JKDuAkYFgw2Tmeu1pkc8IkPzAYI2GCsgpOY4NyVmsDEUKctJkeXrE5G LzYk2RkJgeauHLVZqTm7drTchkyldaitSOOoRqSr/yjfeEX5NiuSamVpMc+U2c7qLwm0 DngxD2loLWSr9XkOBdkVspM0ynT+X312xS8jTpu12DQVxNUrLf2h1jHb9Cj7PvkPYJq9 PhfxFoez2ibzGpvO7NqkRNK/0zsGH8c+GZf2gzf2Gb5NhhqUfFIKjJIioj3koUdYLD1X CU1kGCr00qZon5e991QguAtr2xKfe87a1tWqbR3kLl7vIweiPI7nyLBf2MzZ7dQo82LK Tm4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=skmNHPbTYLwyxoraHBJpLpuS512+i4UR+d4KzIFrXzo=; b=ghda/v9xypluNcHAcY1xjwPKWv/Eyvmh2G0yXbT2TTQXVhiCMHzBDptGkLkRECjMiy wHvB4LC8k/3PoBA+A+lIqSzqjznPdw8XEtGluyxka3hIiknbhsqnCctz9A0G6qscDj6T YrkVvdPgRMbE7DJ/sIRTbEeRJzzfJlCALH3yPjL+Xv/bSthPwCPEQsM8EoDKXj83nqpj beDlTgysCpV72do3CRCESZgYc9ExkbQmbB7729gJBSF891khIrUgV/tgSp5b2lCgcuS8 8MOPNy3Us/Oizorz9zwQQUcIsjI/HK6uUR0UBxnKXCSkfQlPCN6fRtTM304/y6vhhm+1 g8cw== X-Gm-Message-State: AFqh2koJwcVDwmD7MrAo0KChFFcNPBsbjb8ZqckAGkgFLSkTYu2MrT+Z lnn3HT5UjTPQsgFZzRDeutA7trftnDw= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90b:3c81:b0:219:dbed:ade9 with SMTP id pv1-20020a17090b3c8100b00219dbedade9mr4575858pjb.125.1672967603847; Thu, 05 Jan 2023 17:13:23 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:38 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-6-seanjc@google.com> Subject: [PATCH v5 05/33] KVM: x86: Don't inhibit APICv/AVIC on xAPIC ID "change" if APIC is disabled From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233825959494048?= X-GMAIL-MSGID: =?utf-8?q?1754233825959494048?= Don't inhibit APICv/AVIC due to an xAPIC ID mismatch if the APIC is hardware disabled. The ID cannot be consumed while the APIC is disabled, and the ID is guaranteed to be set back to the vcpu_id when the APIC is hardware enabled (architectural behavior correctly emulated by KVM). Fixes: 3743c2f02517 ("KVM: x86: inhibit APICv/AVIC on changes to APIC ID or APIC base") Cc: stable@vger.kernel.org Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 33a661d82da7..191b5a962700 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2072,6 +2072,9 @@ static void kvm_lapic_xapic_id_updated(struct kvm_lapic *apic) { struct kvm *kvm = apic->vcpu->kvm; + if (!kvm_apic_hw_enabled(apic)) + return; + if (KVM_BUG_ON(apic_x2apic_mode(apic), kvm)) return; From patchwork Fri Jan 6 01:12:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39874 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577445wrt; Thu, 5 Jan 2023 17:17:16 -0800 (PST) X-Google-Smtp-Source: AMrXdXtyuidMdsTw9gUfj3+6DNRlkpc5XOb3O6b4W+6acnpjdx/BCgetdCeHHKVeZtXRqKgoyZd+ X-Received: by 2002:a17:907:9849:b0:7c0:d88e:4b37 with SMTP id jj9-20020a170907984900b007c0d88e4b37mr49514720ejc.52.1672967836758; Thu, 05 Jan 2023 17:17:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967836; cv=none; d=google.com; s=arc-20160816; b=eEb+BrJHv4ZqyVIFXhSt2NKYKd3dbCJrtI8KJrIhQEK/h980tfcXclpbgh3GNHX2Wm 2FSjNBMJr1uYGBr39HRkGceLO6o7fflBZPvOQUOUaxjp1pL98lKirTfXR0bU/7n1sHsZ VNI4DsrEChA2vTSYjomWK8F4uAj1GbYwvC2zukAiYF1yLZivNb4UAA+anOgtIRlTLS+V 7x8BoNuFrOrVALbL+ctRcP2RYpVfBxPanERIwCwAXKYUfL1KXnKxvs8BsK/EF5GMG6sY RVYmmv+a3t0yTk2XH0F6MKkBxPoyDeBq/K92OJiVHj+5t0xUUwIs2ZBx/h/amLCY0yFe voVA== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=TSmJoHpGEg4kYZow7Hfuz8WMYi0D8WbHpbMSfsD+jaY=; b=lKyXMvz61JOOXmrCfcTXKx1R3d9kj51GmEn604vmqzE9RSV2UCjYkMcH9S6cvRX3GD v34oBCPz4vTfPWE/W3LInbS5vyUWo+O9uh2yo9TEBuJUjnTnhDai5/NuuVRERxzL3CGk PHvSPE2jcJEvMr4m8HXEgoTgQrfb2s4/Ezu9h/bcVG6DFQ/6W7cMLtIaLiX+w27dTjJ3 Xp/CvAGdi2SefeKnthf3p9Wxj+FVFjnAiDeWlxgqVkM4LK8iprD9KZ2+zoiNYGSYsE5Y NSWVQnCY1L4wARwVdBLjkGN2rJ5A1cWal1THELU9EYtGXKbZ175Oksk24celll9Lqf2X jDCQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=svIrwG0B; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id xi1-20020a170906dac100b007a953d421bbsi33216185ejb.322.2023.01.05.17.16.51; Thu, 05 Jan 2023 17:17:16 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=svIrwG0B; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236811AbjAFBN6 (ORCPT + 99 others); Thu, 5 Jan 2023 20:13:58 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236660AbjAFBN0 (ORCPT ); Thu, 5 Jan 2023 20:13:26 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 99B1971FF5 for ; Thu, 5 Jan 2023 17:13:25 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-46658ec0cfcso2656287b3.19 for ; Thu, 05 Jan 2023 17:13:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=TSmJoHpGEg4kYZow7Hfuz8WMYi0D8WbHpbMSfsD+jaY=; b=svIrwG0BQCeHJr9kAw3C+ZqzVl4Z8noxUTH4Nm3fxagfr95d0yzpFEtYY0HeWbhhKa Mj7UpQwZ7gK6e4mFFGwm0yRoGFdQDHTTjKT6l5xTDNF8OFTJh2qF4SspR394jOniGrm7 VB61W1PzyR7BbjmWZILBvd/PVnnDPQhcIb6iUkb+AW8JAjkUmWmRfBYZ1Q8StJ44SPZ5 LDv7eYcCPaniI5y9ttvrcjEwaToRELdufqVSRdy9bWT89upLDk1TBMAJzDoeGg2Mx5WW EFeJq5rozALDwYstow/5AByuY7f51vDJ08FP07o3mQkp1a2xtOeuAxfqH1LPWOQly+pZ b+eQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=TSmJoHpGEg4kYZow7Hfuz8WMYi0D8WbHpbMSfsD+jaY=; b=jwmPhw9iDypZn1fOziSXDNFxg62mv3eBp0uTRkzu3SOQLyfbKhk4Bzf6yp4JLkyY2B S7kKZ2ltW0iUXtGcrPr/SrxxISO93gmu1Mjd2sKympT4aflMcRg0/1JeOObOSvSeIa7M HTccHwyQdYt6Z/euQH3iSSeWdUvHlJBizvp0sZhGig4BSqCPhtRBcpEGFijetfHwhLOx ThB7/EPPMXEf73JO+biyw89X6L5coR6u3iKHFeMjk846TrrsiBQwUjPLnf/j2Of+ggtf ncPK4hublW92enkMgLBC/TOUKD9fVknnjuGzE9p989SsEEBCEvuNd4oFoTa/D7dX6FwG VNVg== X-Gm-Message-State: AFqh2krbwI0ZTgPknDVOZ2I2wf14nyYi3lSY+XFIUaI/NC3xQz6rbSCk KjVEHG5pz9XSySGpctqhiW/hbpsZR34= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a0d:c2c1:0:b0:4ad:5c08:7e67 with SMTP id e184-20020a0dc2c1000000b004ad5c087e67mr1617563ywd.75.1672967605381; Thu, 05 Jan 2023 17:13:25 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:39 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-7-seanjc@google.com> Subject: [PATCH v5 06/33] KVM: x86: Don't inhibit APICv/AVIC if xAPIC ID mismatch is due to 32-bit ID From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233922644554859?= X-GMAIL-MSGID: =?utf-8?q?1754233922644554859?= Truncate the vcpu_id, a.k.a. x2APIC ID, to an 8-bit value when comparing it against the xAPIC ID to avoid false positives (sort of) on systems with >255 CPUs, i.e. with IDs that don't fit into a u8. The intent of APIC_ID_MODIFIED is to inhibit APICv/AVIC when the xAPIC is changed from it's original value, The mismatch isn't technically a false positive, as architecturally the xAPIC IDs do end up being aliased in this scenario, and neither APICv nor AVIC correctly handles IPI virtualization when there is aliasing. However, KVM already deliberately does not honor the aliasing behavior that results when an x2APIC ID gets truncated to an xAPIC ID. I.e. the resulting APICv/AVIC behavior is aligned with KVM's existing behavior when KVM's x2APIC hotplug hack is effectively enabled. If/when KVM provides a way to disable the hotplug hack, APICv/AVIC can piggyback whatever logic disables the optimized APIC map (which is what provides the hotplug hack), i.e. so that KVM's optimized map and APIC virtualization yield the same behavior. For now, fix the immediate problem of APIC virtualization being disabled for large VMs, which is a much more pressing issue than ensuring KVM honors architectural behavior for APIC ID aliasing. Fixes: 3743c2f02517 ("KVM: x86: inhibit APICv/AVIC on changes to APIC ID or APIC base") Reported-by: Suravee Suthikulpanit Cc: stable@vger.kernel.org Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 191b5a962700..2183a9b8efa5 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2078,7 +2078,12 @@ static void kvm_lapic_xapic_id_updated(struct kvm_lapic *apic) if (KVM_BUG_ON(apic_x2apic_mode(apic), kvm)) return; - if (kvm_xapic_id(apic) == apic->vcpu->vcpu_id) + /* + * Deliberately truncate the vCPU ID when detecting a modified APIC ID + * to avoid false positives if the vCPU ID, i.e. x2APIC ID, is a 32-bit + * value. + */ + if (kvm_xapic_id(apic) == (u8)apic->vcpu->vcpu_id) return; kvm_set_apicv_inhibit(apic->vcpu->kvm, APICV_INHIBIT_REASON_APIC_ID_MODIFIED); From patchwork Fri Jan 6 01:12:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39869 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577207wrt; Thu, 5 Jan 2023 17:16:39 -0800 (PST) X-Google-Smtp-Source: AMrXdXss9V13M1bPOc8Bq5Ojy2YtbntkOHhyEa8HHZd5pLwz6AEf8sLt066Eb7z+lC0C9ixbu4VR X-Received: by 2002:a17:906:6818:b0:7c0:9bc2:a7f1 with SMTP id k24-20020a170906681800b007c09bc2a7f1mr47304923ejr.34.1672967799533; Thu, 05 Jan 2023 17:16:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967799; cv=none; d=google.com; s=arc-20160816; b=jLB9xZH5C8mTD/GNgyBsDl2wg5XvvNjlfWBC7sJOPLYebWshdJwBZjsP7piwzs9vEm OCFujRGn+xulID28M9+/35n62QrKCic8iTmZCbIT8zLCuSrSDNMiImbLwvCmJTNB9TX6 GtEefBXcRUoS2DTS1NLNCuu9pVent/Gmk/2UnLFEa5brUF9/549XeFiXSqjldalnj1SM tMAFnuUbjA2+SzvFYrCsfs62o3eKJuB5JWDhzjrp7biJ5+OgynysyJ47wJxffyiCZub8 KAZ8utECiU2ceAeWKoo6Dqidu0cSn3UumqhLGF6ddnfNqrQaZ4o0Mobu5jnaU7RQua0E eHpw== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=mau3/kl+h/eXbbhdIv+Q9nrr9eoqBg2GeLPH+58IXTM=; b=jYfFKU3fIIBJVroJWD8hHomlIXp7aooipzWfj8fB1xfT2SAOHEgClJuhmO01nzpIy9 31YmbJRh5DOrDxfnZBSe/i8Q2IchL2q9ujSh6sbqCbEc4IeNPRsBD7GLDzQaasbuIMJg mxWrTY5c+BUQKDBNo27SwTrLRbMWvzsxFt4yylC4J2tT1lqLVAOHViN1iGjR+JtkMLZ0 tPSpULLyYkyo7n9wUtQiD7dFMCwh6egqOGGPCba5UxaaXxQsxfCxHC3ooZzTY5L/QbTG QwEWk8PoM85aGpDTk6eAM7Yk9ajG5WhyXhHBArdhAd29OdMfZnsMvuXwG+tjbI+Hpijf WvhQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=MuWW2qpJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id xc6-20020a170907074600b0084cbcb38374si15753088ejb.478.2023.01.05.17.16.15; Thu, 05 Jan 2023 17:16:39 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=MuWW2qpJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236874AbjAFBOH (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37302 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236708AbjAFBN2 (ORCPT ); Thu, 5 Jan 2023 20:13:28 -0500 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4BA0F71FFF for ; Thu, 5 Jan 2023 17:13:27 -0800 (PST) Received: by mail-pj1-x104a.google.com with SMTP id r17-20020a17090aa09100b0021903e75f14so35032pjp.9 for ; Thu, 05 Jan 2023 17:13:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=mau3/kl+h/eXbbhdIv+Q9nrr9eoqBg2GeLPH+58IXTM=; b=MuWW2qpJuc98zl/fk2bBGCoFbQUn8ySbzjYk2e+aQt/pYvBHlalQf9JAEiYDfakLuC FPDKX6vcfTIEvyBDDFD3eqeJCy8L/kjshK79uiq9izQdHi4QTYdjVALwTSrPX5c31maW 6ocE9I3gWdUjBMlcCvPCCehjYDH8PfRDlnC3AofHAR1hg/KVKRDJgdXM/T8H/cjfLdYI soK+Cv8sVX/0oHlmt5ip06ahzTp52VL997D/yMr7mqIpFZsF/biOBOinhjpbNOMu3DWw ouGZbYzHIRGScKW38SoFVYKCoYqBQh4nxrCJtVpfWPOuPmbDZ8vAawybfCn0EVWkI2gu W3OQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=mau3/kl+h/eXbbhdIv+Q9nrr9eoqBg2GeLPH+58IXTM=; b=VeZv2kUOqc8ulfTtP5DLweRKTDr6UwZqk1pKd82D2V66zTAheMgyztYhoEVrq9uOEo hp9IqPQsQItyxflYPe+e3/4jMGuR+KZTo6chmt8vCmzIQBfDko5fydzomLiYtlz8XIQx +4ugz8jRsfwTQzau9846dXg8iokOm9zr7TjbOJulC5gOUgahaY6XmarQtwAyK+6W8cGT Av6tCNKXLmvSMbAzBsijvjVSlxekfW4dDiqVeckIEzPiB9/bX9iPuikrwmwuhX/aZsKi oypvy+LeJxl+VxHewsZ2aYaRBRNHHKkSc6Sd7D4ukwE4Plwh8g3zf+0IT4y/ZY65eWYX dLWQ== X-Gm-Message-State: AFqh2kqQe42ZjDYnZmY0sy4IcHuoHils7qq+kBgElYni5ikjD4eXCRV4 AFYbq+tny1wN4ImrHnn1JAB0GUCjz8A= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:fa49:b0:226:ce49:3df6 with SMTP id dt9-20020a17090afa4900b00226ce493df6mr249539pjb.61.1672967606965; Thu, 05 Jan 2023 17:13:26 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:40 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-8-seanjc@google.com> Subject: [PATCH v5 07/33] KVM: SVM: Don't put/load AVIC when setting virtual APIC mode From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233883184666483?= X-GMAIL-MSGID: =?utf-8?q?1754233883184666483?= Move the VMCB updates from avic_refresh_apicv_exec_ctrl() into avic_set_virtual_apic_mode() and invert the dependency being said functions to avoid calling avic_vcpu_{load,put}() and avic_set_pi_irte_mode() when "only" setting the virtual APIC mode. avic_set_virtual_apic_mode() is invoked from common x86 with preemption enabled, which makes avic_vcpu_{load,put}() unhappy. Luckily, calling those and updating IRTE stuff is unnecessary as the only reason avic_set_virtual_apic_mode() is called is to handle transitions between xAPIC and x2APIC that don't also toggle APICv activation. And if activation doesn't change, there's no need to fiddle with the physical APIC ID table or update IRTE. The "full" refresh is guaranteed to be called if activation changes in this case as the only call to the "set" path is: kvm_vcpu_update_apicv(vcpu); static_call_cond(kvm_x86_set_virtual_apic_mode)(vcpu); and kvm_vcpu_update_apicv() invokes the refresh if activation changes: if (apic->apicv_active == activate) goto out; apic->apicv_active = activate; kvm_apic_update_apicv(vcpu); static_call(kvm_x86_refresh_apicv_exec_ctrl)(vcpu); Rename the helper to reflect that it is also called during "refresh". WARNING: CPU: 183 PID: 49186 at arch/x86/kvm/svm/avic.c:1081 avic_vcpu_put+0xde/0xf0 [kvm_amd] CPU: 183 PID: 49186 Comm: stable Tainted: G O 6.0.0-smp--fcddbca45f0a-sink #34 Hardware name: Google, Inc. Arcadia_IT_80/Arcadia_IT_80, BIOS 10.48.0 01/27/2022 RIP: 0010:avic_vcpu_put+0xde/0xf0 [kvm_amd] avic_refresh_apicv_exec_ctrl+0x142/0x1c0 [kvm_amd] avic_set_virtual_apic_mode+0x5a/0x70 [kvm_amd] kvm_lapic_set_base+0x149/0x1a0 [kvm] kvm_set_apic_base+0x8f/0xd0 [kvm] kvm_set_msr_common+0xa3a/0xdc0 [kvm] svm_set_msr+0x364/0x6b0 [kvm_amd] __kvm_set_msr+0xb8/0x1c0 [kvm] kvm_emulate_wrmsr+0x58/0x1d0 [kvm] msr_interception+0x1c/0x30 [kvm_amd] svm_invoke_exit_handler+0x31/0x100 [kvm_amd] svm_handle_exit+0xfc/0x160 [kvm_amd] vcpu_enter_guest+0x21bb/0x23e0 [kvm] vcpu_run+0x92/0x450 [kvm] kvm_arch_vcpu_ioctl_run+0x43e/0x6e0 [kvm] kvm_vcpu_ioctl+0x559/0x620 [kvm] Fixes: 05c4fe8c1bd9 ("KVM: SVM: Refresh AVIC configuration when changing APIC mode") Cc: stable@vger.kernel.org Cc: Suravee Suthikulpanit Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 31 +++++++++++++++---------------- arch/x86/kvm/svm/svm.c | 2 +- arch/x86/kvm/svm/svm.h | 2 +- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 3b2c88b168ba..97ad0661f963 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -747,18 +747,6 @@ void avic_apicv_post_state_restore(struct kvm_vcpu *vcpu) avic_handle_ldr_update(vcpu); } -void avic_set_virtual_apic_mode(struct kvm_vcpu *vcpu) -{ - if (!lapic_in_kernel(vcpu) || avic_mode == AVIC_MODE_NONE) - return; - - if (kvm_get_apic_mode(vcpu) == LAPIC_MODE_INVALID) { - WARN_ONCE(true, "Invalid local APIC state (vcpu_id=%d)", vcpu->vcpu_id); - return; - } - avic_refresh_apicv_exec_ctrl(vcpu); -} - static int avic_set_pi_irte_mode(struct kvm_vcpu *vcpu, bool activate) { int ret = 0; @@ -1100,17 +1088,18 @@ void avic_vcpu_put(struct kvm_vcpu *vcpu) WRITE_ONCE(*(svm->avic_physical_id_cache), entry); } - -void avic_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu) +void avic_refresh_virtual_apic_mode(struct kvm_vcpu *vcpu) { struct vcpu_svm *svm = to_svm(vcpu); struct vmcb *vmcb = svm->vmcb01.ptr; - bool activated = kvm_vcpu_apicv_active(vcpu); + + if (!lapic_in_kernel(vcpu) || avic_mode == AVIC_MODE_NONE) + return; if (!enable_apicv) return; - if (activated) { + if (kvm_vcpu_apicv_active(vcpu)) { /** * During AVIC temporary deactivation, guest could update * APIC ID, DFR and LDR registers, which would not be trapped @@ -1124,6 +1113,16 @@ void avic_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu) avic_deactivate_vmcb(svm); } vmcb_mark_dirty(vmcb, VMCB_AVIC); +} + +void avic_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu) +{ + bool activated = kvm_vcpu_apicv_active(vcpu); + + if (!enable_apicv) + return; + + avic_refresh_virtual_apic_mode(vcpu); if (activated) avic_vcpu_load(vcpu, vcpu->cpu); diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 6ffadbd57744..26044e1d2422 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -4771,7 +4771,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = { .enable_nmi_window = svm_enable_nmi_window, .enable_irq_window = svm_enable_irq_window, .update_cr8_intercept = svm_update_cr8_intercept, - .set_virtual_apic_mode = avic_set_virtual_apic_mode, + .set_virtual_apic_mode = avic_refresh_virtual_apic_mode, .refresh_apicv_exec_ctrl = avic_refresh_apicv_exec_ctrl, .check_apicv_inhibit_reasons = avic_check_apicv_inhibit_reasons, .apicv_post_state_restore = avic_apicv_post_state_restore, diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index 4826e6cc611b..d0ed3f595229 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -648,7 +648,7 @@ void avic_vcpu_blocking(struct kvm_vcpu *vcpu); void avic_vcpu_unblocking(struct kvm_vcpu *vcpu); void avic_ring_doorbell(struct kvm_vcpu *vcpu); unsigned long avic_vcpu_get_apicv_inhibit_reasons(struct kvm_vcpu *vcpu); -void avic_set_virtual_apic_mode(struct kvm_vcpu *vcpu); +void avic_refresh_virtual_apic_mode(struct kvm_vcpu *vcpu); /* sev.c */ From patchwork Fri Jan 6 01:12:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39859 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp576912wrt; Thu, 5 Jan 2023 17:15:53 -0800 (PST) X-Google-Smtp-Source: AMrXdXtSbc8miWF3ncJ23GMXtMmwGzIoNJSKIPO0qD/mzPXwosZellGH/ygIO/YcjPTKJXsDDkFO X-Received: by 2002:a05:6402:550e:b0:47d:ca3a:3b32 with SMTP id fi14-20020a056402550e00b0047dca3a3b32mr58155518edb.9.1672967753800; Thu, 05 Jan 2023 17:15:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967753; cv=none; d=google.com; s=arc-20160816; b=r/Q/dBbLn8kinMGBFrTBiKsFk9VOiUEHCPN2V1ejCybERlwvZpPmZ11rETAiyJyceU ohYVvGxwQL7ess2G42xxzrqli+UPIbmYsONiAKERgXMsMZSc0wre5hZ4qwlO0IfzpU2Y IRrz7VlXrh0l/gzPnf8LbeAQOSEdlb/bpExD3g2TWIdgtxGPKFBIfpRBtFZk4PYQ3lTB o73e7o5LA9XIliIJWNO6VQL1RLRVQpY7fmFLqao3FC8j5eFkN5rDAiA7YwcAguJeazON Ton0kTOn2Q6/Uf1L88EfgZiCdUd/nBK8MtiYzko5Kd4qyBeAvboOEITe2+JEmTUtGlrq 28Vw== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=vMUnRQfVbAJv33RqxFDNJJJTw+ranbI7U0SAs08XATU=; b=GRDPm+LNbmPDyw0K5PoLyWMJmXXFnxhFKTP64mwhYfxAz2f8ew41R+xywEnTnq0Ips zVAhoITaQzp9sGoi3EWjjyaGLnSeJ6bgUp/8F7Fktrau+Y1JxBgi/eGtphV5AGWCHUUU PK2TnEJ6ZUNwwvdLRe29wNuLFtxeyhG0ZcXqdknyuveo0p0mlCiYmQrrB8gZD2+hlMcL BZLgs0RbiT8eT+L0eILq8uw3OUjrEWHPYknDg+WKpt/I68Emvb0/k3xY7yKoW5+A9VkP u11x58W2LF5G/l+Jd45xF6NQYiTwPhXy3ZF3MIgvGwXmuXK0mKWHK9oj8Vnsolg7YwQD PrZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=G0S4DPyF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z14-20020a056402274e00b00486c1b099d5si31258703edd.3.2023.01.05.17.15.30; Thu, 05 Jan 2023 17:15:53 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=G0S4DPyF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236600AbjAFBOM (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37316 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236738AbjAFBN3 (ORCPT ); Thu, 5 Jan 2023 20:13:29 -0500 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EAB6371FC2 for ; Thu, 5 Jan 2023 17:13:28 -0800 (PST) Received: by mail-pg1-x54a.google.com with SMTP id g32-20020a635660000000b00478c21b8095so208173pgm.10 for ; Thu, 05 Jan 2023 17:13:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=vMUnRQfVbAJv33RqxFDNJJJTw+ranbI7U0SAs08XATU=; b=G0S4DPyFrd2Oopyroqh9Cz+8c5WqAKldFy75kkimMEIxV5yGuhY63/jc5SSl8Gm6ow h5k5dfPgQ6cySfnnFTdy3suRsCkubzhnft2Qb4DNgZ1K1z0/K4m86z1Olk1zTNEn+vcb Vvlp7boDP/jU4GYiHSbAB3/mC9kpQZp+L4sF80R2yV45vQnY3+3593a/0icBu71baSWr d2cGicwM/cN95qmenJDi+9o+Y3+/tOjD9WduMIyXiwssF32BUmqVMegBR+dcwcb7po3U 7ZqHfbVAX+YJKOPNoAaqKvi7dAO1uVxczzvvi+hh2CIBiLRoQ6u1fALpCpM1WolSrWs9 1Ntw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=vMUnRQfVbAJv33RqxFDNJJJTw+ranbI7U0SAs08XATU=; b=Y1tNan+K5930J1K4liXQeGJUmOncEz7txTs+wdQm9R+thv2Es2FgaHJY0vh2TvUopG +bgGzpK4sJmuqympl38SxMJ/ddjik5ESkQ9a8WxeO+pVnKOhM+7ZgIRu6j0dgfHw4McP xawzTapsEK65s25Ue5a68IMCIQEDaBlI8X92fflYRJjKcyATMItygMSdyieXmJwF623C edFK7d+U/l8nLhqo/60acYmy1nLRlICDTXNFDMrUL3kWQ3xYLj9QwTWQSOi5Wz2FbXCp lL6PPzd1nXiN34W3msEvxtePZ8Vdbkiv3aDHruUmcgh3j0nStRK70vVa2Y6yGs26hS5Q AWjQ== X-Gm-Message-State: AFqh2kqya7CKyvu2Z05YwjsPsc2nKeb7WedE7FtxWis9y8j+5mzWj4K6 YSp+7NSGB5Kaf+Njm3BlsKFkw/7G5Uk= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6a00:2451:b0:580:9b0b:4fde with SMTP id d17-20020a056a00245100b005809b0b4fdemr3392591pfj.49.1672967608513; Thu, 05 Jan 2023 17:13:28 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:41 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-9-seanjc@google.com> Subject: [PATCH v5 08/33] KVM: x86: Handle APICv updates for APIC "mode" changes via request From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233835374273079?= X-GMAIL-MSGID: =?utf-8?q?1754233835374273079?= Use KVM_REQ_UPDATE_APICV to react to APIC "mode" changes, i.e. to handle the APIC being hardware enabled/disabled and/or x2APIC being toggled. There is no need to immediately update APICv state, the only requirement is that APICv be updating prior to the next VM-Enter. Making a request will allow piggybacking KVM_REQ_UPDATE_APICV to "inhibit" the APICv memslot when x2APIC is enabled. Doing that directly from kvm_lapic_set_base() isn't feasible as KVM's SRCU must not be held when modifying memslots (to avoid deadlock), and may or may not be held when kvm_lapic_set_base() is called, i.e. KVM can't do the right thing without tracking that is rightly buried behind CONFIG_PROVE_RCU=y. Suggested-by: Maxim Levitsky Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 2183a9b8efa5..3ed74ad60516 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2401,7 +2401,7 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value) kvm_apic_set_x2apic_id(apic, vcpu->vcpu_id); if ((old_value ^ value) & (MSR_IA32_APICBASE_ENABLE | X2APIC_ENABLE)) { - kvm_vcpu_update_apicv(vcpu); + kvm_make_request(KVM_REQ_APICV_UPDATE, vcpu); static_call_cond(kvm_x86_set_virtual_apic_mode)(vcpu); } From patchwork Fri Jan 6 01:12:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39860 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp576947wrt; Thu, 5 Jan 2023 17:15:59 -0800 (PST) X-Google-Smtp-Source: AMrXdXsN9oG2QkQazvYeBl+qaEF8nSmTOGjqUvOWGSySaTdnW/Ul7lEBIHPTWzCNxIMHiSGjYgOh X-Received: by 2002:a05:6402:25cc:b0:45c:835b:9461 with SMTP id x12-20020a05640225cc00b0045c835b9461mr47710687edb.29.1672967759134; Thu, 05 Jan 2023 17:15:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967759; cv=none; d=google.com; s=arc-20160816; b=H9cKaWyMTvMyIo9knawDPIfGqk1TopFB1XfblmVwAMzS60EdwuwaDD8lAat51wibny YfILuhKiyl739tawsH6cC8vkXh5KVMzEYr73boEMnZod3bx1nTqaHNARO4l474TJS22Y 1V41xgNC7JzbPEsa6ljIcs0vGHIEbXHd+s22BIkJ0xbmAd2NUm4cYJmXOkQ020e/zP55 A7mLs5GrL4KARWspm2vjzuJOHMhqbn7PvGT+J9BM7bebq0wbwmsdvVMdr36QP9oDeneb q0BKJtBAXNrU4RPc7jvWukarFBDEPfVytKny5cDC7mRsLunBjQrHr1EvKzMNQ/8M0gFB 7U9A== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=AyyJxQdOuQ1HMd97et9gNBfdu2A+bTjtvnw5z18m+ZY=; b=HjJbdkFk/19yTxn/zu/gRgZi42N/O8gQkWVw8fNrQEp0TiPJ1d4OUdEn6tdYAGJHqS oT5Z9kfJoGhO8aLA2qmRwSP5Y9Kt9wPpitJdRzIJ1yoKY0aU1XBCEerYD5dEjLtUJHj2 wNA4pPbGNUuImYekFx7g75sHAQhJ5x0jxgnQsd5gtejBigRsMq1rm/YYNxIbFe8fdNnu 85dq4WfTs6l6yGfQefwlrqf9AAK95jMbumhJ9eR75Ny4/cbcXV2w5OkIhutAATRSG5EV fY82WtdPybiUyl+NBcQzNHMU1qDVIA1cDj0Mr+iHlUXsymhg7epyXXXr4Lc9sPTx9wL2 QG2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=n3f4DDGg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y24-20020aa7c258000000b004875d4836dfsi22124941edo.163.2023.01.05.17.15.35; Thu, 05 Jan 2023 17:15:59 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=n3f4DDGg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236522AbjAFBOT (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37350 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236806AbjAFBNc (ORCPT ); Thu, 5 Jan 2023 20:13:32 -0500 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3B91B72D07 for ; Thu, 5 Jan 2023 17:13:30 -0800 (PST) Received: by mail-pf1-x449.google.com with SMTP id ca10-20020a056a00418a00b00581dff62bb7so44958pfb.13 for ; Thu, 05 Jan 2023 17:13:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=AyyJxQdOuQ1HMd97et9gNBfdu2A+bTjtvnw5z18m+ZY=; b=n3f4DDGgwl8y3FetIa6hhUj8fZP1Vy6XVXj5BUFUUOJ0KMAv0fVJVc9d74Q9+ZkM85 N5q2+hS/Cn/Gh5l1CddiI4JJs11r5Sj4FYCInlpqZeVCiCEeuJaagkODP7FZKXy3DuGd W95QR3jNMFXRxL9+eCgy8hf6rPiwOV6rEObaPA/eVcEqY28nAPiNcLKPI/Y2FJWlY/Gr gtIV4EG0KM5H0XNfJTpObusljai093RjgxkeHgc6idUDdYFiqnPTNz46K8mmwdGxW9jd iUnfCDnIsB+/0gq58XiUNgE8v9+Ap3mYfNRRYK/klTU8IvKVMplMQv5dVtKdHE3cgxLF u0Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=AyyJxQdOuQ1HMd97et9gNBfdu2A+bTjtvnw5z18m+ZY=; b=h+nr+HuXfNih6w/B8L+RYZkSk2hNoa7g93/Q0+od6QAGecWf5tOlnf6TuCCxYI/pKc 29ou99snYxtGoOJzc9eFVTBxsO3BUmElHL43THmb7yg8/6mviAM9+fu699vd1ZKYEGh4 CqddZyQmrI/oWwyW5iFvQtT3p6IKcXyGRRTeTCffpftjOh1FcqkZ8TQox1QRCyQdstLf WS0uKh7ZZB6uuHKKSaeFyrCEO3+N4UNcsQT1Yhg9i4xCF4M+gEvXSVcVFdCKdOgQuM3J XQMEpSc8Yj5ktKGRm3MgaaPtL7puQfszScc6DrHFHfkHc+54vq5bZ6uYfMKMapdFyotk Na2Q== X-Gm-Message-State: AFqh2krIBz0Vwc83yckHja8JCL8TGaJS/L56I16SvGKQV2d1qSxLTM1X vRGkFTiKvX0ZYeZz0olCCoCWLnFnhKk= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:fa82:b0:225:ed9f:fdc6 with SMTP id cu2-20020a17090afa8200b00225ed9ffdc6mr3839156pjb.116.1672967610011; Thu, 05 Jan 2023 17:13:30 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:42 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-10-seanjc@google.com> Subject: [PATCH v5 09/33] KVM: x86: Move APIC access page helper to common x86 code From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233840897161432?= X-GMAIL-MSGID: =?utf-8?q?1754233840897161432?= Move the APIC access page allocation helper function to common x86 code, the allocation routine is virtually identical between APICv (VMX) and AVIC (SVM). Keep APICv's gfn_to_page() + put_page() sequence, which verifies that a backing page can be allocated, i.e. that the system isn't under heavy memory pressure. Forcing the backing page to be populated isn't strictly necessary, but skipping the effective prefetch only delays the inevitable. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 35 +++++++++++++++++++++++++++++++++++ arch/x86/kvm/lapic.h | 1 + arch/x86/kvm/svm/avic.c | 41 +++++++---------------------------------- arch/x86/kvm/vmx/vmx.c | 35 +---------------------------------- 4 files changed, 44 insertions(+), 68 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 3ed74ad60516..e73386c26d2c 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2435,6 +2435,41 @@ void kvm_apic_update_apicv(struct kvm_vcpu *vcpu) apic->highest_isr_cache = -1; } +int kvm_alloc_apic_access_page(struct kvm *kvm) +{ + struct page *page; + void __user *hva; + int ret = 0; + + mutex_lock(&kvm->slots_lock); + if (kvm->arch.apic_access_memslot_enabled) + goto out; + + hva = __x86_set_memory_region(kvm, APIC_ACCESS_PAGE_PRIVATE_MEMSLOT, + APIC_DEFAULT_PHYS_BASE, PAGE_SIZE); + if (IS_ERR(hva)) { + ret = PTR_ERR(hva); + goto out; + } + + page = gfn_to_page(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT); + if (is_error_page(page)) { + ret = -EFAULT; + goto out; + } + + /* + * Do not pin the page in memory, so that memory hot-unplug + * is able to migrate it. + */ + put_page(page); + kvm->arch.apic_access_memslot_enabled = true; +out: + mutex_unlock(&kvm->slots_lock); + return ret; +} +EXPORT_SYMBOL_GPL(kvm_alloc_apic_access_page); + void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event) { struct kvm_lapic *apic = vcpu->arch.apic; diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index 58c3242fcc7a..8c6442751dab 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h @@ -112,6 +112,7 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq, struct dest_map *dest_map); int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type); void kvm_apic_update_apicv(struct kvm_vcpu *vcpu); +int kvm_alloc_apic_access_page(struct kvm *kvm); bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src, struct kvm_lapic_irq *irq, int *r, struct dest_map *dest_map); diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 97ad0661f963..ec28ba4c5f1b 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -256,39 +256,6 @@ static u64 *avic_get_physical_id_entry(struct kvm_vcpu *vcpu, return &avic_physical_id_table[index]; } -/* - * Note: - * AVIC hardware walks the nested page table to check permissions, - * but does not use the SPA address specified in the leaf page - * table entry since it uses address in the AVIC_BACKING_PAGE pointer - * field of the VMCB. Therefore, we set up the - * APIC_ACCESS_PAGE_PRIVATE_MEMSLOT (4KB) here. - */ -static int avic_alloc_access_page(struct kvm *kvm) -{ - void __user *ret; - int r = 0; - - mutex_lock(&kvm->slots_lock); - - if (kvm->arch.apic_access_memslot_enabled) - goto out; - - ret = __x86_set_memory_region(kvm, - APIC_ACCESS_PAGE_PRIVATE_MEMSLOT, - APIC_DEFAULT_PHYS_BASE, - PAGE_SIZE); - if (IS_ERR(ret)) { - r = PTR_ERR(ret); - goto out; - } - - kvm->arch.apic_access_memslot_enabled = true; -out: - mutex_unlock(&kvm->slots_lock); - return r; -} - static int avic_init_backing_page(struct kvm_vcpu *vcpu) { u64 *entry, new_entry; @@ -305,7 +272,13 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu) if (kvm_apicv_activated(vcpu->kvm)) { int ret; - ret = avic_alloc_access_page(vcpu->kvm); + /* + * Note, AVIC hardware walks the nested page table to check + * permissions, but does not use the SPA address specified in + * the leaf SPTE since it uses address in the AVIC_BACKING_PAGE + * pointer field of the VMCB. + */ + ret = kvm_alloc_apic_access_page(vcpu->kvm); if (ret) return ret; } diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 0220e22b89ca..8ed14fcfe870 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -3808,39 +3808,6 @@ static void seg_setup(int seg) vmcs_write32(sf->ar_bytes, ar); } -static int alloc_apic_access_page(struct kvm *kvm) -{ - struct page *page; - void __user *hva; - int ret = 0; - - mutex_lock(&kvm->slots_lock); - if (kvm->arch.apic_access_memslot_enabled) - goto out; - hva = __x86_set_memory_region(kvm, APIC_ACCESS_PAGE_PRIVATE_MEMSLOT, - APIC_DEFAULT_PHYS_BASE, PAGE_SIZE); - if (IS_ERR(hva)) { - ret = PTR_ERR(hva); - goto out; - } - - page = gfn_to_page(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT); - if (is_error_page(page)) { - ret = -EFAULT; - goto out; - } - - /* - * Do not pin the page in memory, so that memory hot-unplug - * is able to migrate it. - */ - put_page(page); - kvm->arch.apic_access_memslot_enabled = true; -out: - mutex_unlock(&kvm->slots_lock); - return ret; -} - int allocate_vpid(void) { int vpid; @@ -7394,7 +7361,7 @@ static int vmx_vcpu_create(struct kvm_vcpu *vcpu) vmx->loaded_vmcs = &vmx->vmcs01; if (cpu_need_virtualize_apic_accesses(vcpu)) { - err = alloc_apic_access_page(vcpu->kvm); + err = kvm_alloc_apic_access_page(vcpu->kvm); if (err) goto free_vmcs; } From patchwork Fri Jan 6 01:12:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39862 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp576996wrt; Thu, 5 Jan 2023 17:16:06 -0800 (PST) X-Google-Smtp-Source: AMrXdXsoDMCwZUq7km5b+AN7ZtPVbV277YgRbmDg35FthI/DUK+Vyy8apgi6e0SM8VMajJKE4te8 X-Received: by 2002:a17:906:35cb:b0:84d:1270:8fe with SMTP id p11-20020a17090635cb00b0084d127008femr2766456ejb.67.1672967766183; Thu, 05 Jan 2023 17:16:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967766; cv=none; d=google.com; s=arc-20160816; b=DVXgM0gvKWpZDZdBrWKb1dscavCbKppSH6dg1DFyVUl0tbmtgR9lm/1xNBiTed5oVr HMXppXCFB9caUhYcLutpc0ylXWQk8uPERu2crBqBFOnsxH4emHWm8dWMWfz2ZO61evsv ujPdY20KG8f+YQmJlFI7bLZXTGP3C5p/jqVk95rJBoLcHjcO+6jKbO7F/VtFRpO1ascI kL31dYye4elbSrCxlUKAJUZ9mNp2TVR02xeb6HrMiBFIVMS90uubbdsbBxEm4CDwR+ip dijky3qGx4VeZnB/SMbqL9O50Blb9uGiN1NLgm83z7+6GMLqKgQfRTwVhXRvKl0b2TBQ oi2A== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=fS+csXJyxOMcx0c1E+e+VEzk2Ik+KMEsEvy9GYC3FuY=; b=yJC4x0d/FZTgqt0LZYDPaWkcaqzrPHkKHIjq8T1/CtiFB82gu5z1Z4Ab5hOwqmxVdo Lp6L7f4hGi1fRBvO52hKXERTlMNuvuZXx+e1G7Vl3VNq/XKMHg4nKQ6mP+VdVUrW+fP2 QZVJ0JXnvLZp++gS1Tq1wlbmQlO/DZR+zTgkkazUnRLBvZ21M0XblosjL/LhkfcltH2n JelQ5RwpLUX90lmzziwEjxS/VWaR1liDW6oDAANF1tyGJ4ZQZ6k/oLfAyhwDnU0fbjY4 ThVrbNLSO76+T8UNRpwxOayCBYdTVLQ+wyS974yOW5+N3sVDT64M1y8yWn5uefo/hAaL a6HA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=qPmMRHzY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id nd23-20020a170907629700b0084c899df486si23572250ejc.132.2023.01.05.17.15.42; Thu, 05 Jan 2023 17:16:06 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=qPmMRHzY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236921AbjAFBO3 (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236815AbjAFBNc (ORCPT ); Thu, 5 Jan 2023 20:13:32 -0500 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B6DF071FF5 for ; Thu, 5 Jan 2023 17:13:31 -0800 (PST) Received: by mail-pj1-x104a.google.com with SMTP id a11-20020a17090acb8b00b00226d4edae5dso50691pju.2 for ; Thu, 05 Jan 2023 17:13:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=fS+csXJyxOMcx0c1E+e+VEzk2Ik+KMEsEvy9GYC3FuY=; b=qPmMRHzY2Unv460fRWZ9mu+FUamlJOMoLR2rG7Sh1B1e0bLjVE5XjdLjAE7R5krYn5 uai9FKshpsbwsfFBKwmN53nHURaI8+80Xlya6y4I+saqoXWNe57ouoamKfL7j7vOjAcP ygUCVv1sMfYPva6qmO2QoP5JF2CelCT8zU0M0G8IiirAj0gvEDUCBvtkycFyJ6tswmog 2ESRRfDQLO+1QLwHxMWGxQg6LvRijd+h/CsKKZvyaP21RZ/Yir8xzIhpghaLUVTWDBlR CPJsJInRhC5JF1v9li9IWMVKhXHPQHOem/6s4o9j7py+POR+NiyK0vMwYIyOGPM074J/ zItA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=fS+csXJyxOMcx0c1E+e+VEzk2Ik+KMEsEvy9GYC3FuY=; b=sh2eMY1nTJVKXum6/jfrdw4/mEGdDfLhfpjlILiwTaxD4mflygfxyalSmogcegZjJi YZIibUOAODv40PWXt1JbUNxyETtvuMCMCXi0zTOwIOd3jp3XcXpTu0Y8sHC7TOySWdIW G9Z/9YGZnpyF0r8hRlzBIKBOy8OTVTFY/qHMQw0K/QFU32guestaAv5eV/w90Kh/mzEb HQPKKsNNRirOa+5wL5CC7SUW4iM9luOpxipRqt9LmHuUK2r3uOi1ssSNi5s3iwZxtXKQ 7iIfXkvvPSOACb81Ih08zM6FGmwp9j48yEOYEohJMu2Voti0TtCtts4HxkLcMfh8AEII Jrpw== X-Gm-Message-State: AFqh2kp3sN+YFYIVkPw8qprzb0D8LqPUd/TfJAcsRPKv3AjZE+WmgOuQ N4Xk7Rshg2vzLBw5V0K3vfSXrnKrDhk= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:efcb:b0:186:971b:b7e5 with SMTP id ja11-20020a170902efcb00b00186971bb7e5mr2648231plb.54.1672967611493; Thu, 05 Jan 2023 17:13:31 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:43 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-11-seanjc@google.com> Subject: [PATCH v5 10/33] KVM: x86: Inhibit APIC memslot if x2APIC and AVIC are enabled From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233848344579981?= X-GMAIL-MSGID: =?utf-8?q?1754233848344579981?= Free the APIC access page memslot if any vCPU enables x2APIC and SVM's AVIC is enabled to prevent accesses to the virtual APIC on vCPUs with x2APIC enabled. On AMD, if its "hybrid" mode is enabled (AVIC is enabled when x2APIC is enabled even without x2AVIC support), keeping the APIC access page memslot results in the guest being able to access the virtual APIC page as x2APIC is fully emulated by KVM. I.e. hardware isn't aware that the guest is operating in x2APIC mode. Exempt nested SVM's update of APICv state from the new logic as x2APIC can't be toggled on VM-Exit. In practice, invoking the x2APIC logic should be harmless precisely because it should be a glorified nop, but play it safe to avoid latent bugs, e.g. with dropping the vCPU's SRCU lock. Intel doesn't suffer from the same issue as APICv has fully independent VMCS controls for xAPIC vs. x2APIC virtualization. Technically, KVM should provide bus error semantics and not memory semantics for the APIC page when x2APIC is enabled, but KVM already provides memory semantics in other scenarios, e.g. if APICv/AVIC is enabled and the APIC is hardware disabled (via APIC_BASE MSR). Note, checking apic_access_memslot_enabled without taking locks relies it being set during vCPU creation (before kvm_vcpu_reset()). vCPUs can race to set the inhibit and delete the memslot, i.e. can get false positives, but can't get false negatives as apic_access_memslot_enabled can't be toggled "on" once any vCPU reaches KVM_RUN. Opportunistically drop the "can" while updating avic_activate_vmcb()'s comment, i.e. to state that KVM _does_ support the hybrid mode. Move the "Note:" down a line to conform to preferred kernel/KVM multi-line comment style. Opportunistically update the apicv_update_lock comment, as it isn't actually used to protect apic_access_memslot_enabled (which is protected by slots_lock). Fixes: 0e311d33bfbe ("KVM: SVM: Introduce hybrid-AVIC mode") Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/include/asm/kvm_host.h | 10 +++++---- arch/x86/kvm/lapic.c | 38 ++++++++++++++++++++++++++++++++- arch/x86/kvm/lapic.h | 1 + arch/x86/kvm/svm/avic.c | 12 +++++------ arch/x86/kvm/svm/nested.c | 2 +- arch/x86/kvm/svm/svm.c | 2 ++ arch/x86/kvm/x86.c | 27 +++++++++++++++++++++-- 7 files changed, 78 insertions(+), 14 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index c70690b2c82d..1d92c148e799 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1249,10 +1249,11 @@ struct kvm_arch { struct kvm_apic_map __rcu *apic_map; atomic_t apic_map_dirty; - /* Protects apic_access_memslot_enabled and apicv_inhibit_reasons */ - struct rw_semaphore apicv_update_lock; - bool apic_access_memslot_enabled; + bool apic_access_memslot_inhibited; + + /* Protects apicv_inhibit_reasons */ + struct rw_semaphore apicv_update_lock; unsigned long apicv_inhibit_reasons; gpa_t wall_clock; @@ -1599,6 +1600,7 @@ struct kvm_x86_ops { void (*enable_irq_window)(struct kvm_vcpu *vcpu); void (*update_cr8_intercept)(struct kvm_vcpu *vcpu, int tpr, int irr); bool (*check_apicv_inhibit_reasons)(enum kvm_apicv_inhibit reason); + bool allow_apicv_in_x2apic_without_x2apic_virtualization; void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *vcpu); void (*hwapic_irr_update)(struct kvm_vcpu *vcpu, int max_irr); void (*hwapic_isr_update)(int isr); @@ -1973,7 +1975,7 @@ gpa_t kvm_mmu_gva_to_gpa_system(struct kvm_vcpu *vcpu, gva_t gva, bool kvm_apicv_activated(struct kvm *kvm); bool kvm_vcpu_apicv_activated(struct kvm_vcpu *vcpu); -void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu); +void __kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu); void __kvm_set_or_clear_apicv_inhibit(struct kvm *kvm, enum kvm_apicv_inhibit reason, bool set); void kvm_set_or_clear_apicv_inhibit(struct kvm *kvm, diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index e73386c26d2c..355ea688df4a 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2442,7 +2442,8 @@ int kvm_alloc_apic_access_page(struct kvm *kvm) int ret = 0; mutex_lock(&kvm->slots_lock); - if (kvm->arch.apic_access_memslot_enabled) + if (kvm->arch.apic_access_memslot_enabled || + kvm->arch.apic_access_memslot_inhibited) goto out; hva = __x86_set_memory_region(kvm, APIC_ACCESS_PAGE_PRIVATE_MEMSLOT, @@ -2470,6 +2471,41 @@ int kvm_alloc_apic_access_page(struct kvm *kvm) } EXPORT_SYMBOL_GPL(kvm_alloc_apic_access_page); +void kvm_inhibit_apic_access_page(struct kvm_vcpu *vcpu) +{ + struct kvm *kvm = vcpu->kvm; + + if (!kvm->arch.apic_access_memslot_enabled) + return; + + kvm_vcpu_srcu_read_unlock(vcpu); + + mutex_lock(&kvm->slots_lock); + + if (kvm->arch.apic_access_memslot_enabled) { + __x86_set_memory_region(kvm, APIC_ACCESS_PAGE_PRIVATE_MEMSLOT, 0, 0); + /* + * Clear "enabled" after the memslot is deleted so that a + * different vCPU doesn't get a false negative when checking + * the flag out of slots_lock. No additional memory barrier is + * needed as modifying memslots requires waiting other vCPUs to + * drop SRCU (see above), and false positives are ok as the + * flag is rechecked after acquiring slots_lock. + */ + kvm->arch.apic_access_memslot_enabled = false; + + /* + * Mark the memslot as inhibited to prevent reallocating the + * memslot during vCPU creation, e.g. if a vCPU is hotplugged. + */ + kvm->arch.apic_access_memslot_inhibited = true; + } + + mutex_unlock(&kvm->slots_lock); + + kvm_vcpu_srcu_read_lock(vcpu); +} + void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event) { struct kvm_lapic *apic = vcpu->arch.apic; diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index 8c6442751dab..df316ede7546 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h @@ -113,6 +113,7 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq, int kvm_apic_local_deliver(struct kvm_lapic *apic, int lvt_type); void kvm_apic_update_apicv(struct kvm_vcpu *vcpu); int kvm_alloc_apic_access_page(struct kvm *kvm); +void kvm_inhibit_apic_access_page(struct kvm_vcpu *vcpu); bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src, struct kvm_lapic_irq *irq, int *r, struct dest_map *dest_map); diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index ec28ba4c5f1b..0a75993afed6 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -72,12 +72,12 @@ static void avic_activate_vmcb(struct vcpu_svm *svm) vmcb->control.int_ctl |= AVIC_ENABLE_MASK; - /* Note: - * KVM can support hybrid-AVIC mode, where KVM emulates x2APIC - * MSR accesses, while interrupt injection to a running vCPU - * can be achieved using AVIC doorbell. The AVIC hardware still - * accelerate MMIO accesses, but this does not cause any harm - * as the guest is not supposed to access xAPIC mmio when uses x2APIC. + /* + * Note: KVM supports hybrid-AVIC mode, where KVM emulates x2APIC MSR + * accesses, while interrupt injection to a running vCPU can be + * achieved using AVIC doorbell. KVM disables the APIC access page + * (deletes the memslot) if any vCPU has x2APIC enabled, thus enabling + * AVIC in hybrid mode activates only the doorbell mechanism. */ if (apic_x2apic_mode(svm->vcpu.arch.apic) && avic_mode == AVIC_MODE_X2) { diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c index bc9cd7086fa9..34ac03969f28 100644 --- a/arch/x86/kvm/svm/nested.c +++ b/arch/x86/kvm/svm/nested.c @@ -1106,7 +1106,7 @@ int nested_svm_vmexit(struct vcpu_svm *svm) * to benefit from it right away. */ if (kvm_apicv_activated(vcpu->kvm)) - kvm_vcpu_update_apicv(vcpu); + __kvm_vcpu_update_apicv(vcpu); return 0; } diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 26044e1d2422..7651d665723e 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -5028,6 +5028,8 @@ static __init int svm_hardware_setup(void) svm_x86_ops.vcpu_blocking = NULL; svm_x86_ops.vcpu_unblocking = NULL; svm_x86_ops.vcpu_get_apicv_inhibit_reasons = NULL; + } else if (avic_mode == AVIC_MODE_X1) { + svm_x86_ops.allow_apicv_in_x2apic_without_x2apic_virtualization = true; } if (vls) { diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 39b8dd37bc40..1abe3f1e821c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10045,7 +10045,7 @@ void kvm_make_scan_ioapic_request(struct kvm *kvm) kvm_make_all_cpus_request(kvm, KVM_REQ_SCAN_IOAPIC); } -void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu) +void __kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu) { struct kvm_lapic *apic = vcpu->arch.apic; bool activate; @@ -10080,7 +10080,30 @@ void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu) preempt_enable(); up_read(&vcpu->kvm->arch.apicv_update_lock); } -EXPORT_SYMBOL_GPL(kvm_vcpu_update_apicv); +EXPORT_SYMBOL_GPL(__kvm_vcpu_update_apicv); + +static void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu) +{ + if (!lapic_in_kernel(vcpu)) + return; + + /* + * Due to sharing page tables across vCPUs, the xAPIC memslot must be + * deleted if any vCPU has xAPIC virtualization and x2APIC enabled, but + * and hardware doesn't support x2APIC virtualization. E.g. some AMD + * CPUs support AVIC but not x2APIC. KVM still allows enabling AVIC in + * this case so that KVM can the AVIC doorbell to inject interrupts to + * running vCPUs, but KVM must not create SPTEs for the APIC base as + * the vCPU would incorrectly be able to access the vAPIC page via MMIO + * despite being in x2APIC mode. For simplicity, inhibiting the APIC + * access page is sticky. + */ + if (apic_x2apic_mode(vcpu->arch.apic) && + kvm_x86_ops.allow_apicv_in_x2apic_without_x2apic_virtualization) + kvm_inhibit_apic_access_page(vcpu); + + __kvm_vcpu_update_apicv(vcpu); +} void __kvm_set_or_clear_apicv_inhibit(struct kvm *kvm, enum kvm_apicv_inhibit reason, bool set) From patchwork Fri Jan 6 01:12:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39861 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp576970wrt; Thu, 5 Jan 2023 17:16:01 -0800 (PST) X-Google-Smtp-Source: AMrXdXsWhgjJOdisLaRWqgT8QARcKaGJzaoVe7SnZ/jUfzkXkDi0IWKAk4WT9SZdNP0dFIOLTznv X-Received: by 2002:a17:907:8748:b0:7c1:ad6:7331 with SMTP id qo8-20020a170907874800b007c10ad67331mr51087389ejc.27.1672967761514; Thu, 05 Jan 2023 17:16:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967761; cv=none; d=google.com; s=arc-20160816; b=H2JD9P04vpHkNHmu0sFXMzupJcF12Xlbskyt2Oisu1WyEgDJLKnP8kZAFDq0I/QLhP 7dwu3nhOL4h1HbE1dB0hg7xuCeyQJq/SVu9q1gBMmuF1BrvVUd7iJGLvSRdnfczdswMM qe+p2zIeyNh5lxbKigUqI//WvpJg3+u/BE/Ex9wIHuDVDmRGbYDyEfqEAZaFERjzpdYr maox05MMHMAhinPRApdvofGbOKRC8saxvAHDWNMQkAv8mq7Lh1wrNNd/nnWrQOW5sk3q PV6obzcdEefBHt72+LVYXa9nB5r8keMPW+gLLzQpqSSGyOXwVhv+ZmYJXbWYWqyyny9S U/tg== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=Yz9E2DnzGU1LH62FYK53IVWLc/c5snlTFiIPiIg7gYk=; b=XNzBm0h1V87kXLXR8pswde8kzXM471EigZMKnwn6Gi7fg0dmrWc5MEU/XAp0uWW9ii 0XwO74mzGQjMAlwD6pLHS/MPnYN1hDD1R6Rgb8q6hbMgYQ4dFvGhWwWBMoC6YujC21M5 M48OuL5eX4a70eimrEDKRqBuQvz5IHR+qir7yyEWLluhw1fBZ+ta7uwfaSkYNo6tEBQg CCFgOczrGPws1aZq4dYuEUpv0Qh9+HtIZNgXtLFEYNYwIRhilJ5INO1zrZfhFmSFnGD6 c8ss/EiMVYDilfYZUPUC4lGNGSEvWE/S8eZCvhjFZPIyeveQ4gvXR0gbz/FaUkarcEc0 g4/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=JgI8xYDc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id dd21-20020a1709069b9500b007fed8db38a8si37988935ejc.114.2023.01.05.17.15.37; Thu, 05 Jan 2023 17:16:01 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=JgI8xYDc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236885AbjAFBOW (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37370 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236825AbjAFBNe (ORCPT ); Thu, 5 Jan 2023 20:13:34 -0500 Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8E56D71FF6 for ; Thu, 5 Jan 2023 17:13:33 -0800 (PST) Received: by mail-pf1-x44a.google.com with SMTP id y10-20020aa7942a000000b005814a9d972bso57646pfo.5 for ; Thu, 05 Jan 2023 17:13:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Yz9E2DnzGU1LH62FYK53IVWLc/c5snlTFiIPiIg7gYk=; b=JgI8xYDcfH+1NRbV5JPQ/HsQ5Ob4bKUgvDUh7lrOmgE0/necFRjH5QYPhFaFmhgGMu OeU03FLmBpTYjyxCsPwWOd+H0+/nd+6aCbBGp+kM7XdoO2veu07K0u4DRTQxL3YoEUjj I/vg1qyC80S7VHKDBPcofn7cDZDkQd7Naam2HEj9c0pbitjBMUu/jOYZ6O/nt9996cvK XKfrs3+t4peZfihZtHDFI16/d/5TarxwGnwlSwg+fKowIWwi5FsSXShTDLj+IyWqsJaK UcscAhxeyQXWw2h8dHy2GwwYAG2whLIVwLsrUlv3j7pj3Juohy5MFxU+TSwuptAVGCr4 mBCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Yz9E2DnzGU1LH62FYK53IVWLc/c5snlTFiIPiIg7gYk=; b=T5NlVjjd6YT4DhO/cGUbw+46o6yrCm4dm6uOuU2MmZ6D2JsKN5qjNunAWIXhyuwUap ESxChOvleZtzUV6+HGa2A0SW6PZ9lm978v6vrvwf7yseTw9qomTN4IsvFalIMMnCdrFP /UlH/LASs1L+C2aA+pdFKg9c47fDGosvi94qpRawKe2EIZnDwLGgEi5IRl1c/uvBuyRY KIuPaMFb9fEuurAFlZ7VKgF0pxAkJ1W9nnnbVkHrfuTwWhDg3Zzv0kj3ZwluuRFrwWzO eH39lvmdS9roLtiMD5jwwTcWLVnsqZfzVLcvSSH6cXVAyh12pqvI3KoMB7hk46CQ3kT1 80yw== X-Gm-Message-State: AFqh2krZCyRPb739CBmtb2LEacjkFpy+fZaKnjFsbYpTzhsv01m1Q8UF aK9m3xiedL+S+iHk/ZTOLMDPBRtXKIs= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a65:5582:0:b0:481:b930:78dc with SMTP id j2-20020a655582000000b00481b93078dcmr2897762pgs.272.1672967613224; Thu, 05 Jan 2023 17:13:33 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:44 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-12-seanjc@google.com> Subject: [PATCH v5 11/33] KVM: SVM: Replace "avic_mode" enum with "x2avic_enabled" boolean From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233843788206763?= X-GMAIL-MSGID: =?utf-8?q?1754233843788206763?= Replace the "avic_mode" enum with a single bool to track whether or not x2AVIC is enabled. KVM already has "apicv_enabled" that tracks if any flavor of AVIC is enabled, i.e. AVIC_MODE_NONE and AVIC_MODE_X1 are redundant and unnecessary noise. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/svm/avic.c | 46 +++++++++++++++++++---------------------- arch/x86/kvm/svm/svm.c | 4 ++-- arch/x86/kvm/svm/svm.h | 9 +------- 3 files changed, 24 insertions(+), 35 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 0a75993afed6..10b0e996e2e3 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -53,7 +53,7 @@ static DEFINE_HASHTABLE(svm_vm_data_hash, SVM_VM_DATA_HASH_BITS); static u32 next_vm_id = 0; static bool next_vm_id_wrapped = 0; static DEFINE_SPINLOCK(svm_vm_data_hash_lock); -enum avic_modes avic_mode; +bool x2avic_enabled; /* * This is a wrapper of struct amd_iommu_ir_data. @@ -79,8 +79,7 @@ static void avic_activate_vmcb(struct vcpu_svm *svm) * (deletes the memslot) if any vCPU has x2APIC enabled, thus enabling * AVIC in hybrid mode activates only the doorbell mechanism. */ - if (apic_x2apic_mode(svm->vcpu.arch.apic) && - avic_mode == AVIC_MODE_X2) { + if (x2avic_enabled && apic_x2apic_mode(svm->vcpu.arch.apic)) { vmcb->control.int_ctl |= X2APIC_MODE_MASK; vmcb->control.avic_physical_id |= X2AVIC_MAX_PHYSICAL_ID; /* Disabling MSR intercept for x2APIC registers */ @@ -247,8 +246,8 @@ static u64 *avic_get_physical_id_entry(struct kvm_vcpu *vcpu, u64 *avic_physical_id_table; struct kvm_svm *kvm_svm = to_kvm_svm(vcpu->kvm); - if ((avic_mode == AVIC_MODE_X1 && index > AVIC_MAX_PHYSICAL_ID) || - (avic_mode == AVIC_MODE_X2 && index > X2AVIC_MAX_PHYSICAL_ID)) + if ((!x2avic_enabled && index > AVIC_MAX_PHYSICAL_ID) || + (index > X2AVIC_MAX_PHYSICAL_ID)) return NULL; avic_physical_id_table = page_address(kvm_svm->avic_physical_id_table_page); @@ -262,8 +261,8 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu) int id = vcpu->vcpu_id; struct vcpu_svm *svm = to_svm(vcpu); - if ((avic_mode == AVIC_MODE_X1 && id > AVIC_MAX_PHYSICAL_ID) || - (avic_mode == AVIC_MODE_X2 && id > X2AVIC_MAX_PHYSICAL_ID)) + if ((!x2avic_enabled && id > AVIC_MAX_PHYSICAL_ID) || + (id > X2AVIC_MAX_PHYSICAL_ID)) return -EINVAL; if (!vcpu->arch.apic->regs) @@ -1066,10 +1065,7 @@ void avic_refresh_virtual_apic_mode(struct kvm_vcpu *vcpu) struct vcpu_svm *svm = to_svm(vcpu); struct vmcb *vmcb = svm->vmcb01.ptr; - if (!lapic_in_kernel(vcpu) || avic_mode == AVIC_MODE_NONE) - return; - - if (!enable_apicv) + if (!lapic_in_kernel(vcpu) || !enable_apicv) return; if (kvm_vcpu_apicv_active(vcpu)) { @@ -1145,32 +1141,32 @@ bool avic_hardware_setup(struct kvm_x86_ops *x86_ops) if (!npt_enabled) return false; + /* AVIC is a prerequisite for x2AVIC. */ + if (!boot_cpu_has(X86_FEATURE_AVIC) && !force_avic) { + if (boot_cpu_has(X86_FEATURE_X2AVIC)) { + pr_warn(FW_BUG "Cannot support x2AVIC due to AVIC is disabled"); + pr_warn(FW_BUG "Try enable AVIC using force_avic option"); + } + return false; + } + if (boot_cpu_has(X86_FEATURE_AVIC)) { - avic_mode = AVIC_MODE_X1; pr_info("AVIC enabled\n"); } else if (force_avic) { /* * Some older systems does not advertise AVIC support. * See Revision Guide for specific AMD processor for more detail. */ - avic_mode = AVIC_MODE_X1; pr_warn("AVIC is not supported in CPUID but force enabled"); pr_warn("Your system might crash and burn"); } /* AVIC is a prerequisite for x2AVIC. */ - if (boot_cpu_has(X86_FEATURE_X2AVIC)) { - if (avic_mode == AVIC_MODE_X1) { - avic_mode = AVIC_MODE_X2; - pr_info("x2AVIC enabled\n"); - } else { - pr_warn(FW_BUG "Cannot support x2AVIC due to AVIC is disabled"); - pr_warn(FW_BUG "Try enable AVIC using force_avic option"); - } - } + x2avic_enabled = boot_cpu_has(X86_FEATURE_X2AVIC); + if (x2avic_enabled) + pr_info("x2AVIC enabled\n"); - if (avic_mode != AVIC_MODE_NONE) - amd_iommu_register_ga_log_notifier(&avic_ga_log_notifier); + amd_iommu_register_ga_log_notifier(&avic_ga_log_notifier); - return !!avic_mode; + return true; } diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 7651d665723e..9f172f2de195 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -813,7 +813,7 @@ void svm_set_x2apic_msr_interception(struct vcpu_svm *svm, bool intercept) if (intercept == svm->x2avic_msrs_intercepted) return; - if (avic_mode != AVIC_MODE_X2 || + if (!x2avic_enabled || !apic_x2apic_mode(svm->vcpu.arch.apic)) return; @@ -5028,7 +5028,7 @@ static __init int svm_hardware_setup(void) svm_x86_ops.vcpu_blocking = NULL; svm_x86_ops.vcpu_unblocking = NULL; svm_x86_ops.vcpu_get_apicv_inhibit_reasons = NULL; - } else if (avic_mode == AVIC_MODE_X1) { + } else if (!x2avic_enabled) { svm_x86_ops.allow_apicv_in_x2apic_without_x2apic_virtualization = true; } diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index d0ed3f595229..546825c82490 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -35,14 +35,7 @@ extern u32 msrpm_offsets[MSRPM_OFFSETS] __read_mostly; extern bool npt_enabled; extern int vgif; extern bool intercept_smi; - -enum avic_modes { - AVIC_MODE_NONE = 0, - AVIC_MODE_X1, - AVIC_MODE_X2, -}; - -extern enum avic_modes avic_mode; +extern bool x2avic_enabled; /* * Clean bits in VMCB. From patchwork Fri Jan 6 01:12:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39863 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577029wrt; Thu, 5 Jan 2023 17:16:12 -0800 (PST) X-Google-Smtp-Source: AMrXdXu5A4Cx4k8V/Z6fSqfMFB3wkotrzl6fSgh6INVEqQNyOaQtMPgX6/hc01HF4boh6yKw6QIp X-Received: by 2002:a17:906:308b:b0:7ae:cda1:76d0 with SMTP id 11-20020a170906308b00b007aecda176d0mr43146724ejv.15.1672967772235; Thu, 05 Jan 2023 17:16:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967772; cv=none; d=google.com; s=arc-20160816; b=a/qEKNUlHzW+CbhoP6VFHY6fxPY9xuf8Pabq3kgc2KrZs/ydWDGCpWk4EhKlrfwpvS iLQ8txJ0FLC5K4GsfGXyzT5qFn7yH0MmMeccFNOrzeo6VARBa9Sw+KkA7zYTPUyu1dXy k8EP4mP86ScD9Ip5+QNjroAa1YJQpjCBWOemSQBfX5imtw0qFTla7enEh7MYyOaCWXcQ Ko724QIq0fIbEvvL0UxdP3izX7AS88VQ0SdZCcOE4+/uDSNDc5JFr3IXg8xFasBaWipO 1g4X4/HCo/8xc9EFgBwFn0HjqkwC3hqfsYQnImHXC5To1eGALj317j/j50fivITeV52d n62Q== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=kDxvCyND+GW2720NKX+RgCL5mWGsrG1FRlKlZQabxpo=; b=kxW19h6KC0sfLJ/kf2zWePC9CRkvDlX0/JHNa+oEM2O9UYbt3vFY2qd4oW9ktFHI5n yHS76+Xn4mmUQV1LMX68icxZTlPtuSqLpTZS6onvW267UiCN2I6MzmAKrC0yJTlRxgNS FwqfiTIlgmP45RrKksnS+eIgh4d7W+DtpAvJhryO0ZWwFDUvO87tRV0mTXYVVFGk+css noWoVxGX6aGtP5ExEFVpZg167yO6bd1WBaR3uoy9DifdsZzFi2CXIyi1cdHsTKhYNtXB AzeSqa9aJ3ROmXt2U2c8v4O410tWzKpu1BuBaQEij/soTYEsyLoSyfWFvCgkd+KNnoid G4gw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=ReJLu44X; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i16-20020a1709064fd000b0073d8ccd37c2si36974728ejw.107.2023.01.05.17.15.48; Thu, 05 Jan 2023 17:16:12 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=ReJLu44X; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236952AbjAFBOd (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37406 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236255AbjAFBNf (ORCPT ); Thu, 5 Jan 2023 20:13:35 -0500 Received: from mail-pj1-x1049.google.com (mail-pj1-x1049.google.com [IPv6:2607:f8b0:4864:20::1049]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 372DE72D1A for ; Thu, 5 Jan 2023 17:13:35 -0800 (PST) Received: by mail-pj1-x1049.google.com with SMTP id 31-20020a17090a0fa200b00226e43409c2so36456pjz.9 for ; Thu, 05 Jan 2023 17:13:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=kDxvCyND+GW2720NKX+RgCL5mWGsrG1FRlKlZQabxpo=; b=ReJLu44Xuh4L0IBAiISnjpPDDmPZ4zwt1bptT0oPD7m/aH0WSmyL3GOnkvXTm/nwxL QJ2LJh6tqzSOReRZuSNjKCRtIHdOrYNhOhnIRueYmyjdWqB3GFnXlunLvUvGnn4jS3+3 8ORcT4qtwKM/HGxgM9Mq6zhIXA7OV0ahXuuSC7z8ZOb4BFRxm1bbk667UvcrQgj798yj dTlMJlvImnDEKZrTB62yq9A6UHtYeivWKHoGzHpHX5Y2L+qxA3RgMEGSKLV/3jHtIAMq TFis3gn/knWcYiPuIwBJ+dNPLg/fgfC6RRqacslGH7qUqPsb+NXbhNr4R2x8JJ7H1SfC 1XFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=kDxvCyND+GW2720NKX+RgCL5mWGsrG1FRlKlZQabxpo=; b=WXViLn2QSJyd3QqJ7yW8iSbGDiVo3GTYoa+EUirOaRhoUFxW65gEWtmOWiQTQ3XTyT N/xIPxmpkbqERjuET1I/IHHm3D6DYYpj29GF5/d8sn1tqvyhxO4vcpmiddgiWdotGApz +wB2goQu7K4jiwo6t0Ms8vOpIhCKMhOzxdSe6to0ae+B5a2QKJ6mdoyRGRPeJJHCwXoI 2Md60D9KnypPwRn08cyWxsJL20CS/pJsYgQAblSO9tR+E9u1DAAh1o6DfZS8bfGBlvjx eQoVfS5C4cSMzpFgB0UpB8MItcscEHJGl+cg15AbUmCVRHgxSVMVqpiweaSe9leQFuiJ wi7Q== X-Gm-Message-State: AFqh2koiCJZwwr474yuFe2+Ln3s2MVQD8/90JVKEL5eOt5qaWYnvEKuF v2J5w/KuhwUQmC0Tmcm4FzbHgFJC2hQ= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a65:6748:0:b0:483:cd24:1cb7 with SMTP id c8-20020a656748000000b00483cd241cb7mr2838151pgu.190.1672967614819; Thu, 05 Jan 2023 17:13:34 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:45 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-13-seanjc@google.com> Subject: [PATCH v5 12/33] KVM: SVM: Compute dest based on sender's x2APIC status for AVIC kick From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233855170811053?= X-GMAIL-MSGID: =?utf-8?q?1754233855170811053?= Compute the destination from ICRH using the sender's x2APIC status, not each (potential) target's x2APIC status. Fixes: c514d3a348ac ("KVM: SVM: Update avic_kick_target_vcpus to support 32-bit APIC ID") Cc: Li RongQing Signed-off-by: Sean Christopherson Reviewed-by: Li RongQing Reviewed-by: Maxim Levitsky --- arch/x86/kvm/svm/avic.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 10b0e996e2e3..f2db0021c45f 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -429,6 +429,7 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source static void avic_kick_target_vcpus(struct kvm *kvm, struct kvm_lapic *source, u32 icrl, u32 icrh, u32 index) { + u32 dest = apic_x2apic_mode(source) ? icrh : GET_XAPIC_DEST_FIELD(icrh); unsigned long i; struct kvm_vcpu *vcpu; @@ -444,13 +445,6 @@ static void avic_kick_target_vcpus(struct kvm *kvm, struct kvm_lapic *source, * since entered the guest will have processed pending IRQs at VMRUN. */ kvm_for_each_vcpu(i, vcpu, kvm) { - u32 dest; - - if (apic_x2apic_mode(vcpu->arch.apic)) - dest = icrh; - else - dest = GET_XAPIC_DEST_FIELD(icrh); - if (kvm_apic_match_dest(vcpu, source, icrl & APIC_SHORT_MASK, dest, icrl & APIC_DEST_MASK)) { vcpu->arch.apic->irr_pending = true; From patchwork Fri Jan 6 01:12:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39865 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577057wrt; Thu, 5 Jan 2023 17:16:16 -0800 (PST) X-Google-Smtp-Source: AMrXdXsdrJ4ntEJ9gxC00gQY+EkyqAEVnHTVoloivM7G/Vj0O1g7JOzM2oUEe/agULX3Gn1MDyeP X-Received: by 2002:a17:906:5e04:b0:7c0:e803:4ebb with SMTP id n4-20020a1709065e0400b007c0e8034ebbmr44812603eju.70.1672967776377; Thu, 05 Jan 2023 17:16:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967776; cv=none; d=google.com; s=arc-20160816; b=U0/QFivOS0etn2xLVJmFc1aTErX6UBEVDPQ41mtPvQ0Gb2mBbCrQ6wTXLJXpitHG5b 3x/vs9vT0iRDHgKXwjr3V0OGkNgpIoVpoB8UHfCNiQ6PnwHPPNSCneFbChyj4Zj4UqTt KvgFX/z3MLu/SkfuGSTf5mC/hnOxRI1zRogCGhhy1XzfXIMGB4UU8XLkomuPJPfGUohe bZ33Jw0D9W6IInMGqkXPuicY1bFH2InPcEwXxa5g5Bn4efxT1jLF0kTyQweDmXbYGAO8 X56C8T5o4T7h4gv3L0xh3OYbkzxyGduEFBgvuctvyaadf6yFZd6L1AqEk1H3JHECccPK bI/w== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=hanAIN1FDjCqq9DaKdKzw+37XL7mO/LpW1Uuz4oItLY=; b=RNx67ynwMWUIYRK1QliwUxNwh+Gys1a2eBhWy3SN3Oq8Z59L17K7XOGUdVEJDSVMre mHiBULY89WNxbBaO2W1fRsNPQWweMlQDvkn3PoHCEI0zv6zrgg2tkfp5qoWFK4SL4M99 jgKrkxIYIcXFHfJrLO25heCHxTobw4N4rm6Ft1372KvqO5hp3tRHQ/K2wX+F9sCQRLJq K33l9ApzJsDFtzIo12j2y6iP5oXgvNwsbReXrINO67TCtUe4TI4x3I55mViOSSgnIb11 E3iK0yasHSqkgw3+tw5KoYn4Qo6Amc3+Zg2B1FRb1yRZ/byGaITZTOMTw/b8oqJDVxIZ bCAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=BpE+M+im; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id hg5-20020a1709072cc500b0084d1ed9b67bsi136899ejc.310.2023.01.05.17.15.52; Thu, 05 Jan 2023 17:16:16 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=BpE+M+im; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S236964AbjAFBOh (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37504 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236819AbjAFBNj (ORCPT ); Thu, 5 Jan 2023 20:13:39 -0500 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E50A672D16 for ; Thu, 5 Jan 2023 17:13:36 -0800 (PST) Received: by mail-pl1-x649.google.com with SMTP id l15-20020a170903244f00b001927c3a0055so134122pls.6 for ; Thu, 05 Jan 2023 17:13:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=hanAIN1FDjCqq9DaKdKzw+37XL7mO/LpW1Uuz4oItLY=; b=BpE+M+imcFeJplZu6dyhWUzUUaWyR/Fm2UvwG0pbVeRkfy5RLyiWL7CS7gsyVQvwak AcFRlBLd8Gi2GEMc1kCZJWHd9kqUKRARrK4J1HATMCTvfK1QDVOyWznFi4TVkwxf7TVr PU5DMNU7EfG1NIBLp0Tz4MDNCxp2FVDVb05J4IHw4+DFw4BtwSDAnPvSkXQtKBFIaxsT 6Jip/PQAxFu1MwNACIkF21o4oDgTD46unsSfN9CjVcHMk/SRJnJ3orggDzTAN0B+9/Le r1eP58berdKr1IhYEyG10vPjuzo15J9f6id/gcomZ4yrADSVYphwDpUxND5F+GuDLx0X Z9Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=hanAIN1FDjCqq9DaKdKzw+37XL7mO/LpW1Uuz4oItLY=; b=7mhefcaA11aCJ6I7R6D3UCh9Al6Ddqi9Jqmuu9Fkxfoc2Sr9UCMnShw1HrAeAW2ej7 kstODZS7aAPe9/EjWaHVtzwIfpoKIFEP44Z2YQy2j7vroCw34ePe1zm2tI0+PYyEDTk2 aej8i5vz/6Ym1F8M4HxbWvkbLR3dX4fRH6Pcv/PyZ6X8LEMuuNNZo6Zm4BqBQrawg+VT WkFeoLQo9aiRWqul9j3qMtE1/FAzSbq2ejlM1TSabvx553EBygcQSesCfWPZ86fiAH7r XO9D2xzNxivQnI1Rnwc5qo+XISwaESTeuw8uJ16YXP3otAJhFhB5G0rZlwCZ8I59HMai nrhg== X-Gm-Message-State: AFqh2kpPQXKSR1qP5sdrgkhpXdUm2kMoL2QKNBiK8FaUxrsllD/QQ6C6 dP+4UzYWolMgPzOa97BgtHefgXvW5WE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:a013:b0:223:3448:eb18 with SMTP id q19-20020a17090aa01300b002233448eb18mr4464943pjp.41.1672967616474; Thu, 05 Jan 2023 17:13:36 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:46 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-14-seanjc@google.com> Subject: [PATCH v5 13/33] KVM: SVM: Fix x2APIC Logical ID calculation for avic_kick_target_vcpus_fast From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233859285860431?= X-GMAIL-MSGID: =?utf-8?q?1754233859285860431?= From: Suravee Suthikulpanit For X2APIC ID in cluster mode, the logical ID is bit [15:0]. Fixes: 603ccef42ce9 ("KVM: x86: SVM: fix avic_kick_target_vcpus_fast") Cc: Maxim Levitsky Signed-off-by: Suravee Suthikulpanit Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index f2db0021c45f..0f67fd34ef99 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -356,7 +356,7 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source if (apic_x2apic_mode(source)) { /* 16 bit dest mask, 16 bit cluster id */ - bitmap = dest & 0xFFFF0000; + bitmap = dest & 0xFFFF; cluster = (dest >> 16) << 4; } else if (kvm_lapic_get_reg(source, APIC_DFR) == APIC_DFR_FLAT) { /* 8 bit dest mask*/ From patchwork Fri Jan 6 01:12:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39866 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577079wrt; Thu, 5 Jan 2023 17:16:19 -0800 (PST) X-Google-Smtp-Source: AMrXdXvcGelz5NU+etjvYUIDRHvO8n7uzC3LkcV+t9liBx3aeCBYuJ1pzGj49xKsFjTx37tc9VxL X-Received: by 2002:a17:906:9f12:b0:7c1:61a6:2cd2 with SMTP id fy18-20020a1709069f1200b007c161a62cd2mr45473960ejc.9.1672967779016; Thu, 05 Jan 2023 17:16:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967779; cv=none; d=google.com; s=arc-20160816; b=JVRQPzBFZLB1CrGEG2joytsQxVlHDuyaPcf6F+AqPR5Z37EW8KXXhbPAJwxPlMtJRA K5nTmnsqKl+yEoU0aIvvAHvFU4gnV35yeUAbQ8TW35VJ6VfMYnHAkmBlkmgIsM0N0+9r 5uK0cACCX3Gqx/P4lZHalxvknyxNLxF3x/g58DxYOAdBftSSillneb1tHDbJdmzGAsRv a64DopWUj9UJWqYZ9UzlAaMlii8BuqRqI9NldNSG1TB6PjM9VT+8SlPhAqkbg03hJXIl 03KsjDi3xIItV0I4kK00Q3ho7U+wVmE2sCz4aDH/GP//0WKwmjR94O9pmsBWIjB1wB23 hLKw== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=dY73TyImmD0wCqNL26nvzhCHfX8vBgtKvyMOXbN+v1I=; b=hKPykSB8kTEAR6I20woMAKBWVCgf8NPSGFvvtgQn9nQHf5cZ8TklTFbpohW678UaFM Pm8SuA0wv1VE9/doyb/eXCVrrWLetFIhp19y8Z42SHJIPi+NAEqv8Yy9BUGMB4AJnT1n utawpwvzYB8QIhe4KC9T6dsquqDtENuubXCs8ITKMPTgL1zt2xeWzfXTks4zQs1mq1Cn nQMRPoLEPlWYXkY153gx8I//f9gCk7E80tm+4fDh4fkCxq1PbcuDpFFVY/x+HiLU104p zIPIodmzgsA2/7l5gY5IOjqdTsvbZFbC5LlSB9OWVYUx3+JSMEPKKjuBtQhlKnQnw0YT jd6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=B861zubB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id dd12-20020a1709069b8c00b0082b7e633997si38506012ejc.434.2023.01.05.17.15.54; Thu, 05 Jan 2023 17:16:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=B861zubB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S231667AbjAFBOl (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37506 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236843AbjAFBNk (ORCPT ); Thu, 5 Jan 2023 20:13:40 -0500 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5728A71FF6 for ; Thu, 5 Jan 2023 17:13:38 -0800 (PST) Received: by mail-pj1-x104a.google.com with SMTP id a11-20020a17090a8c0b00b00226cdbf8bbcso1917799pjo.5 for ; Thu, 05 Jan 2023 17:13:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=dY73TyImmD0wCqNL26nvzhCHfX8vBgtKvyMOXbN+v1I=; b=B861zubBIjRS4M7hrE2P/lP1yiAP6O9QSDe8ztqdzZ75i+UmjMLuMJpNqdL1Elk8v/ RAAfOXEHLS8mwZoF3qdVZsbOy4/D5cBa1NaNov3OMq4WhgX+YWKDc18ZxIck79I1eX76 1S9Dd/6XPyWvlMNYGUn+0Bxbfx7NM3Bb8F2MkBes6HJ441yQNZ9yJnSAr6SZrWwUMgF0 F6fMSah5f8GauF6VTpl4lM81mhmTu8PAsbyUeUc8I9prYkJWnHInHrRzbBeahfU3Lci8 NUNUa/xmwowTdGQxAb69BtM7JoxrsfzEZIYUinrzK/gKYn1gTY4gK8xbr8v0C/Ggak2O zMHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=dY73TyImmD0wCqNL26nvzhCHfX8vBgtKvyMOXbN+v1I=; b=XJLGe8j0VLA7j+luMlBPMxbVvHGNFfJMrkhGOhr6c//QGf7j5kk5DiPD3e9rVnqbR3 FJjGEh0XNqvfSO/ClHW3e08PJKlp9WPYSEA55JwgTCEJjCgbuUmTUS+aDR6bx/BNLZMs rPeHnkDV2WzF/N9PkLn/SRoTaky0dZwbxlc99zY4XFLYMFleydeXyjCrhvWNU/F108AD QtRrx8GcfWM6HRma5ZJysflvSyDPjRK/gLt+9nGUbmhTo5uhDyi8aCSOSTlWJXneajuk F4XHOWkFuYRzkKMSYQy2jWONwQJ3qk12dIBbOY4AlHh0U39iQWXvUH9l28e5kYw+7afC eYpg== X-Gm-Message-State: AFqh2kpy2mg463Sl/dVFC8mAoXBiJ0dWxAbE7zW0GrexUaNXjLzWVxT3 lY8xhl2sb0MIvNKd52QBn1xNLCOx2tw= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:aa7:999c:0:b0:582:74a2:1e4e with SMTP id k28-20020aa7999c000000b0058274a21e4emr1235081pfh.26.1672967617919; Thu, 05 Jan 2023 17:13:37 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:47 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-15-seanjc@google.com> Subject: [PATCH v5 14/33] Revert "KVM: SVM: Use target APIC ID to complete x2AVIC IRQs when possible" From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233861743102471?= X-GMAIL-MSGID: =?utf-8?q?1754233861743102471?= Due to a likely mismerge of patches, KVM ended up with a superfluous commit to "enable" AVIC's fast path for x2AVIC mode. Even worse, the superfluous commit has several bugs and creates a nasty local shadow variable. Rather than fix the bugs piece-by-piece[*] to achieve the same end result, revert the patch wholesale. Opportunistically add a comment documenting the x2AVIC dependencies. This reverts commit 8c9e639da435874fb845c4d296ce55664071ea7a. [*] https://lore.kernel.org/all/YxEP7ZBRIuFWhnYJ@google.com Fixes: 8c9e639da435 ("KVM: SVM: Use target APIC ID to complete x2AVIC IRQs when possible") Suggested-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 0f67fd34ef99..e4b5f8b14882 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -378,7 +378,17 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source logid_index = cluster + __ffs(bitmap); - if (!apic_x2apic_mode(source)) { + if (apic_x2apic_mode(source)) { + /* + * For x2APIC, the logical APIC ID is a read-only value + * that is derived from the x2APIC ID, thus the x2APIC + * ID can be found by reversing the calculation (done + * above). Note, bits 31:20 of the x2APIC ID are not + * propagated to the logical ID, but KVM limits the + * x2APIC ID limited to KVM_MAX_VCPU_IDS. + */ + l1_physical_id = logid_index; + } else { u32 *avic_logical_id_table = page_address(kvm_svm->avic_logical_id_table_page); @@ -393,23 +403,6 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source l1_physical_id = logid_entry & AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK; - } else { - /* - * For x2APIC logical mode, cannot leverage the index. - * Instead, calculate physical ID from logical ID in ICRH. - */ - int cluster = (icrh & 0xffff0000) >> 16; - int apic = ffs(icrh & 0xffff) - 1; - - /* - * If the x2APIC logical ID sub-field (i.e. icrh[15:0]) - * contains anything but a single bit, we cannot use the - * fast path, because it is limited to a single vCPU. - */ - if (apic < 0 || icrh != (1 << apic)) - return -EINVAL; - - l1_physical_id = (cluster << 4) + apic; } } From patchwork Fri Jan 6 01:12:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39867 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577094wrt; Thu, 5 Jan 2023 17:16:21 -0800 (PST) X-Google-Smtp-Source: AMrXdXscfq3lmvUIALZxpE6I+mJ9z6rvEl9KYE4cvgV6dQZkd1eOKlIm1+u8aBaHtkpIOgBcmBgb X-Received: by 2002:a05:6402:249a:b0:45c:834b:f287 with SMTP id q26-20020a056402249a00b0045c834bf287mr47016714eda.4.1672967781201; Thu, 05 Jan 2023 17:16:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967781; cv=none; d=google.com; s=arc-20160816; b=RbTgwA+Kc+SNv/kfNNuJp2xXf8gRpEEL7mjdH08zUTsKkpOsCa8SVA7QEpycQbTGq8 wyKc0+FdHcV7dTi6zVdkoKsGYHqAcoFc4NuAvRl1egQ2mSpnE0LB/lQDYOwcGcqXfjZX hC7rVS3aHVXG7EZ7IUq1sFiGk0V0h8FDKEbyZvguBcDbAu9yam5oUy73g9MOQs6LyAiV 1MCF8x1WcO4kQafOlCybDaFT5M8gRfwwS5u+XfbgkMLXI1IajlUTJb58eOkBwwVIQGEw MDRYtTmif+wba6CO4B+YUX1wE5+NaJe/kJg966s3G9/wIkS2aFghdGOT2RKeeG98mhVc 3Y8g== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=+aYaKFD5zMoXFl3Mrpqz5yT+Tj9hEBdwhn1YhcxYDeU=; b=fgc5LopkOgn310HSFcOsk3u4d92x6P84LDxUgZJ0QzHu+zrU4NdmrQk1huo+Kjsxlk KXSCxSd755HT4WYB4CX9D+iCYS+aAs50zjSVyek2TsAIn8lRmxQYfc+zG3VITAkzx3Gb bRMFtl+fvYbXzKazAgyHFNro11pYdD1UZGJQmJgJCxJs25kxv++SaxXqjlB469usxBmg 4IeGF1Owmk8MKROS45BH2cBLuQiE8MU7Iupe+5104wBNQBxB9ZzShckLqSeQ39bRuUV2 Kl4XC6bHovKKbrXwwFm2dKLYzG2aea+PKuajd6365JPUDeBJAd4saPwPdPVY4Wm6Grdw /Neg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=sVrsJnqL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id v1-20020a056402348100b004511d552be3si39128466edc.4.2023.01.05.17.15.57; Thu, 05 Jan 2023 17:16:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=sVrsJnqL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S230477AbjAFBOp (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37594 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236864AbjAFBNl (ORCPT ); Thu, 5 Jan 2023 20:13:41 -0500 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 09CFA72D1A for ; Thu, 5 Jan 2023 17:13:40 -0800 (PST) Received: by mail-pg1-x549.google.com with SMTP id s76-20020a632c4f000000b0049ceb0f185eso209927pgs.7 for ; Thu, 05 Jan 2023 17:13:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=+aYaKFD5zMoXFl3Mrpqz5yT+Tj9hEBdwhn1YhcxYDeU=; b=sVrsJnqLgRkQyST7umHC5BB4qxL1l41vI7qq4E+/x2fYGDtl5AblzcCHBALLb9sRU2 ri/9ceRv5yQOzb3I+MmQ3K1QAJGXYtF1Y4wKvQgdg92ouBF5eFn7dTG1dhyfPIaqfNya TtWAEjejrgGg4APj5FxYfagDJ/CSY7RVZ3U4SuZnL+FCbmpn1Z0CShem1/ETEBsadwyt q2k7WmsXJhirwxtI6qS8NTr7kOKbg63MA7fFnTq0fgXqguYnYjo331l4d5XiadWpW5Ye 8DaMyvexx2ci4k40Bay6fKvVXBqel9Gu10bgBFLXHp4mCFYpcUuvkphUhvN6nqw7lctd sOqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+aYaKFD5zMoXFl3Mrpqz5yT+Tj9hEBdwhn1YhcxYDeU=; b=Nqke4zypgPJpU7Ewvju31NALpKMJVkN2s6PqI76X7LBROo5ZBf1booc3ZDM8PAkVMx VTndwR2ZuqKjRVeefuWk9zYdvKaYM7b8XKZUJZHf1J4I2CTcIFgZ9+Glr3kUCZXasj9g gZOOJnUauvIouCegJFmwajXtK1CJXH41qXfjijYmOuci9eRzEvDORZIFVewI80AwoILE yLaEK+gj/ORcOx1iy9xpjfK7tiRLjVqO0d1nON0TeJPQkdP8SlbKR2UEWoK6y4CryM6m L+s8HBCLgdOh1c3OZx1KIvPsvxLGTdTWv5eM0zJqc9m2CzmRbGyLfj7q+uaMjY68tkyj H68A== X-Gm-Message-State: AFqh2krVkufRW0+BJ/VHjm+cUKrzV0lcPkejp3Vyw2uTA0pVmaNLN6zW c1Paeh3ZOYIgeDjyFLPiIqG5R3D+gUI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a62:1c4d:0:b0:581:1898:93ae with SMTP id c74-20020a621c4d000000b00581189893aemr2945460pfc.51.1672967619557; Thu, 05 Jan 2023 17:13:39 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:48 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-16-seanjc@google.com> Subject: [PATCH v5 15/33] KVM: SVM: Document that vCPU ID == APIC ID in AVIC kick fastpatch From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233864286684883?= X-GMAIL-MSGID: =?utf-8?q?1754233864286684883?= Document that AVIC is inhibited if any vCPU's APIC ID diverges from its vCPU ID, i.e. that there's no need to check for a destination match in the AVIC kick fast path. Opportunistically tweak comments to remove "guest bug", as that suggests KVM is punting on error handling, which is not the case. Targeting a non-existent vCPU or no vCPUs _may_ be a guest software bug, but whether or not it's a guest bug is irrelevant. Such behavior is architecturally legal and thus needs to faithfully emulated by KVM (and it is). Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/svm/avic.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index e4b5f8b14882..eb2ad5b54877 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -368,8 +368,8 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source cluster = (dest >> 4) << 2; } + /* Nothing to do if there are no destinations in the cluster. */ if (unlikely(!bitmap)) - /* guest bug: nobody to send the logical interrupt to */ return 0; if (!is_power_of_2(bitmap)) @@ -397,7 +397,7 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source if (WARN_ON_ONCE(index != logid_index)) return -EINVAL; - /* guest bug: non existing/reserved logical destination */ + /* Nothing to do if the logical destination is invalid. */ if (unlikely(!(logid_entry & AVIC_LOGICAL_ID_ENTRY_VALID_MASK))) return 0; @@ -406,9 +406,13 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source } } + /* + * KVM inhibits AVIC if any vCPU ID diverges from the vCPUs APIC ID, + * i.e. APIC ID == vCPU ID. Once again, nothing to do if the target + * vCPU doesn't exist. + */ target_vcpu = kvm_get_vcpu_by_id(kvm, l1_physical_id); if (unlikely(!target_vcpu)) - /* guest bug: non existing vCPU is a target of this IPI*/ return 0; target_vcpu->arch.apic->irr_pending = true; From patchwork Fri Jan 6 01:12:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39868 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577164wrt; Thu, 5 Jan 2023 17:16:30 -0800 (PST) X-Google-Smtp-Source: AMrXdXvqI+kzFuBEOjCMeoBUOhBUoWvz77DzMjfOyGLCn+DKh9CDejPG0HD3u2fr4+oWKCklhAn8 X-Received: by 2002:a17:907:cb14:b0:849:ea61:511e with SMTP id um20-20020a170907cb1400b00849ea61511emr44758485ejc.44.1672967790638; Thu, 05 Jan 2023 17:16:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967790; cv=none; d=google.com; s=arc-20160816; b=UaFjaM0VvEWZQpZvy50a5U5c0Y/0m667GzPfG3CknGEx6nljCMkSQvopBm6zaCLG6S V+om8OOvJEwlL4nmc22RDGMH+O3ZeChRSNZFDZhy6P2selYg+UqY3D4ZJdFCidh21HnJ Z0f1x7sSHFAKIMkXAq9terXwDV55VBsLZOfEv6X1zxHVW4/uBlIO90AXtQL3GIKSXAxF Gcvxwhog4HNdO4u5MZyaRIaNUgUn0zaL9rE8l+MzSDCVc1b15moI8PnB+Imd18YM/bax rp7ZeDEhBN0ztqbVx+x3GVxd2rY2XnV9t8Tv8gMiMlu+Noj7b3knNb23lDbZchHbfZlA UKNw== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=oP9W5uEc0+NE0fVZ2qt9BCyCXd37G2flkZxHxmfC/SM=; b=qDKsJptgZqFZlgiSpnc+wt7n7tUXaftwmLDbxScGBrhKK3BSJmLV+isGgFwlVh8ZdW kvaaBgiPIPYl2M06f212vRIWpXXNh9ghr8/GNC76RV4hZtG5W7PhR09M9zahyWRc4EkW nrb5iHQ0+eSDwV5T2d5okWfi1Rcf3wsc7xx2g23ezwF6w2tlQZsqCk0xi2dSI0kAgx7u T6vim/dMKtEwrTCJYO8mbedHPoc5q3FHSkHkiz3AvwOGW1xlWA5pU41XZyRHUhxSik35 jmgC1iMzxUWJAGgHZ8eb9CHymAOOUEbTiPQzLtGKUATLZzhPIgmdRhVCU6Yn9bwvshPX Y08g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=lhDl+F1m; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id di15-20020a170906730f00b0082e778818desi38309311ejc.120.2023.01.05.17.16.06; Thu, 05 Jan 2023 17:16:30 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=lhDl+F1m; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S231725AbjAFBOu (ORCPT + 99 others); Thu, 5 Jan 2023 20:14:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37688 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236457AbjAFBNm (ORCPT ); Thu, 5 Jan 2023 20:13:42 -0500 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B9F6B755C0 for ; Thu, 5 Jan 2023 17:13:41 -0800 (PST) Received: by mail-pg1-x54a.google.com with SMTP id a72-20020a63904b000000b00489753edf13so193132pge.21 for ; Thu, 05 Jan 2023 17:13:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=oP9W5uEc0+NE0fVZ2qt9BCyCXd37G2flkZxHxmfC/SM=; b=lhDl+F1m6Gb0QU4uj7oQnM7HxwxTzwFuUmvYMgYeFyh51hje6BROAa43BG6gPCKOQ9 mXg2BNy7HNWgQnFTSvJ76inFBvNiKBUNM0ekR9tSNdfBgbsItS8r2eW55T0KiR1lleuO zsJ9gMXPeJOJK5DofJFUl3QAHW4fOodnMdMud/78Ky9bo0+QlOyU9O3SDaD0baeAJl0Y AzBavAYI+JEMNEG286Nwgd1wgNkre5V0hbGrdGe7ilPJLhohyfPUElcrdiyPGfEy5PHM FHwabkbcnCagvLjwMnmj03+7Yo4DoX9huXkkR2rNhT6nmkfz1ecQ2jnLi4jXTswKTZu7 h6Dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=oP9W5uEc0+NE0fVZ2qt9BCyCXd37G2flkZxHxmfC/SM=; b=K1Z0eM4j96kaKReb1gHwYMMJPoYJUp+M18QymSzO9/DKzx5K1891ZVXiWM8OeKLvi4 tLthWc4gRoqf5oW5J7/aTCxsCGI5wlKBoEqM5Nn2liRejk9zhTRaJFcNviNVxvhdL/Ow ractCGiM47yftZb5Eo1JuS6tLzOGcCnpVRR+9oWGLc4OjCY3Am5vCF4P1AQ/gn2Erquu m4RtO83Ti8aSOYgoQJM2Glf7/9WWd6lbV3Q8PC7NtwT60P+S/41cd0oxvsxj7iEi8T7y D7rZpQ1j31gAXQQARkz1IMrjBuAbM8dGJXci2RlyHkNsIv5xwlQx/GZy4hmgRAflaHT6 XC/g== X-Gm-Message-State: AFqh2koVYtZTG+TU1k+6eppaPFFV7nGNRjyEIGe6RLtI3TEBBENBiVjP 7iYOAmiA9yCaHqHpr8NCt0vUbUqo1vU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:a98a:b0:189:bf5d:c968 with SMTP id bh10-20020a170902a98a00b00189bf5dc968mr2459776plb.118.1672967621397; Thu, 05 Jan 2023 17:13:41 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:49 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-17-seanjc@google.com> Subject: [PATCH v5 16/33] KVM: SVM: Add helper to perform final AVIC "kick" of single vCPU From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233874168603064?= X-GMAIL-MSGID: =?utf-8?q?1754233874168603064?= Add a helper to perform the final kick, two instances of the ICR decoding is one too many. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/svm/avic.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index eb2ad5b54877..76da9f19272e 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -317,6 +317,16 @@ void avic_ring_doorbell(struct kvm_vcpu *vcpu) put_cpu(); } + +static void avic_kick_vcpu(struct kvm_vcpu *vcpu, u32 icrl) +{ + vcpu->arch.apic->irr_pending = true; + svm_complete_interrupt_delivery(vcpu, + icrl & APIC_MODE_MASK, + icrl & APIC_INT_LEVELTRIG, + icrl & APIC_VECTOR_MASK); +} + /* * A fast-path version of avic_kick_target_vcpus(), which attempts to match * destination APIC ID to vCPU without looping through all vCPUs. @@ -415,11 +425,7 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source if (unlikely(!target_vcpu)) return 0; - target_vcpu->arch.apic->irr_pending = true; - svm_complete_interrupt_delivery(target_vcpu, - icrl & APIC_MODE_MASK, - icrl & APIC_INT_LEVELTRIG, - icrl & APIC_VECTOR_MASK); + avic_kick_vcpu(target_vcpu, icrl); return 0; } @@ -443,13 +449,8 @@ static void avic_kick_target_vcpus(struct kvm *kvm, struct kvm_lapic *source, */ kvm_for_each_vcpu(i, vcpu, kvm) { if (kvm_apic_match_dest(vcpu, source, icrl & APIC_SHORT_MASK, - dest, icrl & APIC_DEST_MASK)) { - vcpu->arch.apic->irr_pending = true; - svm_complete_interrupt_delivery(vcpu, - icrl & APIC_MODE_MASK, - icrl & APIC_INT_LEVELTRIG, - icrl & APIC_VECTOR_MASK); - } + dest, icrl & APIC_DEST_MASK)) + avic_kick_vcpu(vcpu, icrl); } } From patchwork Fri Jan 6 01:12:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39871 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577281wrt; Thu, 5 Jan 2023 17:16:51 -0800 (PST) X-Google-Smtp-Source: AMrXdXvDug7rQakB5Ied7bV2UMatHVG7Yn8Cc1dJYfh7QQEwgrSs4iC3DKsTejvvYuTaHB7P9Yi/ X-Received: by 2002:a05:6402:e09:b0:479:3ffb:9243 with SMTP id h9-20020a0564020e0900b004793ffb9243mr47995547edh.25.1672967811505; Thu, 05 Jan 2023 17:16:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967811; cv=none; d=google.com; s=arc-20160816; b=z0eOM8bfTlknhBVenM/LEAz4jNUTsdMtTqt2UhoVtT2uc35lYvx0LfD7TLq0TVUvhI wDxLB0OWtXfPcx7Q+iyQUun00O9bUZPfGsdL7ebBipGgEEnlZFc+U6cV/mLzJ0CXPPQ8 fNTH5C5M3dzPVFERNsPpq7cYAx5FaUoja5V8uJMCBtjcIQNQDFeQSBjAWRVrIAVl/jiY DMwtsF/VshgckipMF9+cU7d4P8c/TWAQoqbt2XCgxBigfDp1mJeAFoRiefSLAnP3cbsT zjGj4qxwYocOgrPCpkyPqMlcbWLb/YRiqZkEL5ASjtV/cS/79/dGp+8zgsCLLjIS0Yps 0jcg== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=32VPrBOq73WvzaefBtIggxIbeFo+/Cphxagan15DZtk=; b=zajloQDEYx5wJ6S6cgjf+hOTSZPG+t1UdNAssvYBNKRmhd8lY8Shsgz/plVwdgqLc5 BMeOhfIqpT8PMk3pkUPW8jmDhM2HTrSKVzp6d2LxtfH6uBXYs7zZVtcAZWAlmqWejEmU c/S5ocGveXykm82AchtMJPL+asY/jq8F8l8iqqb8wf9+nSrk1o1PSoq/7XmHgpRUOLfp v2QT2Wtxz+jBhvvYIg1Eioeee+wbau5ynFMqDOoOU1zBF/pBJ8RB9hD3bgHayDSjg/Gl kKT+yGCBvfAxHDp+dfF+d8Bc2kGKGR7oZQv/9C+zWdf84aIkSyB+z3RFDHW7OzW75CRK kFrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=jd8smTqk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id q14-20020a056402248e00b004859d0f61e0si26089241eda.380.2023.01.05.17.16.28; Thu, 05 Jan 2023 17:16:51 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=jd8smTqk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S231788AbjAFBPO (ORCPT + 99 others); Thu, 5 Jan 2023 20:15:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37856 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236904AbjAFBNq (ORCPT ); Thu, 5 Jan 2023 20:13:46 -0500 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D2A2755ED for ; Thu, 5 Jan 2023 17:13:43 -0800 (PST) Received: by mail-pf1-x449.google.com with SMTP id b197-20020a621bce000000b00581b15e98cdso52507pfb.8 for ; Thu, 05 Jan 2023 17:13:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=32VPrBOq73WvzaefBtIggxIbeFo+/Cphxagan15DZtk=; b=jd8smTqkN0IDXl0EXdgRXlAJ/OS3kl8MhbTYhzhDohUUGbZZl5lSPukmE+oBw3lj7z PxNhmSnmJVnRb6FSuglJuxUQTCkRHNOz5eq5KcA1W7oKV68H5fHcnolhQXk+fddFJ1Hd hbZici3wfOyM0UW98R0ko2SBRyhhQmDianmMPJx0070qaH81nLGCKtLl7bEKABvmi7aO QK4wuHY0UZazpgqwD++59W+5Kg31nQ5tD4f08Ij0GC45cK5kBY4EZHIu8FdH2MMpLI6V PITyVaUx5b0jz2DOJdrcwYTr1ajr0cdExOuhyfistWyms77xsn9VyfX02NLrkyFryM/h oyQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=32VPrBOq73WvzaefBtIggxIbeFo+/Cphxagan15DZtk=; b=sbgCPVqrR1TwJGD9DuWVTtQcelEoPmyvfkY1UFoqaUfoZSUAgwH7uF4hP5BQwZXpQj NwYWfJQsKu9l84mwarO50gQWEKySwzfD906nvuN7P/bUenLj313Rfq9ESqZje1vz7v3R nLnqTchANu8S/BkqaHSi4GflnUdqMGZABLTzhxvf3l8uy40Ol6KYa1E4IIFBWpVtgoVy goaiVxFUHX0F0P4NPwatqDKHm2tlgK7NxVuXkgRbwu/PpvDtXgQEIGEsErGWZPSvjo3y 6x6L8/KvcSGCwNp715fka98jCEC4IIAQJRu2OsP+hStUx7JXs5/6l/mm7rxLXfZuzCEu 1XJA== X-Gm-Message-State: AFqh2kr3wQXKTXaSmyCUj8c9+c4+jjXowVvHGKwxwVcZkPgQKVS1xM5T BGZxMnhSHs6SRnazo3gVoYLRexOzLlU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a62:ee05:0:b0:581:c732:2b60 with SMTP id e5-20020a62ee05000000b00581c7322b60mr1822093pfi.25.1672967622912; Thu, 05 Jan 2023 17:13:42 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:50 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-18-seanjc@google.com> Subject: [PATCH v5 17/33] KVM: x86: Explicitly skip optimized logical map setup if vCPU's LDR==0 From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233895499689221?= X-GMAIL-MSGID: =?utf-8?q?1754233895499689221?= Explicitly skip the optimized map setup if the vCPU's LDR is '0', i.e. if the vCPU will never respond to logical mode interrupts. KVM already skips setup in this case, but relies on kvm_apic_map_get_logical_dest() to generate mask==0. KVM still needs the mask=0 check as a non-zero LDR can yield mask==0 depending on the mode, but explicitly handling the LDR will make it simpler to clean up the logical mode tracking in the future. No functional change intended. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 355ea688df4a..2aee712e42bb 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -286,10 +286,12 @@ void kvm_recalculate_apic_map(struct kvm *kvm) continue; ldr = kvm_lapic_get_reg(apic, APIC_LDR); + if (!ldr) + continue; if (apic_x2apic_mode(apic)) { new->mode |= KVM_APIC_MODE_X2APIC; - } else if (ldr) { + } else { ldr = GET_APIC_LOGICAL_ID(ldr); if (kvm_lapic_get_reg(apic, APIC_DFR) == APIC_DFR_FLAT) new->mode |= KVM_APIC_MODE_XAPIC_FLAT; From patchwork Fri Jan 6 01:12:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39873 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577393wrt; Thu, 5 Jan 2023 17:17:06 -0800 (PST) X-Google-Smtp-Source: AMrXdXuIMXDnK/UbLkvdpy8d3pHWwztRzanHmpl0AN9hQX9eSCtAva/UIB19tukfvsFQCtoIP7AN X-Received: by 2002:a17:906:1e17:b0:84c:69f8:2ec2 with SMTP id g23-20020a1709061e1700b0084c69f82ec2mr28894183ejj.22.1672967826451; Thu, 05 Jan 2023 17:17:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967826; cv=none; d=google.com; s=arc-20160816; b=JX+yj/hSFR9wNeZ7JeXrg8PPvImjCwWAPVUpPZPv9ByRerdc4UwPlNi8nMhQ7kGJaC PFRQ2f93CO+V58b1cpRqhSbLsOdoV6/oBRFe3GlGCOVDlCXYnKfmv3DSuaZJAP2dsWgC C88iymLEUhgQWJ1dx038T8VKsNoa4+1/GCgeS/7rsTWn320r/X0ruHRyxmW6imVBBtmj jVJXRRCHRhGqXg08rLzIWeQ0mwnrzJciogS7zl9bT8KO4xVbV5xKI0woaGJ+bTkJqmgV pF02FERDECM+8hcy77lsxgxp/qNjyFuYCmIx/f250zVzNE9ghJ3wMYWEOYIpcA9sWYrW T40A== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=MIpLae0T5AbCbYssh6yL+LWrf7kA0VhnIInAr1jWLwo=; b=VfhdczKvM1HylKdWRjhV+N7ln4ihxKfbk7diFs4R0W7Ta4BWDWCS634YRYD5cYebqK DpnObvaU2OOpzrrlfYnlDYEaY8PqS0TzfLXPpkwh48p0vwOlOKN6X3fNP30d8cFe00Bp d+wMqBmby1G7b7+pBhL8NpQU9AXArc4Ir9ABlXyssOWSlB1z9mq/0eb8jcdvJLtpW0RR 44gEetkjP2csQ+39EvVrIOnSmFiQFGrV8nq49zSY+d/veHcdtJ5YpFpTASrWNrjuP/p1 mRd0BHfVf9yuArVzsC+As4tlrxDRbA4bUDtOz1R5+L8+30+EX/H2T/OfiBHmHUdpto5w Qqew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="HMV/ef6O"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id hg6-20020a1709072cc600b007abafd4d7d0si34880798ejc.702.2023.01.05.17.16.42; Thu, 05 Jan 2023 17:17:06 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="HMV/ef6O"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S229816AbjAFBP1 (ORCPT + 99 others); Thu, 5 Jan 2023 20:15:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231977AbjAFBOu (ORCPT ); Thu, 5 Jan 2023 20:14:50 -0500 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6607178158 for ; Thu, 5 Jan 2023 17:13:45 -0800 (PST) Received: by mail-pg1-x54a.google.com with SMTP id 84-20020a630257000000b00477f88d334eso206165pgc.11 for ; Thu, 05 Jan 2023 17:13:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=MIpLae0T5AbCbYssh6yL+LWrf7kA0VhnIInAr1jWLwo=; b=HMV/ef6O14LeBA3Jy7RqRsvThrAAzkTKxDiHiaZ9sAkaBr0ro37oTgiEwA/2yxIKft fHqxeCDK+EmfSK/sNshmtOqXfhoHeJAyZxIFhJaAJBYw9pgZzd1DP/0HMCLppyGxMSOW F4wU1IlrC056jJXzE72fMZnJhq4j8jfx6vhBXaYIXY4Y8y2/o9nXuJOg4xdbWcjEjNCg +lcCaA6l7jWboOVXvSIeQc2judfhqwsz6MKx3CEwaPmxxGHoWYkloKqro27ynw+3mcqZ 5P3/uyqw4Yx/HSxK4+ir/2D+TsDg6sA0c4D+JJlYT97htW+lehezmeQLRFwuSwfoHyMb HpuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=MIpLae0T5AbCbYssh6yL+LWrf7kA0VhnIInAr1jWLwo=; b=6y9Ir0W0v0XDVLHynRg5Ka36kjmToolCx802bZkZLBCVVKOfCCWdGHqY1xUAp1sxRT VV6jRJsbaBh/egkf9kJtJ1DwD1CKSiU+6YEfKXgMVneAl0Mnxlf4gilSrENVW1WhRowr z/HCsfMoLg3+Cl4/i0Wr8uRBvxg/XM5emTN5JgjWwMa6x3AO7aY/ZwawK5Mfaewq1XyY U46/oZ/fw47b9F3OJKPvu73h6sgpmuDJVpuONbxAM8uJqz+n1k1Y8zBHwPC1OxOt4Mb1 M6+/Z1cR6+/WL+/YiN//oivYaiEUiknt1/jOsres2FS2JMhdMkAs6tF0Cb8Eyd4ppvTj 5D3w== X-Gm-Message-State: AFqh2kreR87vE32ezkmF3JulUX3kGqWKyryuoUhtKvYrwaarDCxw2DGJ neQh1EkuhxNyOAQfqmPcHSt+9RZLOEU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:e482:b0:186:5a0c:85a2 with SMTP id i2-20020a170902e48200b001865a0c85a2mr2799022ple.79.1672967624670; Thu, 05 Jan 2023 17:13:44 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:51 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-19-seanjc@google.com> Subject: [PATCH v5 18/33] KVM: x86: Explicitly track all possibilities for APIC map's logical modes From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233911372068107?= X-GMAIL-MSGID: =?utf-8?q?1754233911372068107?= Track all possibilities for the optimized APIC map's logical modes instead of overloading the pseudo-bitmap and treating any "unknown" value as "invalid". As documented by the now-stale comment above the mode values, the values did have meaning when the optimized map was originally added. That dependent logical was removed by commit e45115b62f9a ("KVM: x86: use physical LAPIC array for logical x2APIC"), but the obfuscated behavior and its comment were left behind. Opportunistically rename "mode" to "logical_mode", partly to make it clear that the "disabled" case applies only to the logical map, but also to prove that there is no lurking code that expects "mode" to be a bitmap. Functionally, this is a glorified nop. Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/include/asm/kvm_host.h | 29 ++++++++++++++++-------- arch/x86/kvm/lapic.c | 40 ++++++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 1d92c148e799..732421a0ad02 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1022,19 +1022,30 @@ struct kvm_arch_memory_slot { }; /* - * We use as the mode the number of bits allocated in the LDR for the - * logical processor ID. It happens that these are all powers of two. - * This makes it is very easy to detect cases where the APICs are - * configured for multiple modes; in that case, we cannot use the map and - * hence cannot use kvm_irq_delivery_to_apic_fast either. + * Track the mode of the optimized logical map, as the rules for decoding the + * destination vary per mode. Enabling the optimized logical map requires all + * software-enabled local APIs to be in the same mode, each addressable APIC to + * be mapped to only one MDA, and each MDA to map to at most one APIC. */ -#define KVM_APIC_MODE_XAPIC_CLUSTER 4 -#define KVM_APIC_MODE_XAPIC_FLAT 8 -#define KVM_APIC_MODE_X2APIC 16 +enum kvm_apic_logical_mode { + /* All local APICs are software disabled. */ + KVM_APIC_MODE_SW_DISABLED, + /* All software enabled local APICs in xAPIC cluster addressing mode. */ + KVM_APIC_MODE_XAPIC_CLUSTER, + /* All software enabled local APICs in xAPIC flat addressing mode. */ + KVM_APIC_MODE_XAPIC_FLAT, + /* All software enabled local APICs in x2APIC mode. */ + KVM_APIC_MODE_X2APIC, + /* + * Optimized map disabled, e.g. not all local APICs in the same logical + * mode, same logical ID assigned to multiple APICs, etc. + */ + KVM_APIC_MODE_MAP_DISABLED, +}; struct kvm_apic_map { struct rcu_head rcu; - u8 mode; + enum kvm_apic_logical_mode logical_mode; u32 max_apic_id; union { struct kvm_lapic *xapic_flat_map[8]; diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 2aee712e42bb..2567998b692c 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -168,7 +168,12 @@ static bool kvm_use_posted_timer_interrupt(struct kvm_vcpu *vcpu) 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) { + switch (map->logical_mode) { + case KVM_APIC_MODE_SW_DISABLED: + /* Arbitrarily use the flat map so that @cluster isn't NULL. */ + *cluster = map->xapic_flat_map; + *mask = 0; + return true; case KVM_APIC_MODE_X2APIC: { u32 offset = (dest_id >> 16) * 16; u32 max_apic_id = map->max_apic_id; @@ -193,8 +198,10 @@ static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map, *cluster = map->xapic_cluster_map[(dest_id >> 4) & 0xf]; *mask = dest_id & 0xf; return true; + case KVM_APIC_MODE_MAP_DISABLED: + return false; default: - /* Not optimized. */ + WARN_ON_ONCE(1); return false; } } @@ -256,10 +263,12 @@ void kvm_recalculate_apic_map(struct kvm *kvm) goto out; new->max_apic_id = max_id; + new->logical_mode = KVM_APIC_MODE_SW_DISABLED; kvm_for_each_vcpu(i, vcpu, kvm) { struct kvm_lapic *apic = vcpu->arch.apic; struct kvm_lapic **cluster; + enum kvm_apic_logical_mode logical_mode; u16 mask; u32 ldr; u8 xapic_id; @@ -282,7 +291,8 @@ void kvm_recalculate_apic_map(struct kvm *kvm) if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id]) new->phys_map[xapic_id] = apic; - if (!kvm_apic_sw_enabled(apic)) + if (new->logical_mode == KVM_APIC_MODE_MAP_DISABLED || + !kvm_apic_sw_enabled(apic)) continue; ldr = kvm_lapic_get_reg(apic, APIC_LDR); @@ -290,17 +300,31 @@ void kvm_recalculate_apic_map(struct kvm *kvm) continue; if (apic_x2apic_mode(apic)) { - new->mode |= KVM_APIC_MODE_X2APIC; + logical_mode = KVM_APIC_MODE_X2APIC; } else { ldr = GET_APIC_LOGICAL_ID(ldr); if (kvm_lapic_get_reg(apic, APIC_DFR) == APIC_DFR_FLAT) - new->mode |= KVM_APIC_MODE_XAPIC_FLAT; + logical_mode = KVM_APIC_MODE_XAPIC_FLAT; else - new->mode |= KVM_APIC_MODE_XAPIC_CLUSTER; + logical_mode = KVM_APIC_MODE_XAPIC_CLUSTER; } - if (!kvm_apic_map_get_logical_dest(new, ldr, &cluster, &mask)) + /* + * To optimize logical mode delivery, all software-enabled APICs must + * be configured for the same mode. + */ + if (new->logical_mode == KVM_APIC_MODE_SW_DISABLED) { + new->logical_mode = logical_mode; + } else if (new->logical_mode != logical_mode) { + new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; continue; + } + + if (WARN_ON_ONCE(!kvm_apic_map_get_logical_dest(new, ldr, + &cluster, &mask))) { + new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; + continue; + } if (mask) cluster[ffs(mask) - 1] = apic; @@ -953,7 +977,7 @@ static bool kvm_apic_is_broadcast_dest(struct kvm *kvm, struct kvm_lapic **src, { if (kvm->arch.x2apic_broadcast_quirk_disabled) { if ((irq->dest_id == APIC_BROADCAST && - map->mode != KVM_APIC_MODE_X2APIC)) + map->logical_mode != KVM_APIC_MODE_X2APIC)) return true; if (irq->dest_id == X2APIC_BROADCAST) return true; From patchwork Fri Jan 6 01:12:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39875 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577512wrt; Thu, 5 Jan 2023 17:17:33 -0800 (PST) X-Google-Smtp-Source: AMrXdXs2TBN509AKHRMGgo2ukrlGScbRux5263ooxfYgBD9egSUCIVcxNmxBNGp2VHdSI9CleVWn X-Received: by 2002:a17:906:6b97:b0:805:1e6e:6777 with SMTP id l23-20020a1709066b9700b008051e6e6777mr50205407ejr.23.1672967853106; Thu, 05 Jan 2023 17:17:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967853; cv=none; d=google.com; s=arc-20160816; b=E0Rsad413HLQXKHimPb+zkvGjtaMKB7hEAy9Yro+4CXVa8g0ze2nBi3ysASNN0+uv9 6Og6qI0UDYhisjGfL1YCJgVZGc3MN5ARxZNZ8ELEg3w9ziruDiIcZzGo5ZqpimkBATXR PUEsUQwxvhlOAYZabjO+Yf21QAlVzjL+XvzIucujufO1RC8KIs/ghGgYlvS/atHRwxk7 +KIjuW7+atGbgYYR7ddTh6Gwj2cEPATqzX7jdpfITGQFtqCPZfwKbzXyxa4YdYgtM72R rYKqozyEFE1A8EE+Y/fyJ1kgOfasqXDB5ggx9nQEoEzxG/ZvdmX268g1GDKYPn3gcRh6 RNtQ== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=6hlceM30Jbe/aO6Zo5aK3/yVy9oHh4ItTVnXmjKPlGU=; b=tqqQ5mQwanc6eRVWE0zHgOFS3NHqxX38RvYbeI2bWAP4Znr5u4KB87ZwspCcxFPEvS H48jMTA/iVV8KMv8cjOGtXPBeqUXkQ9ziG6LnKKnNCxbXlZld0SkIzspkCEQYNImJt4q crLdXwVuM+9RXAjKNbHOwk158W5FV8QcZIA9P1AtwsZHqiXV0a4rZlBgF7ret+6ycmVA eJsH80NmXQoWIzCjVsEPu5Rs3FSiEbdxfyjghvt9JvPPdNbH0ukxTfB48Pq+oKfXX7gm JeFHVjhzWUTJtD4WQQce3TDZz7fqMubUq+oeVWtilw+NLIuYZo8SRoSsyoZ8O2DNRn1a +CWg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=DcPb1qUm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qf36-20020a1709077f2400b0084d197a89e7si1047826ejc.806.2023.01.05.17.17.06; Thu, 05 Jan 2023 17:17:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=DcPb1qUm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S232251AbjAFBP6 (ORCPT + 99 others); Thu, 5 Jan 2023 20:15:58 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38846 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232489AbjAFBPQ (ORCPT ); Thu, 5 Jan 2023 20:15:16 -0500 Received: from mail-pj1-x1049.google.com (mail-pj1-x1049.google.com [IPv6:2607:f8b0:4864:20::1049]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C93DB32245 for ; Thu, 5 Jan 2023 17:13:52 -0800 (PST) Received: by mail-pj1-x1049.google.com with SMTP id h14-20020a17090adb8e00b002264c50f36aso44900pjv.4 for ; Thu, 05 Jan 2023 17:13:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=6hlceM30Jbe/aO6Zo5aK3/yVy9oHh4ItTVnXmjKPlGU=; b=DcPb1qUmg7YoNAiRnrOTms0+X2InGNfOnaIJCUywCz0TjNATymUn0rZht9kPh1bYoy x/0b6nsj0j5zWG9+87qJ8O3dw7Ng+4VU7nw79ltSWrfsa4ykz+gZvepfAWFi6/Gq+x+j 2vaMZW4QDtV7w9AWz3y8QOBUISI41CXh8om3PjOBKC5y4b3nhif0kTHzsczzIQs/BEU1 QIlkfaEbAYJ7y+h9iONXkUhYExHOruVjj+fgVVfDZYJ00AUV16JtavxUTNBzsjKoEe1S yzDEWgFMLeddHqAK3R7IwL8VHrb6wVwlyo5f2wkZyuxPJaPEB5unpB/ic0NyE+doq2/p qD/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=6hlceM30Jbe/aO6Zo5aK3/yVy9oHh4ItTVnXmjKPlGU=; b=nfm2aHdSC03BwysUkexb4xBQs8g9F+cCX3pN/PdNTxHxECOUa4Rhnx9HUrdzO9dI/g w9N47t1wvSB0vi3hbj49ow1ikk3On4l+3G3JSpikW7piJg60g7kv0XTeJEfgO0axqc9Z +jgjceHxW1y8oQLX0Dm1dmOow9XGTbJp0PgFwiJkjs5vf6arBbOg6VG0SzJzweFkHFDo 0TB85pm3+BTLIHuiuy/cUi7ZmoipZ4XuWPNAVUEmXbBe2loG5elJfKeEPwbL0gKTc+3P sTSIr9UDUs6XMJKaYsWYtmwTHZTfcj0QjGWk7btRLzNsj4GCgMyesqfsBms7IqdiUV66 EhHQ== X-Gm-Message-State: AFqh2kr1l4k8WvClJDXjbMNLDznLOequxl1nISev0KGWkCD0szHNvEvy PN0arW0dTnCNMWzWQeMHf/PM+5Q1EBg= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a62:1584:0:b0:581:1083:2cc5 with SMTP id 126-20020a621584000000b0058110832cc5mr2680623pfv.14.1672967626186; Thu, 05 Jan 2023 17:13:46 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:52 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-20-seanjc@google.com> Subject: [PATCH v5 19/33] KVM: x86: Skip redundant x2APIC logical mode optimized cluster setup From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233939503839957?= X-GMAIL-MSGID: =?utf-8?q?1754233939503839957?= Skip the optimized cluster[] setup for x2APIC logical mode, as KVM reuses the optimized map's phys_map[] and doesn't actually need to insert the target apic into the cluster[]. The LDR is derived from the x2APIC ID, and both are read-only in KVM, thus the vCPU's cluster[ldr] is guaranteed to be the same entry as the vCPU's phys_map[x2apic_id] entry. Skipping the unnecessary setup will allow a future fix for aliased xAPIC logical IDs to simply require that cluster[ldr] is non-NULL, i.e. won't have to special case x2APIC. Alternatively, the future check could allow "cluster[ldr] == apic", but that ends up being terribly confusing because cluster[ldr] is only set at the very end, i.e. it's only possible due to x2APIC's shenanigans. Another alternative would be to send x2APIC down a separate path _after_ the calculation and then assert that all of the above, but the resulting code is rather messy, and it's arguably unnecessary since asserting that the actual LDR matches the expected LDR means that simply testing that interrupts are delivered correctly provides the same guarantees. Reported-by: Suravee Suthikulpanit Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/lapic.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 2567998b692c..fd7726ff95c6 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -166,6 +166,11 @@ static bool kvm_use_posted_timer_interrupt(struct kvm_vcpu *vcpu) return kvm_can_post_timer_interrupt(vcpu) && vcpu->mode == IN_GUEST_MODE; } +static inline u32 kvm_apic_calc_x2apic_ldr(u32 id) +{ + return ((id >> 4) << 16) | (1 << (id & 0xf)); +} + 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->logical_mode) { @@ -320,6 +325,18 @@ void kvm_recalculate_apic_map(struct kvm *kvm) continue; } + /* + * In x2APIC mode, the LDR is read-only and derived directly + * from the x2APIC ID, thus is guaranteed to be addressable. + * KVM reuses kvm_apic_map.phys_map to optimize logical mode + * x2APIC interrupts by reversing the LDR calculation to get + * cluster of APICs, i.e. no additional work is required. + */ + if (apic_x2apic_mode(apic)) { + WARN_ON_ONCE(ldr != kvm_apic_calc_x2apic_ldr(x2apic_id)); + continue; + } + if (WARN_ON_ONCE(!kvm_apic_map_get_logical_dest(new, ldr, &cluster, &mask))) { new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; @@ -386,11 +403,6 @@ static inline void kvm_apic_set_dfr(struct kvm_lapic *apic, u32 val) atomic_set_release(&apic->vcpu->kvm->arch.apic_map_dirty, DIRTY); } -static inline u32 kvm_apic_calc_x2apic_ldr(u32 id) -{ - return ((id >> 4) << 16) | (1 << (id & 0xf)); -} - static inline void kvm_apic_set_x2apic_id(struct kvm_lapic *apic, u32 id) { u32 ldr = kvm_apic_calc_x2apic_ldr(id); From patchwork Fri Jan 6 01:12:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39876 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577520wrt; Thu, 5 Jan 2023 17:17:34 -0800 (PST) X-Google-Smtp-Source: AMrXdXte4vF/jyWjjdmgi2CrjpwoCF+2w68UvNTUl9NUmVvRPFyv80ySQVO6c9RGfORkVuDNxfy1 X-Received: by 2002:a17:907:1710:b0:7c0:c36d:f5df with SMTP id le16-20020a170907171000b007c0c36df5dfmr57686494ejc.70.1672967854058; Thu, 05 Jan 2023 17:17:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967854; cv=none; d=google.com; s=arc-20160816; b=sard0VUL9UIXBrCZaCI5z4kFeUmvuIl64yBypGw57oF1/kQZDIkFOaxiUtIQIei6lX 5E1uSMizdrTRtwQFEKfYLJuIsvSXNVlgDWVQIPmqiYnTi4zklUhhqxFo7fwHS9ybc+4D NkjERS/UGqdbB+natFFK0rfqZDm93QvL0Sb9BdjWhjFKAlhkfFs8pPXAEuhDErnvjVMx I+iZfwWtEwFqRryKvfstuH23mKEKLyJXEx5LCCDAiEfkxknavzBrTwspkbMMaij3DV1X fcDrsdLPXOnNGjNEhM3MRn5v81RwMGmMrEhhXd5dXpCwtplmP2cRbEDKVr2sgFEPnVTP 8lQA== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=+A51GFnbIGYLOWeoxnDIO9I82OkrlDigpTJkMvBwJMw=; b=0uFM9I2JgHCjMM4j/OVYx4lKvF+3nA2XA1opjTnHZ/O6Hxt7anKCAYxu16KxXDl/aA gVv0Lc97Z8bMbIjeJ7hZyxTFmkKlcn3zIkT3UeeXLXOg8N0sVYyXd376GehGDT+6oHK6 zMsHiII5THyS2t97HBQIiJH4O3x0T+/S3XL9c5Bc/+YJtCksvIyarziTqP4HAwyZwfvL cffqjkmXI3WSLmaMPi8tKpJfz2O0wbGibrimhLthbEa3dnHMB0Ea1PPNyyW60I/76am7 F2MJtjrhhT+pXltra/N+32KpYh464Aet4KrJ1SzDsNKxSxRfnaPU0y17c9ail/2dyL/+ SMrg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=F8yzvupP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id gl1-20020a1709073c8100b0084cb68cc95esi17235923ejc.855.2023.01.05.17.17.08; Thu, 05 Jan 2023 17:17:34 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=F8yzvupP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S232452AbjAFBQP (ORCPT + 99 others); Thu, 5 Jan 2023 20:16:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231561AbjAFBPg (ORCPT ); Thu, 5 Jan 2023 20:15:36 -0500 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0FC9F3227D for ; Thu, 5 Jan 2023 17:14:03 -0800 (PST) Received: by mail-pl1-x64a.google.com with SMTP id j18-20020a170902da9200b00189b3b16addso97691plx.23 for ; Thu, 05 Jan 2023 17:14:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=+A51GFnbIGYLOWeoxnDIO9I82OkrlDigpTJkMvBwJMw=; b=F8yzvupPXsGW06DH+1jZGD+zuxJ+ciFFDXXj42wqvm5h/vD4rhWkB30ytSbi5IxBuA Q5xYNnENse/uvcUlUomuo7rHIYID/0orsR2GikNSViLFaGeDyOT+YXUA6lCTMd22/TEh aI3kr97jkgXyYnUf4ENzElIjb1HTY47wtaolr+BE6/YVwz1ssR3YJf4tpjzZ3nVYqzMY ZnhnbxON18+UcKHIAdr2Cljg4XsGGn9t9JwVHz2zt8nMQ5p+aGq4LDXRs9h5/BhafCxC FGAk9Wc0ZmsylkByffi09PfVC11igMnAmYKf47AhvnSHzgj81CSlQ/MCY0a9Im14Ntm5 vS8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+A51GFnbIGYLOWeoxnDIO9I82OkrlDigpTJkMvBwJMw=; b=FLqfTxCUDuRqQxt013VPfPTDqeajE8ep6hltxOHTAHOHm6SBOQqLDDu0hey33qCFEd 3/iYRkaH/QkiQGlKZr3rAiERv/YEdqjhSjY64FTMFmwu2j6hL4HQUN2ji2dJnlK+EUr5 RmlA06yeHZZBro3nWT/SdzA9x7sZ+aXqi++pweouJC7D18t24hFcgSdYo2nOukKIzWvs ohryWhE4p+h7w+r6z4jPe/AN0DQUDpPKkWYnZsMHfrCy7HKU8qZcZnKcnFSbMruUZYno VEIik/uDyM3XDf4/To4e155JM1mZCQnM3TgikCn0661hZ1aAICwtKzcUUh7kEO/ZEv82 NOIQ== X-Gm-Message-State: AFqh2kpfc6LMMwQh2rWpteNMF92w4kV7yDqqJEbymBHJpcB4gGE9suSC NDBZaqjmf/xaORMXtNhvYwhC338braI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90b:46d8:b0:226:6523:7849 with SMTP id jx24-20020a17090b46d800b0022665237849mr1263637pjb.66.1672967627955; Thu, 05 Jan 2023 17:13:47 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:53 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-21-seanjc@google.com> Subject: [PATCH v5 20/33] KVM: x86: Disable APIC logical map if logical ID covers multiple MDAs From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233940384338860?= X-GMAIL-MSGID: =?utf-8?q?1754233940384338860?= Disable the optimized APIC logical map if a logical ID covers multiple MDAs, i.e. if a vCPU has multiple bits set in its ID. In logical mode, events match if "ID & MDA != 0", i.e. creating an entry for only the first bit can cause interrupts to be missed. Note, creating an entry for every bit is also wrong as KVM would generate IPIs for every matching bit. It would be possible to teach KVM to play nice with this edge case, but it is very much an edge case and probably not used in any real world OS, i.e. it's not worth optimizing. Fixes: 1e08ec4a130e ("KVM: optimize apic interrupt delivery") Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/lapic.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index fd7726ff95c6..dca87bb6dd1a 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -343,8 +343,14 @@ void kvm_recalculate_apic_map(struct kvm *kvm) continue; } - if (mask) - cluster[ffs(mask) - 1] = apic; + if (!mask) + continue; + + if (!is_power_of_2(mask)) { + new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; + continue; + } + cluster[ffs(mask) - 1] = apic; } out: old = rcu_dereference_protected(kvm->arch.apic_map, From patchwork Fri Jan 6 01:12:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39877 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577583wrt; Thu, 5 Jan 2023 17:17:45 -0800 (PST) X-Google-Smtp-Source: AMrXdXtg3HHqlEmJXEydeCbmGfSM4VzwYpbwNWuN2ahjEkTxxkVsofI+1mnuzTMSmITLYGuTm23a X-Received: by 2002:a17:907:a782:b0:7c1:6430:e5d0 with SMTP id vx2-20020a170907a78200b007c16430e5d0mr47313931ejc.4.1672967865593; Thu, 05 Jan 2023 17:17:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967865; cv=none; d=google.com; s=arc-20160816; b=N3hAwpVRY/hRTn8EHM449hUZqWFxsI1Gt/T2GkgIO1yZV3BV1x5RQU3PZ8r9hhwbMf kQhoh6U3Fe+nHoTrWe2xHCR5ybL4AcbqVRWmxhhvbmMitc7aDZOCS9VDAxbWHTMWjPqx SfpF9cZWAEkN1pMtbJcZyb9IMbZ7utVL1KigtcmGGNdHf/Xcz+wV1S5Mg/apjwOHNode CiKRWBNLM2yKpp9N/Pa8iJSZpvTowT7AhdaBBWNGLXz+kUvwOzomgzS+cvB8gqYwfhjS KuI6BI8aoCiVJk8nWKpkYGgzHJffIq4h+K+FlzkWx/bGAAjHOJZzdvc/d9IC93wkx+/c pXOw== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=QiGveUbKaqMPt6iTfsOvtO6yQmlbHWlXsxHlqUGMl/I=; b=VSpuueglruAjemaIb4poUvP+05EhKrQSDGLjj/QFw48tK2Ooo8GFTrRLOGo6TUfjXZ 7cWsQYxhJngQcv4xeensvb0B53LQq7twKwJRR7nd1Ljv5vbXvsndmwQw6XZIpYdYW8ZY yI0OjY1sH5tSqpE2opkMt6cgJKLBk4j0Ai1aPEL7pyQfjzClFjWwbd1YkA8AE7AcDN+Q 1IOuOaPvPtjeEqckSsJ5Vxisd6GltRGkQ57JyNhKMDnNv5txVCWsXrm2MtbCdqbvRYw7 c5Ld2jpiI4JxwRsdyXwYNUSO2Hrw+J6bcdhJhDsdQ5dFAGMUCK5NxO1zqNTetdZsKVy0 UZAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=IgbrbTl5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i10-20020a170906264a00b007ae63fe980dsi29688663ejc.931.2023.01.05.17.17.21; Thu, 05 Jan 2023 17:17:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=IgbrbTl5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S231301AbjAFBQR (ORCPT + 99 others); Thu, 5 Jan 2023 20:16:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41238 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231663AbjAFBPh (ORCPT ); Thu, 5 Jan 2023 20:15:37 -0500 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E0AEB7816E for ; Thu, 5 Jan 2023 17:14:03 -0800 (PST) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-4b34cf67fb6so3169297b3.6 for ; Thu, 05 Jan 2023 17:14:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=QiGveUbKaqMPt6iTfsOvtO6yQmlbHWlXsxHlqUGMl/I=; b=IgbrbTl5VVQEWYsKOJIdi6Yh1Rkg0pxnO5FKrfb/4/5Qxejylccur32ccSkChi1BWm uNrufnv52MO1GV4aPWUTlMIVQdCAw64PEWa6M/B6kgKNK6cZuFwD85AckL/9uoZHparz +298w25KwqbNpkDWWG3fvXwVJOprfJez5wLuAtZsf1CEg/vV/I0j2/tIj4s84NJ2x24a 6xUmJHZcg6MlqBKqNcneW//MiQUT5D9tk2KcNx2zZ2UBS+Ekss9Guu2K2rJnWRh8PqYk hsoOAg/4wWltiJSgyf24wg3gGckY2Hk5Dsmn8pePTXlBQhal0Ru6ni9RiKz1Syw4a6zl QdAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=QiGveUbKaqMPt6iTfsOvtO6yQmlbHWlXsxHlqUGMl/I=; b=lmM5A0LdrSjA7exHjBKhmgsuSmabrTwQDInbPm73UuLhQwCXeBz+leuNs9sPKp+T6+ IRjdHvWTg2SdTCYXb53khkFep3e/2WKxgq3MYUuRRIucC3yBe0Vd+Ud+EEVJVfyben6Z eDqT65/FU4gyLzdv+SBRxx+rWIQEYDu1eIIxg+vvcasLwsIW+RUoIA4NCzF/kioi4flp 0h0LLbhlEm2L78OyypkkFWTEloJoERysReQ59IMziCWAr8BMdv4L4BJxrC8tYALUQECJ AuGJhOlqvKlhbOyGpKm/yfU678t/rdG+5zVuU+ter88qCp9CGup+7dl7qPEu1ltaYSMt jGyQ== X-Gm-Message-State: AFqh2kpRFE/2gSt8j2NPpAWMscZwuHxKhdbf1q0kHj7ijn4VkMqN5NjR 4eLpFhaEGOokXA0KMYu/wxiv6vCzGKU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a81:6784:0:b0:460:c029:6c76 with SMTP id b126-20020a816784000000b00460c0296c76mr362480ywc.515.1672967629741; Thu, 05 Jan 2023 17:13:49 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:54 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-22-seanjc@google.com> Subject: [PATCH v5 21/33] KVM: x86: Disable APIC logical map if vCPUs are aliased in logical mode From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233952823568080?= X-GMAIL-MSGID: =?utf-8?q?1754233952823568080?= Disable the optimized APIC logical map if multiple vCPUs are aliased to the same logical ID. Architecturally, all CPUs whose logical ID matches the MDA are supposed to receive the interrupt; overwriting existing map entries can result in missed IPIs. Fixes: 1e08ec4a130e ("KVM: optimize apic interrupt delivery") Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/lapic.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index dca87bb6dd1a..9c0554bae3b1 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -346,11 +346,12 @@ void kvm_recalculate_apic_map(struct kvm *kvm) if (!mask) continue; - if (!is_power_of_2(mask)) { + ldr = ffs(mask) - 1; + if (!is_power_of_2(mask) || cluster[ldr]) { new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; continue; } - cluster[ffs(mask) - 1] = apic; + cluster[ldr] = apic; } out: old = rcu_dereference_protected(kvm->arch.apic_map, From patchwork Fri Jan 6 01:12:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39879 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577666wrt; Thu, 5 Jan 2023 17:18:03 -0800 (PST) X-Google-Smtp-Source: AMrXdXs1dDxvOpW7dZH5pihxMPfYa4lkaFrRCgQMZioDvFdRQckA7Ru+QPuVGDS4WOrGBvz1ewsE X-Received: by 2002:a17:903:2682:b0:192:f12a:42de with SMTP id jf2-20020a170903268200b00192f12a42demr6364445plb.42.1672967883406; Thu, 05 Jan 2023 17:18:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967883; cv=none; d=google.com; s=arc-20160816; b=JgRBr/crPfj94XvY0GD5zadKmI/pVk9RliDedNqp0twzDYHyrZU1ylLTyoms4NmFAP A0oyFc50l/xnhhPNSbwTF3OhMOS786DdHOO5QgOl5rpP99YQMWBsRtjCzWuB0KnxpUz6 PcLFXH4I6myQBAQih6DtQijElLobXISpgjcSmlfHpYg85egH3XEAzzI6pWoueLm4R/2I JSzH4l4WJylAyTM6E4TJ1gwwY6e4ZYzNchaoLSF3gMryMVZxzRyGwBTn3A7Th9qMmfDZ VyyqVzoNHOgZBRi4xcWFp0ATUva7DNM7vnzGbLySoaqRj4Z+rGuMnBF49OpPEDcp6GDT +f5g== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=+6ioVOt6Y8ZSfzod+z4E7s6OaCseHKr4cxWSag07wVE=; b=IkjprPCTxYCRz4FXIEXfBc5uJEEX1tBjUUvzv1NAa2so2DLfh8ByxWqnUN4Vip2KDI yUTEXsAfq015LlTnr0NYXsrGrO8reQFmXo8IH4PhSlL6/6DrdrL0q82FNOYhrovn/MiC JBDFb/IN2yauxkTs/2uetPt8hq5n1BIEhjm4sBYIfYzN5+3p+Y+7IJyMaChbxgGRJAQV dr84DsVzX82I+OiLmgRB5psIhOyOduNF+SFXeR44p6ApXKshx4YS/DKIzYQpPbZvqfCq G4GZ6b16WWVPlWLBDjaPya1QTR1TWvZMNHq6/Jb/aITlKfmKgJIgLe96jY2pWv8e6FEn LlKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=O03cZ1UP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n17-20020a170902d2d100b001836e51050esi11648035plc.572.2023.01.05.17.17.50; Thu, 05 Jan 2023 17:18:03 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=O03cZ1UP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S232396AbjAFBQh (ORCPT + 99 others); Thu, 5 Jan 2023 20:16:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232243AbjAFBP5 (ORCPT ); Thu, 5 Jan 2023 20:15:57 -0500 Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 059AA3E859 for ; Thu, 5 Jan 2023 17:14:08 -0800 (PST) Received: by mail-pf1-x44a.google.com with SMTP id a18-20020a62bd12000000b0056e7b61ec78so33190pff.17 for ; Thu, 05 Jan 2023 17:14:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=+6ioVOt6Y8ZSfzod+z4E7s6OaCseHKr4cxWSag07wVE=; b=O03cZ1UPddU8+XWJbySLwg3naywoqGigzTnJjgko5PE9IcKnBBaU5jVcmQtdY0IUfb oio/dzcsZGvSts18YYk/Av8B13MvrBhXlFRUuDK0yLNsOJWBi85p0sB/MZ1MD+y/3ZZB /s2g21t9mqzfA0erk1tjtpxXtyCn5AGjRZPmTnIOoKwOZTkcYC4omQh9wLxqqahT0jub lzVDgF7bYgo/pCVCXp9GjXJ9J89NBZnp/w7Dj957/VEmzMscANc264m0H1Lg6AcFmOBD DgXgqOnwy4ySU7l0z1Jeg4vNgbdZvnttpRpx7hadVpe4cGu1VWHrzFSvfBXXU1z2bjnq rKNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+6ioVOt6Y8ZSfzod+z4E7s6OaCseHKr4cxWSag07wVE=; b=3bgB+X2n1L/KQWi4cySerZ8YZxHc5m7Q/+neaaDB/w/0p47jAuDxdCtpQRfMiqh0SA 55Quf05iiyTh1QKbNjkzaysqz7uirLPN+qJe3noZWbYrndfL9kHtsG0zd+jkzYclqxQ1 KnX313Xn0EgbLOYh4TBHD1Xk/sJVlCGJPCDwhAoYPmJj0KBa0tuxDoq+A9lSOvz2tGLS x/QhhAJPgfVB4ggPKON3ARHJxFUMREz2DQeMfpRqQK7joe5KEQ68Qj5mXL6cMF9FwC7c hxZ7WKK+iG2ckhn4e0wmM83L8Yf0SiQpvS4YjLU79RHj4KCiuZEtygSvoCmM4yI5NfPi u/Tg== X-Gm-Message-State: AFqh2koHRU2xupnMYjEAndNpfgbb71IrTr3JGb8w9EY7718B8AylB1ys /b3nEsLT7hgJHsGsX5JNgEry06M8EYo= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ab05:b0:192:4d6a:2add with SMTP id ik5-20020a170902ab0500b001924d6a2addmr2740731plb.109.1672967631378; Thu, 05 Jan 2023 17:13:51 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:55 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-23-seanjc@google.com> Subject: [PATCH v5 22/33] KVM: x86: Honor architectural behavior for aliased 8-bit APIC IDs From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233971521698116?= X-GMAIL-MSGID: =?utf-8?q?1754233971521698116?= Apply KVM's hotplug hack if and only if userspace has enabled 32-bit IDs for x2APIC. If 32-bit IDs are not enabled, disable the optimized map to honor x86 architectural behavior if multiple vCPUs shared a physical APIC ID. As called out in the changelog that added the hack, all CPUs whose (possibly truncated) APIC ID matches the target are supposed to receive the IPI. KVM intentionally differs from real hardware, because real hardware (Knights Landing) does just "x2apic_id & 0xff" to decide whether to accept the interrupt in xAPIC mode and it can deliver one interrupt to more than one physical destination, e.g. 0x123 to 0x123 and 0x23. Applying the hack even when x2APIC is not fully enabled means KVM doesn't correctly handle scenarios where the guest has aliased xAPIC IDs across multiple vCPUs, as only the vCPU with the lowest vCPU ID will receive any interrupts. It's extremely unlikely any real world guest aliases APIC IDs, or even modifies APIC IDs, but KVM's behavior is arbitrary, e.g. the lowest vCPU ID "wins" regardless of which vCPU is "aliasing" and which vCPU is "normal". Furthermore, the hack is _not_ guaranteed to work! The hack works if and only if the optimized APIC map is successfully allocated. If the map allocation fails (unlikely), KVM will fall back to its unoptimized behavior, which _does_ honor the architectural behavior. Pivot on 32-bit x2APIC IDs being enabled as that is required to take advantage of the hotplug hack (see kvm_apic_state_fixup()), i.e. won't break existing setups unless they are way, way off in the weeds. And an entry in KVM's errata to document the hack. Alternatively, KVM could provide an actual x2APIC quirk and document the hack that way, but there's unlikely to ever be a use case for disabling the quirk. Go the errata route to avoid having to validate a quirk no one cares about. Fixes: 5bd5db385b3e ("KVM: x86: allow hotplug of VCPU with APIC ID over 0xff") Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/x86/errata.rst | 11 ++++++ arch/x86/kvm/lapic.c | 50 ++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/Documentation/virt/kvm/x86/errata.rst b/Documentation/virt/kvm/x86/errata.rst index 410e0aa63493..49a05f24747b 100644 --- a/Documentation/virt/kvm/x86/errata.rst +++ b/Documentation/virt/kvm/x86/errata.rst @@ -37,3 +37,14 @@ Nested virtualization features ------------------------------ TBD + +x2APIC +------ +When KVM_X2APIC_API_USE_32BIT_IDS is enabled, KVM activates a hack/quirk that +allows sending events to a single vCPU using its x2APIC ID even if the target +vCPU has legacy xAPIC enabled, e.g. to bring up hotplugged vCPUs via INIT-SIPI +on VMs with > 255 vCPUs. A side effect of the quirk is that, if multiple vCPUs +have the same physical APIC ID, KVM will deliver events targeting that APIC ID +only to the vCPU with the lowest vCPU ID. If KVM_X2APIC_API_USE_32BIT_IDS is +not enabled, KVM follows x86 architecture when processing interrupts (all vCPUs +matching the target APIC ID receive the interrupt). diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 9c0554bae3b1..e9f258de91bd 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -274,10 +274,10 @@ void kvm_recalculate_apic_map(struct kvm *kvm) struct kvm_lapic *apic = vcpu->arch.apic; struct kvm_lapic **cluster; enum kvm_apic_logical_mode logical_mode; + u32 x2apic_id, physical_id; u16 mask; u32 ldr; u8 xapic_id; - u32 x2apic_id; if (!kvm_apic_present(vcpu)) continue; @@ -285,16 +285,48 @@ void kvm_recalculate_apic_map(struct kvm *kvm) xapic_id = kvm_xapic_id(apic); x2apic_id = kvm_x2apic_id(apic); - /* Hotplug hack: see kvm_apic_match_physical_addr(), ... */ - if ((apic_x2apic_mode(apic) || x2apic_id > 0xff) && - x2apic_id <= new->max_apic_id) - new->phys_map[x2apic_id] = apic; /* - * ... xAPIC ID of VCPUs with APIC ID > 0xff will wrap-around, - * prevent them from masking VCPUs with APIC ID <= 0xff. + * Apply KVM's hotplug hack if userspace has enable 32-bit APIC + * IDs. Allow sending events to vCPUs by their x2APIC ID even + * if the target vCPU is in legacy xAPIC mode, and silently + * ignore aliased xAPIC IDs (the x2APIC ID is truncated to 8 + * bits, causing IDs > 0xff to wrap and collide). + * + * Honor the architectural (and KVM's non-optimized) behavior + * if userspace has not enabled 32-bit x2APIC IDs. Each APIC + * is supposed to process messages independently. If multiple + * vCPUs have the same effective APIC ID, e.g. due to the + * x2APIC wrap or because the guest manually modified its xAPIC + * IDs, events targeting that ID are supposed to be recognized + * by all vCPUs with said ID. */ - if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id]) - new->phys_map[xapic_id] = apic; + if (kvm->arch.x2apic_format) { + /* See also kvm_apic_match_physical_addr(). */ + if ((apic_x2apic_mode(apic) || x2apic_id > 0xff) && + x2apic_id <= new->max_apic_id) + new->phys_map[x2apic_id] = apic; + + if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id]) + new->phys_map[xapic_id] = apic; + } else { + /* + * Disable the optimized map if the physical APIC ID is + * already mapped, i.e. is aliased to multiple vCPUs. + * The optimized map requires a strict 1:1 mapping + * between IDs and vCPUs. + */ + if (apic_x2apic_mode(apic)) + physical_id = x2apic_id; + else + physical_id = xapic_id; + + if (new->phys_map[physical_id]) { + kvfree(new); + new = NULL; + goto out; + } + new->phys_map[physical_id] = apic; + } if (new->logical_mode == KVM_APIC_MODE_MAP_DISABLED || !kvm_apic_sw_enabled(apic)) From patchwork Fri Jan 6 01:12:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39884 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp578309wrt; Thu, 5 Jan 2023 17:19:47 -0800 (PST) X-Google-Smtp-Source: AMrXdXskMT4Prrq9mAwfuiLK+mYOvbCKa6x1ssVpiu6ncgszhE9og41rZjorMTImMCcia19Ze/qx X-Received: by 2002:a05:6a20:c906:b0:b4:f66a:99a9 with SMTP id gx6-20020a056a20c90600b000b4f66a99a9mr11348101pzb.60.1672967986882; Thu, 05 Jan 2023 17:19:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967986; cv=none; d=google.com; s=arc-20160816; b=ETyOdFI0roFDc1qQXBnRJnocigd8qqL9J7R6p2yXbZ8UUvuqcUAgloBk2RTfpZOKpb /wseQMkKVP+wtKEdYvGzp493nHkZBMSsSHyWVaM59BJgihqSvkIUwh0SHyh5jMYgLNE5 yVpMKgZZsr4iYCJOTIBRd4OBJxfjAnBN7LYTaCZklId+uxPUVsN4WpBPptWh1I7Pq+j3 P+6NRbOjIwd+Tj6UxUPO+bqNTvLhw2nSitMsL2fuWVeudkOM3E6ocp2obIseAoCggy4N bdDzyI+WZGhGS/taeFIOD7guMASydc+2BsY5m1X3FqbpUhsLmi4uxZLuimGxGEB0U/Em iLIg== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=ZYN39wk6a5NRPTtVgQ2fmBkBZpoYFPy36qtJQgrzBbQ=; b=Ii1GL1Nt7tqbYn2HdlvQplEqgr2D/S4NTHB+4Juun2g4qycj3iCkazeDxAgF23a12J iwp0yaxLfPZ03dClXvqrCK6W8CjJ1emK6sbMQxWfgAkAeyqZwvJuQC3gR9ZYJFJtmesc zQVXtfvIwatctud24vg+1/t4vy6PbCIoOyB52n6MIJ69XeCV6AOOXrx8+Wx/HsBx+fID BdfOr7YbH56/y5DAhyrvO25vOJFAnLNbV/0TMoDcOJ1ZbMa0cCDnHs0Pph2RlieiDNkq JqzN+LJS15LqG+x6Z8DsXDlXgz+hSi6qL/tyzE0EVblgRaFP9EI8yR8d1M/JGbVpk08l PxMw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=S4tMZcsl; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x8-20020a654548000000b0049d7f3cc5b9si23199390pgr.335.2023.01.05.17.19.33; Thu, 05 Jan 2023 17:19:46 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=S4tMZcsl; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S229688AbjAFBQe (ORCPT + 99 others); Thu, 5 Jan 2023 20:16:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41350 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232228AbjAFBP5 (ORCPT ); Thu, 5 Jan 2023 20:15:57 -0500 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3FD333E85E for ; Thu, 5 Jan 2023 17:14:09 -0800 (PST) Received: by mail-pl1-x64a.google.com with SMTP id n1-20020a170902e54100b00192cc6850ffso108804plf.18 for ; Thu, 05 Jan 2023 17:14:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=ZYN39wk6a5NRPTtVgQ2fmBkBZpoYFPy36qtJQgrzBbQ=; b=S4tMZcslkr51udzOZhWe5rKJnCQOlvWCj/gy1+r0cmExiw+cnm625YYiIx8qAy+rxD WvQgMxjEoJ9RMz74DDzoYV0cEZd9fIWBvu19nxlEKwAH50Xx4FuNpoFVUcgflwQJEmrS eJ6h18W2yIpdYB+fSPatYOOy2+0JgVN81vNGq4AmpfL1sQJ+L+DzVIA4kaxrkDdk+Kxs yX3KZ6hxCMxxepCxPmR0I5QKTDhwjTUuZ5zXzQk1rkP4kdAB8qBwDUmsRn4cQl61qejp GXqhyHZjijzndqJQIuKbqe8zAn+FYcY7F4/TpJ4UFQoxhUpsZcfqCaYEyvGEMbo4XoTB 8oKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZYN39wk6a5NRPTtVgQ2fmBkBZpoYFPy36qtJQgrzBbQ=; b=yPFSaMK8U9bDujjnA0KK3mVkm7uZ8n4WdNUVAjWUeIvfPABdiS8wG2LuyAZujT2Sq/ FS4J4P70lcghZiLrhUUW5qmiO7Ckxv0pnGhVvXf2fKHvICZ4P7ZcsHwjl70SOhXvHnRa VpKoK6R3dPG3Xrfzat1IJrBksIRyXskhNLsDOtSGMU0rO9Fjq2DxIssKXNMpLgTjtQV8 QshrOEBcOa/HslFQFKmgF8t26JnOnLfI18YNdKvAXKLRnKHFxujl6ac7DssNAXhSs8PH Cq1QeKoIoBaWbNMjR/54Qj3s9+ekHJ512MpLFPWkVpv5DSrB+c9Z5eczuboMsmABFy1k QRyQ== X-Gm-Message-State: AFqh2kpRuDppNztpkmQgDM83KhH824W9mzMndx2CiFCh3WSLzrPOEOi4 ZYXlazbTLOHfdlBjsC2gDpMhe1e/fPE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:a50c:b0:226:744:d464 with SMTP id a12-20020a17090aa50c00b002260744d464mr2481575pjq.62.1672967632838; Thu, 05 Jan 2023 17:13:52 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:56 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-24-seanjc@google.com> Subject: [PATCH v5 23/33] KVM: x86: Inhibit APICv/AVIC if the optimized physical map is disabled From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754234079784826874?= X-GMAIL-MSGID: =?utf-8?q?1754234079784826874?= Inhibit APICv/AVIC if the optimized physical map is disabled so that KVM KVM provides consistent APIC behavior if xAPIC IDs are aliased due to vcpu_id being truncated and the x2APIC hotplug hack isn't enabled. If the hotplug hack is disabled, events that are emulated by KVM will follow architectural behavior (all matching vCPUs receive events, even if the "match" is due to truncation), whereas APICv and AVIC will deliver events only to the first matching vCPU, i.e. the vCPU that matches without truncation. Note, the "extra" inhibit is needed because KVM deliberately ignores mismatches due to truncation when applying the APIC_ID_MODIFIED inhibit so that large VMs (>255 vCPUs) can run with APICv/AVIC. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 6 ++++++ arch/x86/kvm/lapic.c | 13 ++++++++++++- arch/x86/kvm/svm/avic.c | 1 + arch/x86/kvm/vmx/vmx.c | 1 + 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 732421a0ad02..5865bad08a23 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1174,6 +1174,12 @@ enum kvm_apicv_inhibit { */ APICV_INHIBIT_REASON_BLOCKIRQ, + /* + * APICv is disabled because not all vCPUs have a 1:1 mapping between + * APIC ID and vCPU, _and_ KVM is not applying its x2APIC hotplug hack. + */ + APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED, + /* * For simplicity, the APIC acceleration is inhibited * first time either APIC ID or APIC base are changed by the guest diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index e9f258de91bd..297da684c25f 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -386,6 +386,16 @@ void kvm_recalculate_apic_map(struct kvm *kvm) cluster[ldr] = apic; } out: + /* + * The optimized map is effectively KVM's internal version of APICv, + * and all unwanted aliasing that results in disabling the optimized + * map also applies to APICv. + */ + if (!new) + kvm_set_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED); + else + kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED); + old = rcu_dereference_protected(kvm->arch.apic_map, lockdep_is_held(&kvm->arch.apic_map_lock)); rcu_assign_pointer(kvm->arch.apic_map, new); @@ -2158,7 +2168,8 @@ static void kvm_lapic_xapic_id_updated(struct kvm_lapic *apic) /* * Deliberately truncate the vCPU ID when detecting a modified APIC ID * to avoid false positives if the vCPU ID, i.e. x2APIC ID, is a 32-bit - * value. + * value. If the wrap/truncation results in unwanted aliasing, APICv + * will be inhibited as part of updating KVM's optimized APIC maps. */ if (kvm_xapic_id(apic) == (u8)apic->vcpu->vcpu_id) return; diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 76da9f19272e..d1ac19f053ce 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -965,6 +965,7 @@ bool avic_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason) BIT(APICV_INHIBIT_REASON_PIT_REINJ) | BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | BIT(APICV_INHIBIT_REASON_SEV) | + BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED); diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 8ed14fcfe870..ef84d11a0fe4 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -8029,6 +8029,7 @@ static bool vmx_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason) BIT(APICV_INHIBIT_REASON_ABSENT) | BIT(APICV_INHIBIT_REASON_HYPERV) | BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | + BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED); From patchwork Fri Jan 6 01:12:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39881 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577774wrt; Thu, 5 Jan 2023 17:18:23 -0800 (PST) X-Google-Smtp-Source: AMrXdXvnNQunoEYITKUfM59vgs/H0jeoEgwXm6oDBlbn0QiKkZ8dV54qRKtCyCh4nD92si+ebFkL X-Received: by 2002:a17:907:7d8f:b0:7b5:911c:9b12 with SMTP id oz15-20020a1709077d8f00b007b5911c9b12mr57739202ejc.1.1672967903196; Thu, 05 Jan 2023 17:18:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967903; cv=none; d=google.com; s=arc-20160816; b=06lQEDKisxDJgKuutS/1Ou974oY3mbOZRn6mDAd2umIQu2QV+KsPXZLdTlrSSULkWh 5aS25cfprbnKiEUH/TStIFHv5NMYHmsA572GXY/V3Y86OcYkgdk59/NciWCaeyXW88jK dYEHabgPIzqP8asDrYtL0yUJYZjBVhdVHYd8B8fqziQWGGjghwC0kn+/5CuozPZOpWhb sXfosSMzafGyfSYCIJEUXjyoqkFeZYVbCGSUSgRZlMBSk/ukt2BTmoiaERsnBlloc/Ox rktMKo0YAB858cJZOrwuL4Be+NzDGERf9Gxp00o1UgJOufYvj2jmJqanM+SW47daHU9r LJZQ== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=o4UAETXkM62nM2yYuGHBJ1AdJGjwtbarF4DTw13SG8M=; b=qN1qsS0kppMzIdOHShCpFQqbPsW+UZvHKG30QXp52H/TN2vtb1IxaoQKyULZ9st+tx hEn2XX/7kI3KsjwNEhOuf5wO00eGrHe5aTBC0rtjjy1doWkHb+HplFlm4FWbAeNdyAhM XktoZUp5ahn1patXKW+7e0bRzRy55v+LpPg51wHZG8DLLyz4VrtgeSy58u45mm1CsOjT zm6RWm8Xl8bO3U+9Ng9Txv1WRaOSjytpPuNDSWs90KqmgRO1s5md9uMz9cybuK9oWaBq soqfLmXbO2/PTMpeKzygFYU3tNdVbhOWa1+afuaSH1VQFdxa2WSv8NkM1nFIs6kMYTY1 Lf4A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=j2HNEccB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id va28-20020a17090711dc00b0084d14d255ebsi1416321ejb.291.2023.01.05.17.17.59; Thu, 05 Jan 2023 17:18:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=j2HNEccB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S233258AbjAFBQm (ORCPT + 99 others); Thu, 5 Jan 2023 20:16:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229757AbjAFBP7 (ORCPT ); Thu, 5 Jan 2023 20:15:59 -0500 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7B3A73E863 for ; Thu, 5 Jan 2023 17:14:10 -0800 (PST) Received: by mail-pg1-x549.google.com with SMTP id r126-20020a632b84000000b004393806c06eso216745pgr.4 for ; Thu, 05 Jan 2023 17:14:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=o4UAETXkM62nM2yYuGHBJ1AdJGjwtbarF4DTw13SG8M=; b=j2HNEccBP7np7M1sGlh/lR9iiwoxeu2tDdMfTtFmom/1SMGw9AQClRjRPjxLcQnERb P92ChTGaFkoInGodIaAPnUdfY53bosFhp2WBXli5H0PS/7/07MxxqJE4tVPSrQgL9zZ4 iy1PiDEc0mmhxGDEB4e9NZbEj87Xzb/ZJTKCAfEMolx9oL+EUzsxesFZVBys6msUS/dV BlERFFcesl/Aa0+XdXyltbE2MS4q6xScax+5zeprGT9eHK5nBMbpS06o+TwXC7g9SbZh y2NdVD5PQ5H5gTO6T23k2qqLzFuLP2O4eK7GOViM+89twqSlz/6vLB7iSc/KWmjVNb6L ngZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=o4UAETXkM62nM2yYuGHBJ1AdJGjwtbarF4DTw13SG8M=; b=JSDbWrD9ACsmneEMnSvpKY+4E20r6+d6E4pO/k4nPU9msbFGlbKJcW8j0RRf9r+BZZ yUnya16QLTgCsCwRQ75Hi+kewz7KAbU/tWo9UWW1/hgvdQncKk6M1Tl+jnfvYYBjVPh4 v+MGhDHf2/4BlVoVQcAxDOjRyuAF8AXTa6vsuV04ZvhDapfTNuMevRd9mGwzXDiu0FOm Xae5sVfNUS/7vVlLUytYLskgyRzMk0GwuoqESQailk/oP8rAT4/Kv5vZUudNbOP4pJPp 1a87JiN3qknpgQyVmYqdGmP5VCXFIKJRYlvDDI8q+WTKL34yz/hgDPBFbodIrxBE7yXM qcDA== X-Gm-Message-State: AFqh2krladJi4DOtGA+m+s56lEWTikJHvgl979FgryCoAoh/I4sePL0z V1JrafXLtYsh7DQWNxg4ST6F6U8lfLs= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:2e05:b0:225:b536:1209 with SMTP id q5-20020a17090a2e0500b00225b5361209mr4108245pjd.101.1672967634940; Thu, 05 Jan 2023 17:13:54 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:57 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-25-seanjc@google.com> Subject: [PATCH v5 24/33] KVM: SVM: Inhibit AVIC if vCPUs are aliased in logical mode From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233991711709458?= X-GMAIL-MSGID: =?utf-8?q?1754233991711709458?= Inhibit SVM's AVIC if multiple vCPUs are aliased to the same logical ID. Architecturally, all CPUs whose logical ID matches the MDA are supposed to receive the interrupt; overwriting existing entries in AVIC's logical=>physical map can result in missed IPIs. Fixes: 18f40c53e10f ("svm: Add VMEXIT handlers for AVIC") Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 6 ++++++ arch/x86/kvm/lapic.c | 5 +++++ arch/x86/kvm/svm/avic.c | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 5865bad08a23..b41a01b3a4af 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1218,6 +1218,12 @@ enum kvm_apicv_inhibit { * AVIC is disabled because SEV doesn't support it. */ APICV_INHIBIT_REASON_SEV, + + /* + * AVIC is disabled because not all vCPUs with a valid LDR have a 1:1 + * mapping between logical ID and vCPU. + */ + APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED, }; struct kvm_arch { diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 297da684c25f..0faf80cdc1be 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -396,6 +396,11 @@ void kvm_recalculate_apic_map(struct kvm *kvm) else kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED); + if (!new || new->logical_mode == KVM_APIC_MODE_MAP_DISABLED) + kvm_set_apicv_inhibit(kvm, APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED); + else + kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED); + old = rcu_dereference_protected(kvm->arch.apic_map, lockdep_is_held(&kvm->arch.apic_map_lock)); rcu_assign_pointer(kvm->arch.apic_map, new); diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index d1ac19f053ce..1fd473a57159 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -967,7 +967,8 @@ bool avic_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason) BIT(APICV_INHIBIT_REASON_SEV) | BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | - BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED); + BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED) | + BIT(APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED); return supported & BIT(reason); } From patchwork Fri Jan 6 01:12:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39880 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577721wrt; Thu, 5 Jan 2023 17:18:12 -0800 (PST) X-Google-Smtp-Source: AMrXdXs9eg/IFAqmwQaW5yd+YyO41sRSXVqhzfP8ZlEsfCsDFntAm9EJQHseKddnr277BDxjw4YE X-Received: by 2002:a17:903:32cc:b0:189:129e:92af with SMTP id i12-20020a17090332cc00b00189129e92afmr78144391plr.14.1672967892410; Thu, 05 Jan 2023 17:18:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967892; cv=none; d=google.com; s=arc-20160816; b=etRKsqHNGrQSJrhrJUiYl2b6vr2+3IQvJuRmT0049YSwNDY4z2cmd5MHWxQmNplKb0 bpeSCYpnymxkj6NPcQteSHjHEPqtHv1kpLwqZ1mNEogCcK4SFMSfqXPonivEj0mr2b7U 0b2NMcngFToh2WpUJd1M/3cQrbf3bkfHrg9qLdaJVmWcFKGUrSYLbUlO8dAS5ZAUf34g ++FVCjVsYoeqlUI/y2RuQ6f+Fq+OlklvOT1k31GmAJP5aTUX/2laMV2OPtmjk48O3av6 OR1PIsL8Ysznwqq0U8uDrBnQ7if6uGyqHPhcsbc+e/C5KjnariTIqBv4+5ZQhFdO+FpW MnUg== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=7iPI0dl/ko2Lo6A5R8RXBXgr3khsxs/MyGTJ8pdxMPM=; b=nTMGfQWlbDHsdhPPz/lOQbQFbgpJlNusJtEg+2tx4fkuASEBCv6lIBMOJSaXB0jG/J Sy9cOK0/+jPWCa+zqn/T1X6bHLnMYlQRtUoYB4n3hH1BcGk7wca+Y/yCcM/9U5rnKPni fz+nAhYt/UnyXwg9i+7GWzpcnR9NkS/3uimINcGLhABSG9wcHU/13nLbqFzfgjhFInRd g3VNWkhVmPc7SBVgfUNs5htwbeUH7kxGWfNHi9VpmlZhezBtcXJ/oBicAJarfOkHUDK2 zXTMGF62qjgL7qQhz+zECkSswI1F3oMJttGkrE11UKv9FGIp7XdL7AGasGUk3QoYCiLu 4nqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=ZaSgs0lS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f68-20020a636a47000000b004794d65bc1esi37937491pgc.399.2023.01.05.17.18.00; Thu, 05 Jan 2023 17:18:12 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=ZaSgs0lS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S233322AbjAFBQr (ORCPT + 99 others); Thu, 5 Jan 2023 20:16:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41028 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231882AbjAFBQH (ORCPT ); Thu, 5 Jan 2023 20:16:07 -0500 Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DAA573E86F for ; Thu, 5 Jan 2023 17:14:11 -0800 (PST) Received: by mail-pf1-x44a.google.com with SMTP id ct7-20020a056a000f8700b00582e67e255bso51206pfb.9 for ; Thu, 05 Jan 2023 17:14:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=7iPI0dl/ko2Lo6A5R8RXBXgr3khsxs/MyGTJ8pdxMPM=; b=ZaSgs0lSr/JJODEuSDEI4kPBIyYKk9ZEyKSnyX14YyGd+KcacGTqLZcQzCGgZE1j/6 NhleuIjiv89JqbxHeQJ2Fprh/hJA77EhZiE7Un9s7rlCZWL3wpLO7HF3MQmyLZf7y4Ey VcOQdJzEVe7LplFmBqKjTZykJBAlohsByvNNW9lasR6poy+KaKwQfCauHCUg8lk2GuCr STJy0HpuTrmVNyrlm//D66UZkS31Zf8sJ865YAvoNzjGqsLiiU9H/LbsQC4gJDvKi18C ZEIF2PUBAPFwzWPsCyqVAYSubqlxyCUI3MWPQbqMACZP+SDYU3Zh1jblTcAvddN2fd5p Qc0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=7iPI0dl/ko2Lo6A5R8RXBXgr3khsxs/MyGTJ8pdxMPM=; b=GvdWmCzCbkjSCVgJv4ryNUAD8zZ/jBEmV1dPyT/tSQpBRu2ELtbhl5W+3PdYnGlMB5 Q/bqI7wPC1wuuRHquOB+qUUx2DDWjRGXsjQiq8URuCynSLDgjqSE6AkmqKKGmxGpBgG4 k0vgN98ppy0G2VH293ETE1F6oTnxsI2GrAkSkmFY8eQybLC/+fIB6ibVNFGW21FZqcR+ 687r0yVcKHML94hjyx4c4F5B8bL98Jqmantm4B8RR62wEbAGW4AW5xi10ocaFRRb+XAs apEw1vy2gIuEAvMZxMUdHPMKAEGTTr9/a86+oSDNH1TfpqyNyZMWX/NXedxnMPJTMbM6 lO2g== X-Gm-Message-State: AFqh2krKmsRdm2BunbWouMd+sAymGatr6dhzTnIzpJjP3QbKvFQCJZ/C ScXz+BUnKH9Kq3OgXYrLVX153smD5q4= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90b:3604:b0:219:d1eb:b8a1 with SMTP id ml4-20020a17090b360400b00219d1ebb8a1mr4230658pjb.174.1672967636674; Thu, 05 Jan 2023 17:13:56 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:58 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-26-seanjc@google.com> Subject: [PATCH v5 25/33] KVM: SVM: Always update local APIC on writes to logical dest register From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233980500722407?= X-GMAIL-MSGID: =?utf-8?q?1754233980500722407?= Update the vCPU's local (virtual) APIC on LDR writes even if the write "fails". The APIC needs to recalc the optimized logical map even if the LDR is invalid or zero, e.g. if the guest clears its LDR, the optimized map will be left as is and the vCPU will receive interrupts using its old LDR. Fixes: 18f40c53e10f ("svm: Add VMEXIT handlers for AVIC") Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 1fd473a57159..144e383a4c5d 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -573,7 +573,7 @@ static void avic_invalidate_logical_id_entry(struct kvm_vcpu *vcpu) clear_bit(AVIC_LOGICAL_ID_ENTRY_VALID_BIT, (unsigned long *)entry); } -static int avic_handle_ldr_update(struct kvm_vcpu *vcpu) +static void avic_handle_ldr_update(struct kvm_vcpu *vcpu) { int ret = 0; struct vcpu_svm *svm = to_svm(vcpu); @@ -582,10 +582,10 @@ static int avic_handle_ldr_update(struct kvm_vcpu *vcpu) /* AVIC does not support LDR update for x2APIC */ if (apic_x2apic_mode(vcpu->arch.apic)) - return 0; + return; if (ldr == svm->ldr_reg) - return 0; + return; avic_invalidate_logical_id_entry(vcpu); @@ -594,8 +594,6 @@ static int avic_handle_ldr_update(struct kvm_vcpu *vcpu) if (!ret) svm->ldr_reg = ldr; - - return ret; } static void avic_handle_dfr_update(struct kvm_vcpu *vcpu) @@ -617,8 +615,7 @@ static int avic_unaccel_trap_write(struct kvm_vcpu *vcpu) switch (offset) { case APIC_LDR: - if (avic_handle_ldr_update(vcpu)) - return 0; + avic_handle_ldr_update(vcpu); break; case APIC_DFR: avic_handle_dfr_update(vcpu); From patchwork Fri Jan 6 01:12:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39888 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp578584wrt; Thu, 5 Jan 2023 17:20:36 -0800 (PST) X-Google-Smtp-Source: AMrXdXt1oVIQhNeFWiGuYrqf7Bcp7FMN7uHq0R/pOXgcdhroO0o9wVqs6FGPcu2u5SsGQXUV2jSc X-Received: by 2002:a05:6a20:2d1f:b0:ac:9d6b:c1f0 with SMTP id g31-20020a056a202d1f00b000ac9d6bc1f0mr70892140pzl.40.1672968035749; Thu, 05 Jan 2023 17:20:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672968035; cv=none; d=google.com; s=arc-20160816; b=hHr6ojzkpboUEfOm0+g37ccSZWYyZ9F+UrqIgdV5al6tRYQXNxUmmAwxltNkw+3W3h rkM7IFic7OCbxJ0e4bg0BvfmY8yOoagrSKy3Ng4xM8Qqf2GQz2QsKpsFiXCqUajyd+vc 6dcvmAye83DWXV5p/VFAp+UBKsKadDUz5mmuleMY0aJgzjboe4/DWgyIAi4DfpiEIRab wWpUzPg7gMcUprCJOsR2aS/uJ7P/EkGIpDDFrTfGakFdSO4kkItDlJk8qHAoL9xRTa0M DmYKv4suf6q+4K9GpDQIO/FTUhc+vW/cyc0mfLWKE/1ymKMXkYHmVZiNv5kjNgZxmDmS dZqg== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=J1V7EU+EWrvW5nteFG4b5GW6PZRHrRfQBnmCjlAIqUI=; b=IXH/HaBUzlROcbJmSwyytaZJZe2egD8vWoGdNs5d/ojzTH++DEZtIb+t0oh79/v14y ve0B7T5rMt2pud+/JDaaSqwGPwTWFmjxrM191ae05jZXJdOsJ08qOPJAPdC3rkuvxIRd 3dtXZQYPPCp03cU47xC/s2pi5hINio2lcck1Au3VY1++k9hzgzPdCVrTNLOS4/AQkwBz bstUGyMtN/eilhbV860nM1/z28eaFs8gUhWPutHtA++eXhEntNa6BxCT8wb6lsACdGlj cJQrr7XqYX9nH0zO/PQphYva9A0BKGxfk400zwzXANbfYCcfDp8MrAyYsonlny2fOfEK 86GA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=rDxj9tQK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x190-20020a6386c7000000b00498d6c75ad1si28060791pgd.405.2023.01.05.17.20.21; Thu, 05 Jan 2023 17:20:35 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=rDxj9tQK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S232663AbjAFBRE (ORCPT + 99 others); Thu, 5 Jan 2023 20:17:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37670 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231646AbjAFBQO (ORCPT ); Thu, 5 Jan 2023 20:16:14 -0500 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B796865ACD for ; Thu, 5 Jan 2023 17:14:17 -0800 (PST) Received: by mail-pj1-x104a.google.com with SMTP id g15-20020a17090a128f00b0022628a85a1cso125277pja.4 for ; Thu, 05 Jan 2023 17:14:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=J1V7EU+EWrvW5nteFG4b5GW6PZRHrRfQBnmCjlAIqUI=; b=rDxj9tQKYiqzEAX+7OptTHqneRJr0YZTO6aN9x2uXwofIdTLT+XyoddoR04GgEymcW 25D9NbmM6Vgxi0CgBfoiD3JVPyjTkX0GiuWUYqrP0ZNe05jdX/VbXNcZ5c8J0vzsBsv6 ujJcI9s4r9ExZTWATWI8o6fbaFJoF+aOmrVNfw4fCQSYCaLNG5VsjIGmNR+08wBm3Drb B57EFQ87pbPdeCc3NufrdRe1bo9pg7o0yCRUEwvs3Hgjzdwo2Ca5VTroIQEdWgSVzzYv mlhm/Z6a0pm/y23HQH6gmGxkAA7HtHBaUvgSffwXOme8r+mYa7SGg7BsGqygbGmKSCda kYBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=J1V7EU+EWrvW5nteFG4b5GW6PZRHrRfQBnmCjlAIqUI=; b=qdVlcKc8lnOmRQbw4bVLwYn8az+yFPAAhnRNzNH4xxozXwJRBl+g0YnA28U6xGUK4q AaJLw2IAtMgnl7VmbL/jQzJ4BltplceCOcSEgfBxRieLJG4s5NPbr3KEooNF5Mjvui4/ 9K6BBU7o2mNK+3TUMCOtGmxs40LQwR2E3QJNhtV8mC3l1Ho2RSs0Yqh+wBG+j9jloSlm X3hMhefK2BH18fPsGU1gdB66P8UmuGlj3Qx7ZrYCHiFJOMT6QoequgROollcx87xdTre xBGKWkZjK4JKjOVANBGwzGw8PYxtO55OXt7Kq3d4BRBEuqrq4HAqlaZarkvOKi/7xKrK pDdA== X-Gm-Message-State: AFqh2kq8shHN3KpkivsVE0B5iMKPSi2QQ3/AmoTIBrHs7W2SQEN1otnH HScVHpf1uAlvQ/r3zZgMWHBQoQcmwkA= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:af91:b0:219:9eaa:80e2 with SMTP id w17-20020a17090aaf9100b002199eaa80e2mr3338754pjq.207.1672967638285; Thu, 05 Jan 2023 17:13:58 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:12:59 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-27-seanjc@google.com> Subject: [PATCH v5 26/33] KVM: SVM: Update svm->ldr_reg cache even if LDR is "bad" From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754234130804910132?= X-GMAIL-MSGID: =?utf-8?q?1754234130804910132?= Update SVM's cache of the LDR even if the new value is "bad". Leaving stale information in the cache can result in KVM missing updates and/or invalidating the wrong entry, e.g. if avic_invalidate_logical_id_entry() is triggered after a different vCPU has "claimed" the old LDR. Fixes: 18f40c53e10f ("svm: Add VMEXIT handlers for AVIC") Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 144e383a4c5d..5b33f91b701c 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -539,7 +539,7 @@ static u32 *avic_get_logical_id_entry(struct kvm_vcpu *vcpu, u32 ldr, bool flat) return &logical_apic_id_table[index]; } -static int avic_ldr_write(struct kvm_vcpu *vcpu, u8 g_physical_id, u32 ldr) +static void avic_ldr_write(struct kvm_vcpu *vcpu, u8 g_physical_id, u32 ldr) { bool flat; u32 *entry, new_entry; @@ -547,15 +547,13 @@ static int avic_ldr_write(struct kvm_vcpu *vcpu, u8 g_physical_id, u32 ldr) flat = kvm_lapic_get_reg(vcpu->arch.apic, APIC_DFR) == APIC_DFR_FLAT; entry = avic_get_logical_id_entry(vcpu, ldr, flat); if (!entry) - return -EINVAL; + return; new_entry = READ_ONCE(*entry); new_entry &= ~AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK; new_entry |= (g_physical_id & AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK); new_entry |= AVIC_LOGICAL_ID_ENTRY_VALID_MASK; WRITE_ONCE(*entry, new_entry); - - return 0; } static void avic_invalidate_logical_id_entry(struct kvm_vcpu *vcpu) @@ -575,7 +573,6 @@ static void avic_invalidate_logical_id_entry(struct kvm_vcpu *vcpu) static void avic_handle_ldr_update(struct kvm_vcpu *vcpu) { - int ret = 0; struct vcpu_svm *svm = to_svm(vcpu); u32 ldr = kvm_lapic_get_reg(vcpu->arch.apic, APIC_LDR); u32 id = kvm_xapic_id(vcpu->arch.apic); @@ -589,11 +586,8 @@ static void avic_handle_ldr_update(struct kvm_vcpu *vcpu) avic_invalidate_logical_id_entry(vcpu); - if (ldr) - ret = avic_ldr_write(vcpu, id, ldr); - - if (!ret) - svm->ldr_reg = ldr; + svm->ldr_reg = ldr; + avic_ldr_write(vcpu, id, ldr); } static void avic_handle_dfr_update(struct kvm_vcpu *vcpu) From patchwork Fri Jan 6 01:13:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39882 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577815wrt; Thu, 5 Jan 2023 17:18:28 -0800 (PST) X-Google-Smtp-Source: AMrXdXv2K8FLhPrwsBRSoV8tTf5nyWxxFPbcFXqPV6vG/jmIDzXUrdJkxhIlBixhZPzRy3YIaYoI X-Received: by 2002:a17:902:c9d2:b0:192:ee98:664c with SMTP id q18-20020a170902c9d200b00192ee98664cmr6280088pld.54.1672967908605; Thu, 05 Jan 2023 17:18:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967908; cv=none; d=google.com; s=arc-20160816; b=ShKyaZbEU3od46X3wDd1p3T07t7/Toi2/Hof0HCxrXhuwp0urK06hpZk1igTv37X0P EfNtNqUnEstQLgoJ/FlWGuNqL2Fa/uMsfCfzxjjMwZ2VIu83FbewD9HlJftl2fsHmdxE Xx4biw26MXA8vlb/i3lVRMREhevJAX7rVD3OQ4JoYSwu50ezCEC2AnWTl3kWxBzSGVIE BNvzXDtSFEHHtN4rjM4cnEjtm2U97rJNHv2UqI8EaXMV3UQc+ACmET4uRcfrM9kg5O/7 hHtiSwyged6/SMwE9sHG7pIVDD/VZkWd6XvvMnVKY+fb5so2SfSWLvcHmTx5ixKfk4ZB nMkA== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=G/xMBTyIGc3/xkevi67fvj8wyXuCW/OQud7CJpQaZ3I=; b=AreGkL6pIYl4CEHp4hbLVsdNKotOuMRZSeMt8TTvz/nxqrQhUMJLPfqSCofE6kl1RD mxerVwBRIoPvv2FUJpIWIwG0NaA0H+vS8lH094H4PE+Ec06/jSjXyGN9pYg7ml76rvGy BPETCcaDgUogE/jSGY9yhZSjNlP6rYlPdf5UZ2K9Jrun2JLAlI8TAQlJWNyosGDJav9j qn5S9RgvfKBy37FvDYTdV4WX5obU401PmDCw4jdH39m8DbSsfZl5xf78Uz/Ph8VJzso0 DH3gS1KbXfeuI8XjAq/Rqxlz+boJ51id5RSlQT3HSpaknQeL+wuFha8EBbdtDDJ3svzg 1zvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=d6QlI5kw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e6-20020a170902784600b001890f5957c4si12750851pln.353.2023.01.05.17.18.16; Thu, 05 Jan 2023 17:18:28 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=d6QlI5kw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S233744AbjAFBRO (ORCPT + 99 others); Thu, 5 Jan 2023 20:17:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41316 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229643AbjAFBQ1 (ORCPT ); Thu, 5 Jan 2023 20:16:27 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9922265ADD for ; Thu, 5 Jan 2023 17:14:20 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id k18-20020a25e812000000b0077cc9ab9dd9so425086ybd.8 for ; Thu, 05 Jan 2023 17:14:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=G/xMBTyIGc3/xkevi67fvj8wyXuCW/OQud7CJpQaZ3I=; b=d6QlI5kw/H8GG/AjdSQEB/z5oht/Dlvzb9pO6xzHuZuAfEpDPK0ubjoADbbBmfnpip lWPSmAFPSaimE6lYMZceH/Dq8aCshL0Uyq6vA0W4P5OLUz3h5Vf5ONtVay7T/m59CFem DMJdWK90qXXkUTFbGZuPDdtyzYWxe8hii8trgtihyNeKBPcmz5CtIFQ/23aaAfs94xsl Sg4uVP8j8Dy9Mt38n+KhVJN6fk52HJx9m33qQD1GeqhFFIKqoZkU98q5/5BQS5/EonhA +b0dawmxW7RqY0D6xUNS6b67hvED4rvw20R73gddAGkTQezXNkdFYleIciX/WQAf7W+I ZeYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=G/xMBTyIGc3/xkevi67fvj8wyXuCW/OQud7CJpQaZ3I=; b=rwFw9brKjPKs/mOaWeTNJyZeCZ1JWYXpuuMwPUGWcKySTR433tEvHqhpea5FnfHfs9 RBQ/HF2k1XRFjLxFNeA+zY0od3CdymzjO6ds1/gWdCRVoGo2pOZqNnLv8UwZohmKj0bO FQbmyUeuNDwtm84F3xpskIgq2cKtaz3wwV18Y9rQihl1gXWJbotJ92R+buy9x+mxdtlX DyLx4eXHI1tpJneeSr/fK7HRhvOjfvr4k0HZ6blX89x8x+VeAiSPyM/V/6miQqsA3SlD amGYtAf5eCZPtG57q1fJHkm7UCkd2DKfphymWoSCjufrcwnAdCnV8sRw5i4jUvOk5u65 /SfA== X-Gm-Message-State: AFqh2kodHBgwBEFPQ5YSU2le0cRBNQ8Sug1qMkAfLVGI4JZfMNzoit5q QeMFwQIRoeozrP6AT7wNZtVZyPLRyY8= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:bd0a:0:b0:7b3:f488:ea6d with SMTP id f10-20020a25bd0a000000b007b3f488ea6dmr674590ybk.311.1672967640100; Thu, 05 Jan 2023 17:14:00 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:13:00 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-28-seanjc@google.com> Subject: [PATCH v5 27/33] KVM: SVM: Require logical ID to be power-of-2 for AVIC entry From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233997652758959?= X-GMAIL-MSGID: =?utf-8?q?1754233997652758959?= Do not modify AVIC's logical ID table if the logical ID portion of the LDR is not a power-of-2, i.e. if the LDR has multiple bits set. Taking only the first bit means that KVM will fail to match MDAs that intersect with "higher" bits in the "ID" The "ID" acts as a bitmap, but is referred to as an ID because there's an implicit, unenforced "requirement" that software only set one bit. This edge case is arguably out-of-spec behavior, but KVM cleanly handles it in all other cases, e.g. the optimized logical map (and AVIC!) is also disabled in this scenario. Refactor the code to consolidate the checks, and so that the code looks more like avic_kick_target_vcpus_fast(). Fixes: 18f40c53e10f ("svm: Add VMEXIT handlers for AVIC") Cc: Suravee Suthikulpanit Cc: Maxim Levitsky Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/svm/avic.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 5b33f91b701c..eb979695e7d8 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -513,26 +513,26 @@ unsigned long avic_vcpu_get_apicv_inhibit_reasons(struct kvm_vcpu *vcpu) static u32 *avic_get_logical_id_entry(struct kvm_vcpu *vcpu, u32 ldr, bool flat) { struct kvm_svm *kvm_svm = to_kvm_svm(vcpu->kvm); - int index; u32 *logical_apic_id_table; - int dlid = GET_APIC_LOGICAL_ID(ldr); + u32 cluster, index; - if (!dlid) - return NULL; + ldr = GET_APIC_LOGICAL_ID(ldr); - if (flat) { /* flat */ - index = ffs(dlid) - 1; - if (index > 7) + if (flat) { + cluster = 0; + } else { + cluster = (ldr >> 4); + if (cluster >= 0xf) return NULL; - } else { /* cluster */ - int cluster = (dlid & 0xf0) >> 4; - int apic = ffs(dlid & 0x0f) - 1; - - if ((apic < 0) || (apic > 7) || - (cluster >= 0xf)) - return NULL; - index = (cluster << 2) + apic; + ldr &= 0xf; } + if (!ldr || !is_power_of_2(ldr)) + return NULL; + + index = __ffs(ldr); + if (WARN_ON_ONCE(index > 7)) + return NULL; + index += (cluster << 2); logical_apic_id_table = (u32 *) page_address(kvm_svm->avic_logical_id_table_page); From patchwork Fri Jan 6 01:13:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39883 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577841wrt; Thu, 5 Jan 2023 17:18:34 -0800 (PST) X-Google-Smtp-Source: AMrXdXtzZPYXhwSGln+mYzr5rCzdcnm9U1gVAB2It+qLULotHp2a5WbTg2XBoCiMhF7QnCzLCprh X-Received: by 2002:a05:6a21:e302:b0:a3:d6:8795 with SMTP id cb2-20020a056a21e30200b000a300d68795mr66927007pzc.17.1672967913864; Thu, 05 Jan 2023 17:18:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967913; cv=none; d=google.com; s=arc-20160816; b=NLrff4p3mTI0M67fSrXXwI1Ay5Gd9DgiWqWoVWKQBZlcR3Ek9Plcxa/4qnq/lTaWtw TOTwn+2e2JlLcubybOuMmTY+r+OYh4OSvy6r/0PkcpkxSHv/F2RcSm79W8PajXxHms1s IcG5JmoQVBJK0Hum/jvva9AOFvE/rUWgLFw5QiivBSEELNyx+9FGwKwr5A6gMomv94gL iV5O0KM/G2u7BVIWv50u6eK4QGFFkZHXMQYYq5kgbTM1dbtO9izjvQ9/oumGWaikGYkJ yy9ZEfg11ENJcvRw7dvxwxPouUlccr0TEdYp028t/PzIiOz8onBHWEbDJNGsp946a3mv GMiA== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=kgKvdTfQ27wv6seVSF5aAgO210OBrcuZvgQgigmAgek=; b=kJtBGLC6OimQ+LXR1EKui1tAcL/JbwqeaE+GhMsLdvX2fTn6sVXQw7oKhMwl1MM9P3 N9jFRl2JIG8erCB88dHJ4INimQh0gLjG819x7GxCFFUOKBvhw3Byx5Ucfn9MhkV/VJZi HElNQ4XWYTNd5ifHRtBKlFg/VPdKj6JZIe3wFpGLhqMecl90PKmygmIypgpNjALpqIP0 c9CiQUEZ2iVQILiE68JxcyrcxbGVTh83fSXkJ1EdisrlatuejaaTzPWHogglpDD29ir1 RMLgR0B4XOyt5HBwiCom0//7wroLc5O96hqAZESnD+jXNT37P7xnZhLy8Hsm84fj0vms 2+uA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=WJv9DzW7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id px14-20020a17090b270e00b00219a48a3bf9si3171720pjb.93.2023.01.05.17.18.21; Thu, 05 Jan 2023 17:18:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=WJv9DzW7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S232228AbjAFBRX (ORCPT + 99 others); Thu, 5 Jan 2023 20:17:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41350 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232168AbjAFBQ2 (ORCPT ); Thu, 5 Jan 2023 20:16:28 -0500 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C669D65AEB for ; Thu, 5 Jan 2023 17:14:21 -0800 (PST) Received: by mail-pf1-x449.google.com with SMTP id bx21-20020a056a00429500b00582d85bb03bso35761pfb.16 for ; Thu, 05 Jan 2023 17:14:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=kgKvdTfQ27wv6seVSF5aAgO210OBrcuZvgQgigmAgek=; b=WJv9DzW7OiR5WxhCTMswF2puPwUNWRNLasJ4h3JJ3mwxe13GYAmZ+MCwjs0kXjBg0v Mv0JiXikj5UXUyf3Q7VFTI2RxiiDCS1Aq09YHScmHzn6YK2l0qRFB9713Vqmf/At92QU VPHkLv78SiClzvEy/3z0eV1D60+5F5LDoiilczrSvFYkD9QMY8xo+LGRGsiTe9hsxoWp U2Z8DnSXNNc0TXoqRwMqEuldIle0PtrgK4nbuO8TK4nvH+DBn6o0uAMPPiU4ZIWgCCOe 0ucXFRf10VCnvSydh5GnIZD2vQJCE6fnMFBK+e5WubcHBAvjx8hJUemWLu/Fwlgdffie Qnxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=kgKvdTfQ27wv6seVSF5aAgO210OBrcuZvgQgigmAgek=; b=XBSoV6r9CIjxH/qAThfRr2oMYH7Pjs1zD2hrcDtmcTZFgkVHryxfe9NoEk5flUPwev 7ttxp2EsJ8AQjcg+lJdLJAStwxm+SJKvVUKY1yTOeqxioh1GsSg8ONWArOO2zp2i+ZZ+ bMw2NG/zCGSEaYZAUQCzKhTpQTWrJjcuQO20gBhnAZFGl+dOeByvk7G21TyclUbbHO3K E18pTkKj4Sp97Hxe9lPptVvXPv02ZgTKoMLm52c3uHZ5g7ieo56XU6GkHRP+zz4vZy0K TviYQFe3FCAP2yMiRMINRAL2DoVactlhviS+Niq9UFQAWFhdRXxGpsrWNMWrX1+T4peo erlw== X-Gm-Message-State: AFqh2krOnLFT7flA70kPZkif+2Cy2lSgecC0lF/zIbe7uyxkblj4PLcm U3zA57AHfIMkGDpEi3EXnz9MRxhWvLI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:bd12:b0:225:b164:8874 with SMTP id y18-20020a17090abd1200b00225b1648874mr4020777pjr.87.1672967641623; Thu, 05 Jan 2023 17:14:01 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:13:01 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-29-seanjc@google.com> Subject: [PATCH v5 28/33] KVM: SVM: Handle multiple logical targets in AVIC kick fastpath From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754234003348650413?= X-GMAIL-MSGID: =?utf-8?q?1754234003348650413?= Iterate over all target logical IDs in the AVIC kick fastpath instead of bailing if there is more than one target. Now that KVM inhibits AVIC if vCPUs aren't mapped 1:1 with logical IDs, each bit in the destination is guaranteed to match to at most one vCPU, i.e. iterating over the bitmap is guaranteed to kick each valid target exactly once. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 112 ++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 49 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index eb979695e7d8..2c6737f72bd4 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -327,6 +327,50 @@ static void avic_kick_vcpu(struct kvm_vcpu *vcpu, u32 icrl) icrl & APIC_VECTOR_MASK); } +static void avic_kick_vcpu_by_physical_id(struct kvm *kvm, u32 physical_id, + u32 icrl) +{ + /* + * KVM inhibits AVIC if any vCPU ID diverges from the vCPUs APIC ID, + * i.e. APIC ID == vCPU ID. + */ + struct kvm_vcpu *target_vcpu = kvm_get_vcpu_by_id(kvm, physical_id); + + /* Once again, nothing to do if the target vCPU doesn't exist. */ + if (unlikely(!target_vcpu)) + return; + + avic_kick_vcpu(target_vcpu, icrl); +} + +static void avic_kick_vcpu_by_logical_id(struct kvm *kvm, u32 *avic_logical_id_table, + u32 logid_index, u32 icrl) +{ + u32 physical_id; + + if (avic_logical_id_table) { + u32 logid_entry = avic_logical_id_table[logid_index]; + + /* Nothing to do if the logical destination is invalid. */ + if (unlikely(!(logid_entry & AVIC_LOGICAL_ID_ENTRY_VALID_MASK))) + return; + + physical_id = logid_entry & + AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK; + } else { + /* + * For x2APIC, the logical APIC ID is a read-only value that is + * derived from the x2APIC ID, thus the x2APIC ID can be found + * by reversing the calculation (stored in logid_index). Note, + * bits 31:20 of the x2APIC ID aren't propagated to the logical + * ID, but KVM limits the x2APIC ID limited to KVM_MAX_VCPU_IDS. + */ + physical_id = logid_index; + } + + avic_kick_vcpu_by_physical_id(kvm, physical_id, icrl); +} + /* * A fast-path version of avic_kick_target_vcpus(), which attempts to match * destination APIC ID to vCPU without looping through all vCPUs. @@ -334,11 +378,10 @@ static void avic_kick_vcpu(struct kvm_vcpu *vcpu, u32 icrl) static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source, u32 icrl, u32 icrh, u32 index) { - u32 l1_physical_id, dest; - struct kvm_vcpu *target_vcpu; int dest_mode = icrl & APIC_DEST_MASK; int shorthand = icrl & APIC_SHORT_MASK; struct kvm_svm *kvm_svm = to_kvm_svm(kvm); + u32 dest; if (shorthand != APIC_DEST_NOSHORT) return -EINVAL; @@ -355,14 +398,14 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source if (!apic_x2apic_mode(source) && dest == APIC_BROADCAST) return -EINVAL; - l1_physical_id = dest; - - if (WARN_ON_ONCE(l1_physical_id != index)) + if (WARN_ON_ONCE(dest != index)) return -EINVAL; + avic_kick_vcpu_by_physical_id(kvm, dest, icrl); } else { - u32 bitmap, cluster; - int logid_index; + u32 *avic_logical_id_table; + unsigned long bitmap, i; + u32 cluster; if (apic_x2apic_mode(source)) { /* 16 bit dest mask, 16 bit cluster id */ @@ -382,50 +425,21 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source if (unlikely(!bitmap)) return 0; - if (!is_power_of_2(bitmap)) - /* multiple logical destinations, use slow path */ - return -EINVAL; - - logid_index = cluster + __ffs(bitmap); - - if (apic_x2apic_mode(source)) { - /* - * For x2APIC, the logical APIC ID is a read-only value - * that is derived from the x2APIC ID, thus the x2APIC - * ID can be found by reversing the calculation (done - * above). Note, bits 31:20 of the x2APIC ID are not - * propagated to the logical ID, but KVM limits the - * x2APIC ID limited to KVM_MAX_VCPU_IDS. - */ - l1_physical_id = logid_index; - } else { - u32 *avic_logical_id_table = - page_address(kvm_svm->avic_logical_id_table_page); - - u32 logid_entry = avic_logical_id_table[logid_index]; - - if (WARN_ON_ONCE(index != logid_index)) - return -EINVAL; - - /* Nothing to do if the logical destination is invalid. */ - if (unlikely(!(logid_entry & AVIC_LOGICAL_ID_ENTRY_VALID_MASK))) - return 0; - - l1_physical_id = logid_entry & - AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK; - } + if (apic_x2apic_mode(source)) + avic_logical_id_table = NULL; + else + avic_logical_id_table = page_address(kvm_svm->avic_logical_id_table_page); + + /* + * AVIC is inhibited if vCPUs aren't mapped 1:1 with logical + * IDs, thus each bit in the destination is guaranteed to map + * to at most one vCPU. + */ + for_each_set_bit(i, &bitmap, 16) + avic_kick_vcpu_by_logical_id(kvm, avic_logical_id_table, + cluster + i, icrl); } - /* - * KVM inhibits AVIC if any vCPU ID diverges from the vCPUs APIC ID, - * i.e. APIC ID == vCPU ID. Once again, nothing to do if the target - * vCPU doesn't exist. - */ - target_vcpu = kvm_get_vcpu_by_id(kvm, l1_physical_id); - if (unlikely(!target_vcpu)) - return 0; - - avic_kick_vcpu(target_vcpu, icrl); return 0; } From patchwork Fri Jan 6 01:13:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39886 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp578381wrt; Thu, 5 Jan 2023 17:19:57 -0800 (PST) X-Google-Smtp-Source: AMrXdXvSCf1BpbCc3lj6VsGhOfHIHXG2mmS0FKA02jQGyO/o1ZKlcvxrmsY13MJ1WI8+oKajztAV X-Received: by 2002:a05:6402:2146:b0:46c:7035:2f6d with SMTP id bq6-20020a056402214600b0046c70352f6dmr49158940edb.38.1672967997358; Thu, 05 Jan 2023 17:19:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967997; cv=none; d=google.com; s=arc-20160816; b=t5pBHjVklDMdnok4AOHSkIOWj2gPxFGTv0r+sqdg7dbzGDGn4DtQkuwIpkR/X4BnfG w4jVXzG91CH0ZSOVCKfkYt6eE1XIfVb4t//Hec3xloFnXccQdnlYn2DQ/sqekkc1MgRo mhItNDBzgaDTDTn9PvCZ7ueK2rT9iFirrP+375ba1WKnVgxWTAKDyGG6DTlL/poID0/w 6Wqdl7cH3xpMjZRdMguNYmamP2AYCrm+HW3dQ+Kl9Xpx387pjoQJeeFJOk9s26ZyX1qd LrI0ul2v2z3uNLx0xdZLQbMbzV7Z2kNoCbeVLzmt8ivvE0t2SLQHUydts9MWpWmPilwf Wugg== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=0PXIy8RA30k82n5MqadBULMYpw3jcQQNxAI0MLkfm2o=; b=SpeFxUtYWeObmiKyD/p3r2LQI4HCMXN7wa/qbdNSKwHa8U5imcZ5zMzifbKbRL0q59 SSOqJS/NZqjGOncYZPe72qUlJrKsQKEm/k8cOk0PkHE2ARzr2b1FLcE8L8RQxviOxYXx qCQ5pjQIySesnyrN7o9r6YTTaWIf1BN9TMbA/XgGSNOxqvhOor7uePR0ZEZXL5YSd14m 99eLP1kNTrMVUVP7WhEVM+JkCzdqXHPRWaVgqcky8qqw+8bURITSUA2o30muvWc2EBpE kNqZ64vo8ia4B6y4zudXNHxVbdwXliREAf3N/CUw1WfNXqMfhBw0i9m6ybDX+/T32JNu 3GYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=ARYzhqPu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id dd12-20020a1709069b8c00b0082b7e633997si38506012ejc.434.2023.01.05.17.19.33; Thu, 05 Jan 2023 17:19:57 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=ARYzhqPu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S233812AbjAFBRa (ORCPT + 99 others); Thu, 5 Jan 2023 20:17:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39668 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232814AbjAFBQa (ORCPT ); Thu, 5 Jan 2023 20:16:30 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CF8C765AF2 for ; Thu, 5 Jan 2023 17:14:22 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-47ede4426e1so3120787b3.7 for ; Thu, 05 Jan 2023 17:14:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=0PXIy8RA30k82n5MqadBULMYpw3jcQQNxAI0MLkfm2o=; b=ARYzhqPubKAcUMlq5dSBX0xvRbkdMD3Z7If0ag7prbjxIne2GkJ8lAhHrtaEOpMtq7 wIIAhYz1/Ajx9d5Cslo0C4NAiwSy8WApA2ndyhaXFs6IngyBWHUw8/RvgrKmAvHUhpkO cyOgu6KCI3mBFPHHb5Py5lPdjDvIYKL4PgTbXDJoeb9G5AmvTkBPp7JhJ96D5XJeOmNF H71WGUwe4Z9AK+ykt/tiEyDRK2He33wLTdGnjX2xFBC78IVPGeo7k2WIXLG0DcCUuoTc xxOGpURmrBMBR/Kj4dorDzcHumIWTMXaSANO4lHr0MkNbDkcual08RTxiy0tgP3OCVKT 4hUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=0PXIy8RA30k82n5MqadBULMYpw3jcQQNxAI0MLkfm2o=; b=vCoZhtwVQpHeNmymXkVIXtq6YTrS0tyIqlCkjrrekGFFl53Rtoo3B1N/KlycD2Fb0R inpI0m8i+kQw3MpObC4qQyIMz2Z1tIy5TpDvlq3RBl+ADVXQmmDIiVydzl5NpJSIcYC1 KeAmaW4VC+/MBpGuaoiM95H5IKgLGj1zOP++vrXLeqgbJhFR6fPUlX+Ku/6+lBFYxgXJ lm1U0x90ROO8J+IgZqj0aVpHo+R5ap1QOr2Fq2ed15qFZn3/3KusB1PYZzfi5PfxHEzZ OXmZ/wkJ3LIbGCIAf0kUFXzDbFERG2DswQ3sXIj4uNgRUFyi+AnO+DCh80zn/CXdCOIR SP2w== X-Gm-Message-State: AFqh2kr8f4nPYGfjD/IgnOS9KPZ1FxuK/9XcxtQj0dhPoWcoF2mw21WL W3J3z0QJhvMYIQEO6Q0U3DrYEUr0Zo8= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:d095:0:b0:7b6:daae:ad50 with SMTP id h143-20020a25d095000000b007b6daaead50mr235713ybg.89.1672967643231; Thu, 05 Jan 2023 17:14:03 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:13:02 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-30-seanjc@google.com> Subject: [PATCH v5 29/33] KVM: SVM: Ignore writes to Remote Read Data on AVIC write traps From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754234090761218022?= X-GMAIL-MSGID: =?utf-8?q?1754234090761218022?= Drop writes to APIC_RRR, a.k.a. Remote Read Data Register, on AVIC unaccelerated write traps. The register is read-only and isn't emulated by KVM. Sending the register through kvm_apic_write_nodecode() will result in screaming when x2APIC is enabled due to the unexpected failure to retrieve the MSR (KVM expects that only "legal" accesses will trap). Fixes: 4d1d7942e36a ("KVM: SVM: Introduce logic to (de)activate x2AVIC mode") Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/svm/avic.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 2c6737f72bd4..ff08732469cb 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -628,6 +628,9 @@ static int avic_unaccel_trap_write(struct kvm_vcpu *vcpu) case APIC_DFR: avic_handle_dfr_update(vcpu); break; + case APIC_RRR: + /* Ignore writes to Read Remote Data, it's read-only. */ + return 1; default: break; } From patchwork Fri Jan 6 01:13:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39885 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp578378wrt; Thu, 5 Jan 2023 17:19:56 -0800 (PST) X-Google-Smtp-Source: AMrXdXsa7Gi6eBG9gLfmhc9l/fwq1HBUtky3Dhn4pE61HikRr/fTxELmnKHscDQarW1HaEEF8DSY X-Received: by 2002:a05:6402:25cc:b0:45c:835b:9461 with SMTP id x12-20020a05640225cc00b0045c835b9461mr47717296edb.29.1672967996635; Thu, 05 Jan 2023 17:19:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967996; cv=none; d=google.com; s=arc-20160816; b=cZnyjr9Neu5CUG1BpLB5HvHRqajl/sYWOBkz4KmH9kArN5p7zUxmTjdghIC/Fj9mnS lHPd1nbu+sb8cB1sOp/UOOTpEgmGGjvzsavVUJauFEyFXRww7kvMOCZaTKDoKlaKemCq DzUx/MULXuKKuDaJ1hinLdw4VpIKUirlTazniBgo7O+4sV/6MG4MpqKiUopA/h1odR8K 7FdHl83r7Ghl8zkGMjZujH/2k0G30ef9+mqnUoO1fZnf6AJaDo5miVRP5OP63uRHt7FU KflGnyp0j7StI9o3hqxJEgiAnQNwnJFBisLbT3RE+emLAw7HIcIBDoMBgqeVVEyAqks8 6o7A== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=W3CTpeuTrONtPW+ec2MrTe8ezQAG+SLQuSBj7Ovyik8=; b=faNt4qVonLuwJcqoEmygB0G70m099LvQfzFjQ9QlyvyacdxmlbP26xkA3+f6XCGib7 7n9p918PbtQFSRisujG9MqUSMWR2DPzyduQUmIA+eYDsTMTpwG2ae7IMaxknMc0cJWon uQHf3BPozx0OrxhfOqO/9azYwSf9yIrYAVwtk6HiP2/IY/656DF3T5UZo7/YxjyAOE0a o7rXF7EWdCJEw6aZ0oCGY03oc5djkkvfDENDl3l8+9S8me8HFGGjJ+HS46d4h9vzcYRk eeXJsmcB1QDUF1qP2pvw+IVG4/METIzV9mOJDJJM50z8EjMnH9Of143KArcfWw5FzhNG vbSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=S6d4NqHL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id q14-20020a056402248e00b004859d0f61e0si26089241eda.380.2023.01.05.17.19.33; Thu, 05 Jan 2023 17:19:56 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=S6d4NqHL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S233980AbjAFBRm (ORCPT + 99 others); Thu, 5 Jan 2023 20:17:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233100AbjAFBQf (ORCPT ); Thu, 5 Jan 2023 20:16:35 -0500 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D494D66A46 for ; Thu, 5 Jan 2023 17:14:26 -0800 (PST) Received: by mail-pl1-x649.google.com with SMTP id u2-20020a17090341c200b00192bc565119so113041ple.16 for ; Thu, 05 Jan 2023 17:14:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=W3CTpeuTrONtPW+ec2MrTe8ezQAG+SLQuSBj7Ovyik8=; b=S6d4NqHLamXPB3TUzvg3wWGtflUgM+3032jxUGcWO+TIgGbYTgEZ1dItWZfCPcvS28 iXiyK0PdzysKJ3KTu6Vh++OXSwnsJjuZYij3xPUTqg48YQLoigPTIE+PNWDsCfWZ05sp 5UXanJYrEQPO/nX6a/lpM3SyeQFam6jOg7eWs4/vILF0zjgMJ+ozejPA1ldsMHpnuTlW l9iOORsEIXr1u9vl+1jNxDhB125UO1MvGvwE1MjXJiiQsPS3/+Ye/MSHUYhlAC/i8aBe e6tsoVldGRzmGu+eMdRHuhLOUBg9x9DNQmGvOQo2AEHznkFuR/mgi8UDZin3miEW1ZWb nWjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=W3CTpeuTrONtPW+ec2MrTe8ezQAG+SLQuSBj7Ovyik8=; b=rkIcHaF/fcTiOp0HQLduRp/ogrp2oEFLv8Xuj0RomG1LT2l4UKJk1GMejcPHnp0/aX P7v55pCjqFd1dZrDipxm4QBJULO3MuI8Cb5aETUM/U8M2Imh5LwyNqjx7FB6XYRwwMYP z44Y1Csf+rljcIT37NDb8r9OZoDl9eupzxvzkbgOcyzqkV5GvJsV2yzg5ruTTk5vHHjF yB1JyBE6UQvfykWVK+WrtADTKe23eGhqv58CAPR+eIF8cBoGlaDlqXMMRmyKbJ2LdWPI 7Q7yR62qxyw636gXe4v1zwcmkae6LjdnZn7aHFD5orzbPc2iWumvd/DNVyyHgulYurPT Gm1Q== X-Gm-Message-State: AFqh2kqxDed6cEv8fhADuycuVzAGSREpwJtq8W/JHxKLoFzh1ZiiB6o0 CwxcT84/6UHBDnWJKLeLy2QwlBYUtYU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a62:7986:0:b0:581:5a36:b2f8 with SMTP id u128-20020a627986000000b005815a36b2f8mr2165620pfc.32.1672967645128; Thu, 05 Jan 2023 17:14:05 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:13:03 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-31-seanjc@google.com> Subject: [PATCH v5 30/33] Revert "KVM: SVM: Do not throw warning when calling avic_vcpu_load on a running vcpu" From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754234089966777031?= X-GMAIL-MSGID: =?utf-8?q?1754234089966777031?= Turns out that some warnings exist for good reasons. Restore the warning in avic_vcpu_load() that guards against calling avic_vcpu_load() on a running vCPU now that KVM avoids doing so when switching between x2APIC and xAPIC. The entire point of the WARN is to highlight that KVM should not be reloading an AVIC. Opportunistically convert the WARN_ON() to WARN_ON_ONCE() to avoid spamming the kernel if it does fire. This reverts commit c0caeee65af3944b7b8abbf566e7cc1fae15c775. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index ff08732469cb..80f346b79c62 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -1034,6 +1034,7 @@ void avic_vcpu_load(struct kvm_vcpu *vcpu, int cpu) return; entry = READ_ONCE(*(svm->avic_physical_id_cache)); + WARN_ON_ONCE(entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK); entry &= ~AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK; entry |= (h_physical_id & AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK); From patchwork Fri Jan 6 01:13:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39878 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp577622wrt; Thu, 5 Jan 2023 17:17:55 -0800 (PST) X-Google-Smtp-Source: AMrXdXsNOdQcbRN2dvMHpEWrrNZWTNRNiDkYTOmdVMTnErov4/klAjutLDf0raN4Y1FUfJGGEwDS X-Received: by 2002:a17:907:b684:b0:7c0:a99c:485c with SMTP id vm4-20020a170907b68400b007c0a99c485cmr50408667ejc.68.1672967875093; Thu, 05 Jan 2023 17:17:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672967875; cv=none; d=google.com; s=arc-20160816; b=gokP2jlkkhcSjw9Bp3hKg6+Ezbg3+HydkA8p7aMfml1OU2PGVfcZ8NJXszjTQucEyK tM5DIUudNkYIhBWn4Y1NvtqZhvFULKq/aJfB/ODv3ALoEcS5hasJSN4054fewvRu4s7M huyRVfaUDVc0U1HJ2bol871cHygS3dVqJ1GuQwR5wgqrayUyp6v+fhbKF2KCdOBwgkHj Dc5MtUEI14cui2n0WIVDMoywUubogUw6jz7Q38JsVUVWMKxztpg9dpMSvmdLsg8uLTxj DCYT5m6bkzkFGYZz6JMkxMDgPleM08JYv8aaN7qUBhX9Plb2PF8CbcxdQxblePCxkYai KD4A== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=cR/0ceEXEHjIeOFsd1KOHfCSQeyMtOUPjLT+49U/bNY=; b=cCSH5kkVLXZ5lTfM5Xjrk6RVTXS7x3lhV0oa4AoARRWyVJ39WndUyIxK36WZZ02iYE I8omO6+2ulVItjyyBHi62a1qEzQ5dG11FV0BDzG/a8U8Gl3hrnHIg12T8MVxb+asCJdm Ti1WITsf0LnkynWC7Tcov8YwBtpfeowPIDnItnfp1lToG8Cxaq2ttT/ORbBH6H/pOyQG lWKnxPGtsfrqRn6g9QDvjekc/04Fe/lFbGAnCoK+7CXY59DcEGkfKSxmRmdqkN3jnVIJ PkjxyVHWTgbcPKy4d9VGxifDEf86N/OnbFhdZjMQP3SKha7/7LSsXjsuNiBcekPWp8Wi mQtg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=KUx3F3fV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o13-20020a17090611cd00b007c0dcc41dbasi31812958eja.879.2023.01.05.17.17.31; Thu, 05 Jan 2023 17:17:55 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=KUx3F3fV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S232877AbjAFBQb (ORCPT + 99 others); Thu, 5 Jan 2023 20:16:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232211AbjAFBP5 (ORCPT ); Thu, 5 Jan 2023 20:15:57 -0500 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1BFEA3E84E for ; Thu, 5 Jan 2023 17:14:07 -0800 (PST) Received: by mail-pg1-x54a.google.com with SMTP id 84-20020a630257000000b00477f88d334eso206611pgc.11 for ; Thu, 05 Jan 2023 17:14:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=cR/0ceEXEHjIeOFsd1KOHfCSQeyMtOUPjLT+49U/bNY=; b=KUx3F3fVD+glWOuqkHgxHp63h2M/R8XvEJtJC5/Er2iHJUSIKfZVgKor5axiG7oSmw M59DpMcb/+ssrKmnfGF5Jt6CxdEKCndq8qtx1NhNMNCMjzQKepuUMtTfaZBCg3OEronK lOY42an0Tv2CMbi8cYn8EFFoWA5vPA91dizfRYNVWltzCtKEXt26bOV+CMagEXGPaOzy J3fQgQDdPqNnHFtgTm4BwdgvlkV8QCSGzJB8sunc072rV+JDbBb5U3JE2f9LeH0rOmxo 1GlM0OFV/jKGjOSTwr6jwgXbFAfAOxwFLb0x8934veHGjFRcsALCV/53gVuhAPRD9paf slew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=cR/0ceEXEHjIeOFsd1KOHfCSQeyMtOUPjLT+49U/bNY=; b=E41XREJjjbJjQf8S7zFLbeALtYnJKrkE3UGC0Byw1MUy+ME9I046NMkV8CFn7RjXFH Jw+P4pVU2JvnaWbWXriSevXz/4yH+n5f+CmcsaBCr1tbi1sYW7C/j+lQJ5ExpZ44RnDI nZk9YztJuxkdoZ6u19mTKwin+6VyFNYm8Dxo5R6I0WaA0H4jzi8KNh9JkS2iPujH75CU pECYHgGHdWIPY9PesI238IyLN+jb4nkdy3sMkxaSSAfDCAjo9FCahGKg26U2Y5JJpvry XoIQO4LUCBiFqL7gIm5bHBDUWeOnY+8ibVJTIB64TdQ9t5FcCl7q/phQFk7qdIcVLDY8 I9FQ== X-Gm-Message-State: AFqh2kqLO7JKXaLAJ36YVwmUuA+O2hu6AdoWQXqIKe3Pl+TLEZV3oGBj tLXFNUxmDLFqQkUlpem3cwiu+kth8ic= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:aa7:9a5d:0:b0:580:984e:6e3f with SMTP id x29-20020aa79a5d000000b00580984e6e3fmr3666194pfj.66.1672967646823; Thu, 05 Jan 2023 17:14:06 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:13:04 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-32-seanjc@google.com> Subject: [PATCH v5 31/33] KVM: x86: Track required APICv inhibits with variable, not callback From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754233962788454361?= X-GMAIL-MSGID: =?utf-8?q?1754233962788454361?= Track the per-vendor required APICv inhibits with a variable instead of calling into vendor code every time KVM wants to query the set of required inhibits. The required inhibits are a property of the vendor's virtualization architecture, i.e. are 100% static. Using a variable allows the compiler to inline the check, e.g. generate a single-uop TEST+Jcc, and thus eliminates any desire to avoid checking inhibits for performance reasons. No functional change intended. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm-x86-ops.h | 1 - arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/svm/avic.c | 19 ------------------- arch/x86/kvm/svm/svm.c | 2 +- arch/x86/kvm/svm/svm.h | 16 +++++++++++++++- arch/x86/kvm/vmx/vmx.c | 24 +++++++++++------------- arch/x86/kvm/x86.c | 2 +- 7 files changed, 29 insertions(+), 36 deletions(-) diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-x86-ops.h index abccd51dcfca..84f43caef9b7 100644 --- a/arch/x86/include/asm/kvm-x86-ops.h +++ b/arch/x86/include/asm/kvm-x86-ops.h @@ -76,7 +76,6 @@ KVM_X86_OP(set_nmi_mask) KVM_X86_OP(enable_nmi_window) KVM_X86_OP(enable_irq_window) KVM_X86_OP_OPTIONAL(update_cr8_intercept) -KVM_X86_OP(check_apicv_inhibit_reasons) KVM_X86_OP(refresh_apicv_exec_ctrl) KVM_X86_OP_OPTIONAL(hwapic_irr_update) KVM_X86_OP_OPTIONAL(hwapic_isr_update) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index b41a01b3a4af..7ca854714ccd 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1623,6 +1623,7 @@ struct kvm_x86_ops { void (*enable_irq_window)(struct kvm_vcpu *vcpu); void (*update_cr8_intercept)(struct kvm_vcpu *vcpu, int tpr, int irr); bool (*check_apicv_inhibit_reasons)(enum kvm_apicv_inhibit reason); + const unsigned long required_apicv_inhibits; bool allow_apicv_in_x2apic_without_x2apic_virtualization; void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *vcpu); void (*hwapic_irr_update)(struct kvm_vcpu *vcpu, int max_irr); diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 80f346b79c62..14677bc31b83 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -963,25 +963,6 @@ int avic_pi_update_irte(struct kvm *kvm, unsigned int host_irq, return ret; } -bool avic_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason) -{ - ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE) | - BIT(APICV_INHIBIT_REASON_ABSENT) | - BIT(APICV_INHIBIT_REASON_HYPERV) | - BIT(APICV_INHIBIT_REASON_NESTED) | - BIT(APICV_INHIBIT_REASON_IRQWIN) | - BIT(APICV_INHIBIT_REASON_PIT_REINJ) | - BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | - BIT(APICV_INHIBIT_REASON_SEV) | - BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | - BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | - BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED) | - BIT(APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED); - - return supported & BIT(reason); -} - - static inline int avic_update_iommu_vcpu_affinity(struct kvm_vcpu *vcpu, int cpu, bool r) { diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 9f172f2de195..f2453df77727 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -4773,8 +4773,8 @@ static struct kvm_x86_ops svm_x86_ops __initdata = { .update_cr8_intercept = svm_update_cr8_intercept, .set_virtual_apic_mode = avic_refresh_virtual_apic_mode, .refresh_apicv_exec_ctrl = avic_refresh_apicv_exec_ctrl, - .check_apicv_inhibit_reasons = avic_check_apicv_inhibit_reasons, .apicv_post_state_restore = avic_apicv_post_state_restore, + .required_apicv_inhibits = AVIC_REQUIRED_APICV_INHIBITS, .get_exit_info = svm_get_exit_info, diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index 546825c82490..41eabb098b13 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -621,6 +621,21 @@ void svm_switch_vmcb(struct vcpu_svm *svm, struct kvm_vmcb_info *target_vmcb); extern struct kvm_x86_nested_ops svm_nested_ops; /* avic.c */ +#define AVIC_REQUIRED_APICV_INHIBITS \ +( \ + BIT(APICV_INHIBIT_REASON_DISABLE) | \ + BIT(APICV_INHIBIT_REASON_ABSENT) | \ + BIT(APICV_INHIBIT_REASON_HYPERV) | \ + BIT(APICV_INHIBIT_REASON_NESTED) | \ + BIT(APICV_INHIBIT_REASON_IRQWIN) | \ + BIT(APICV_INHIBIT_REASON_PIT_REINJ) | \ + BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | \ + BIT(APICV_INHIBIT_REASON_SEV) | \ + BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | \ + BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | \ + BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED) | \ + BIT(APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED) \ +) bool avic_hardware_setup(struct kvm_x86_ops *ops); int avic_ga_log_notifier(u32 ga_tag); @@ -634,7 +649,6 @@ void avic_vcpu_load(struct kvm_vcpu *vcpu, int cpu); void avic_vcpu_put(struct kvm_vcpu *vcpu); void avic_apicv_post_state_restore(struct kvm_vcpu *vcpu); void avic_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu); -bool avic_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason); int avic_pi_update_irte(struct kvm *kvm, unsigned int host_irq, uint32_t guest_irq, bool set); void avic_vcpu_blocking(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index ef84d11a0fe4..ad2ac66ef32e 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -8023,18 +8023,16 @@ static void vmx_hardware_unsetup(void) free_kvm_area(); } -static bool vmx_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason) -{ - ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE) | - BIT(APICV_INHIBIT_REASON_ABSENT) | - BIT(APICV_INHIBIT_REASON_HYPERV) | - BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | - BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | - BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | - BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED); - - return supported & BIT(reason); -} +#define VMX_REQUIRED_APICV_INHIBITS \ +( \ + BIT(APICV_INHIBIT_REASON_DISABLE)| \ + BIT(APICV_INHIBIT_REASON_ABSENT) | \ + BIT(APICV_INHIBIT_REASON_HYPERV) | \ + BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | \ + BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | \ + BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | \ + BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED) \ +) static void vmx_vm_destroy(struct kvm *kvm) { @@ -8118,7 +8116,7 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = { .refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl, .load_eoi_exitmap = vmx_load_eoi_exitmap, .apicv_post_state_restore = vmx_apicv_post_state_restore, - .check_apicv_inhibit_reasons = vmx_check_apicv_inhibit_reasons, + .required_apicv_inhibits = VMX_REQUIRED_APICV_INHIBITS, .hwapic_irr_update = vmx_hwapic_irr_update, .hwapic_isr_update = vmx_hwapic_isr_update, .guest_apic_has_interrupt = vmx_guest_apic_has_interrupt, diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 1abe3f1e821c..5becce5bd45a 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10112,7 +10112,7 @@ void __kvm_set_or_clear_apicv_inhibit(struct kvm *kvm, lockdep_assert_held_write(&kvm->arch.apicv_update_lock); - if (!static_call(kvm_x86_check_apicv_inhibit_reasons)(reason)) + if (!(kvm_x86_ops.required_apicv_inhibits & BIT(reason))) return; old = new = kvm->arch.apicv_inhibit_reasons; From patchwork Fri Jan 6 01:13:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39887 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp578512wrt; Thu, 5 Jan 2023 17:20:21 -0800 (PST) X-Google-Smtp-Source: AMrXdXvi0lC+FV2IDhjwP9So9IShxUBLKSnrE2FPheczV/uv+IrNYWyzAd4JFNsJ1Qii4uxGbc+7 X-Received: by 2002:a17:906:f13:b0:7b2:7a42:3e43 with SMTP id z19-20020a1709060f1300b007b27a423e43mr43742534eji.23.1672968021219; Thu, 05 Jan 2023 17:20:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672968021; cv=none; d=google.com; s=arc-20160816; b=zRUmibaE6pPbVsPA+6DEfuIwqMVAqnv4nboL/Rg15zZIjj++AX31xjJyPhhF8eRnCb KMNzrkXx8BnI4Pm9VE9iVi+Hn71LDYFj6azKNHYX9i4Kfecr2n49aFNRr4AhhLy+4xmT iNFvmNkPe2uA/2LIgHPfkc1PDDLnYtPfygSOyEY2MS9tw4NsNb6h0JIQLY5FjE7f+RHh ifwiu9ix8sWaDpDsRb5O0mUdqh5bCLxt/ZsEMFks5/7TnNj+s/dd57AXM9I1eEavfR0l j2881Al8RitJxQBaclFOKZeLwwfOXU10+Ueibs/1se//6bzx2aLGqHTSS3qyZ9NF6SQv z7JQ== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=yPL//5YzExDyFBxSbINxOiuXfpNssPuyAQmCUXdDYKM=; b=SK0Kj3C8NbemUIijWPiRQx+V7iriZH4CcaaKeJx7IdKZO1U9Wvz1OdVK50Ar8va+nu VckIOXFHdkQCgSuErQyZ+ng5LvNUa/htPiRZsbUbvEm27o0cV7VR6BYqCQTAPd/K/EOK 6q96ZMO5ZZS4QDBi7jmHKX4Tdsbyjz2KGpUOENS0l1zH8xwz2f353RyeYm/5sAIEPPVw 2+KF7MuRhMpjQXzvROr/jZBMX6X+U+Mqm21rvGSGkZkDSxJvK8gw/21o7jnDCWeivWlt EPObWwWJ3tlqP6xrZWYiH3N4hYyahy+6CChwMDsvY551TKzffSrOSTyW1K5laeR2CS4w AeBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=ITnWjyO8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id wz2-20020a170906fe4200b007adb868f102si6223220ejb.476.2023.01.05.17.19.57; Thu, 05 Jan 2023 17:20:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=ITnWjyO8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S232114AbjAFBR7 (ORCPT + 99 others); Thu, 5 Jan 2023 20:17:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233723AbjAFBRZ (ORCPT ); Thu, 5 Jan 2023 20:17:25 -0500 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1F56766A7D for ; Thu, 5 Jan 2023 17:14:35 -0800 (PST) Received: by mail-pg1-x54a.google.com with SMTP id j21-20020a63fc15000000b00476d6932baeso189878pgi.23 for ; Thu, 05 Jan 2023 17:14:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=yPL//5YzExDyFBxSbINxOiuXfpNssPuyAQmCUXdDYKM=; b=ITnWjyO8T1tXSabcL3f42Ng1M0AJc9npIkp2Q59qXsQHAoNEWBngWKNIEljJYY382P LjtIJQ0Gi2WcpaeGsFihuIZREDskbZrPunbY5mFmnDacbZQh63sCnnSS7VGgSSbmF8dd xH2lpUiFMQDIADtGR/as+G9a0NeTzCS7ogR5daO6pwh0033NZIzhL/y0Hsi26sJxIUGG 16tZdGTzB/m6SXpPzljyu/GHbv6GD7dEWFVUTvG4YgHjTR8WwmAxhOdMOYpZ7bzO8jN7 gEThBdfPXiNp6fgcIBGDUdrZBodxgpm8T3oPtVVOIMIqi2WtPMICCdENwk+xIajOqJUZ rNxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=yPL//5YzExDyFBxSbINxOiuXfpNssPuyAQmCUXdDYKM=; b=Km1+JrrX37vD8BoMJ0zIoYGgGkYUz1ehZh6gDSUPLqIFHm0cRsF2BebL1NCLd4apEh KK58/RGR4MMdtioTs+XtuYZbyXnv506tVijOLRRSFe4rs/ei/5pev2M22KoEUK5nIV5J 91K91aRYYCxG1PxEV1OO7G1RnQC3gpx7yl1UR/Kwd+rCVlWVqytMrrGWX7Z5DeWyifox WuoO0jjg7wB2ogTh1Q2PpyYYJv/2lfw972HfC6J7gyJyR2V7Zho9th+2MtJ9zjAi4i+G bh1I4iUr1+mtPVggcrF2VNePNB/FwePjHZhZ558sTLQBs019TqtBVaWqnsJjOy21PhBA yviQ== X-Gm-Message-State: AFqh2kp871oA0C5IuOdyjFH1qAudVFIQ32cVzdA/wAH2jrZIr5BsViPc 0T8tyV+aTGfS5Myl2QnLUojMN6NfXes= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:488d:b0:226:9d77:e730 with SMTP id b13-20020a17090a488d00b002269d77e730mr827196pjh.198.1672967648544; Thu, 05 Jan 2023 17:14:08 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:13:05 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-33-seanjc@google.com> Subject: [PATCH v5 32/33] KVM: x86: Allow APICv APIC ID inhibit to be cleared From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754234116092717901?= X-GMAIL-MSGID: =?utf-8?q?1754234116092717901?= From: Greg Edwards Legacy kernels prior to commit 4399c03c6780 ("x86/apic: Remove verify_local_APIC()") write the APIC ID of the boot CPU twice to verify a functioning local APIC. This results in APIC acceleration inhibited on these kernels for reason APICV_INHIBIT_REASON_APIC_ID_MODIFIED. Allow the APICV_INHIBIT_REASON_APIC_ID_MODIFIED inhibit reason to be cleared if/when all APICs in xAPIC mode set their APIC ID back to the expected vcpu_id value. Fold the functionality previously in kvm_lapic_xapic_id_updated() into kvm_recalculate_apic_map(), as this allows examining all APICs in one pass. Fixes: 3743c2f02517 ("KVM: x86: inhibit APICv/AVIC on changes to APIC ID or APIC base") Signed-off-by: Greg Edwards Link: https://lore.kernel.org/r/20221117183247.94314-1-gedwards@ddn.com Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/lapic.c | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 0faf80cdc1be..856e81a2dc64 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -236,6 +236,7 @@ void kvm_recalculate_apic_map(struct kvm *kvm) struct kvm_vcpu *vcpu; unsigned long i; u32 max_id = 255; /* enough space for any xAPIC ID */ + bool xapic_id_mismatch = false; /* Read kvm->arch.apic_map_dirty before kvm->arch.apic_map. */ if (atomic_read_acquire(&kvm->arch.apic_map_dirty) == CLEAN) @@ -285,6 +286,15 @@ void kvm_recalculate_apic_map(struct kvm *kvm) xapic_id = kvm_xapic_id(apic); x2apic_id = kvm_x2apic_id(apic); + /* + * Deliberately truncate the vCPU ID when detecting a mismatched + * APIC ID to avoid false positives if the vCPU ID, i.e. x2APIC + * ID, is a 32-bit value. Any unwanted aliasing due to + * truncation results will be detected below. + */ + if (!apic_x2apic_mode(apic) && xapic_id != (u8)vcpu->vcpu_id) + xapic_id_mismatch = true; + /* * Apply KVM's hotplug hack if userspace has enable 32-bit APIC * IDs. Allow sending events to vCPUs by their x2APIC ID even @@ -401,6 +411,11 @@ void kvm_recalculate_apic_map(struct kvm *kvm) else kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED); + if (xapic_id_mismatch) + kvm_set_apicv_inhibit(kvm, APICV_INHIBIT_REASON_APIC_ID_MODIFIED); + else + kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_APIC_ID_MODIFIED); + old = rcu_dereference_protected(kvm->arch.apic_map, lockdep_is_held(&kvm->arch.apic_map_lock)); rcu_assign_pointer(kvm->arch.apic_map, new); @@ -2160,28 +2175,6 @@ static void apic_manage_nmi_watchdog(struct kvm_lapic *apic, u32 lvt0_val) } } -static void kvm_lapic_xapic_id_updated(struct kvm_lapic *apic) -{ - struct kvm *kvm = apic->vcpu->kvm; - - if (!kvm_apic_hw_enabled(apic)) - return; - - if (KVM_BUG_ON(apic_x2apic_mode(apic), kvm)) - return; - - /* - * Deliberately truncate the vCPU ID when detecting a modified APIC ID - * to avoid false positives if the vCPU ID, i.e. x2APIC ID, is a 32-bit - * value. If the wrap/truncation results in unwanted aliasing, APICv - * will be inhibited as part of updating KVM's optimized APIC maps. - */ - if (kvm_xapic_id(apic) == (u8)apic->vcpu->vcpu_id) - return; - - kvm_set_apicv_inhibit(apic->vcpu->kvm, APICV_INHIBIT_REASON_APIC_ID_MODIFIED); -} - static int get_lvt_index(u32 reg) { if (reg == APIC_LVTCMCI) @@ -2202,7 +2195,6 @@ static int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) case APIC_ID: /* Local APIC ID */ if (!apic_x2apic_mode(apic)) { kvm_apic_set_xapic_id(apic, val >> 24); - kvm_lapic_xapic_id_updated(apic); } else { ret = 1; } @@ -2923,9 +2915,6 @@ int kvm_apic_set_state(struct kvm_vcpu *vcpu, struct kvm_lapic_state *s) } memcpy(vcpu->arch.apic->regs, s->regs, sizeof(*s)); - if (!apic_x2apic_mode(apic)) - kvm_lapic_xapic_id_updated(apic); - atomic_set_release(&apic->vcpu->kvm->arch.apic_map_dirty, DIRTY); kvm_recalculate_apic_map(vcpu->kvm); kvm_apic_set_version(vcpu); From patchwork Fri Jan 6 01:13:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 39889 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp578708wrt; Thu, 5 Jan 2023 17:21:00 -0800 (PST) X-Google-Smtp-Source: AMrXdXvKvK8s461J1daRFxMP13E328dQpQ3Smy0ctl9XK/vk4Rsl42CNQ/ltxi78NiXOi4ZRiXnA X-Received: by 2002:a05:6a21:8697:b0:ad:5747:9f6e with SMTP id ox23-20020a056a21869700b000ad57479f6emr54213727pzb.39.1672968060637; Thu, 05 Jan 2023 17:21:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672968060; cv=none; d=google.com; s=arc-20160816; b=zWvtO2prS2VYf13JYsuqjM7tK1DF8ZZmbOH3OqloesxvMbSppqa2mIQ12OA2/kRHwI c+kRaASX4RsEQ2GWozOdC7zkStl58uSQJCABbGmeAqCVSe4+ynyWVGGBAyY92oprejGO LsMwFnHB4ZoMi9ZoqHudzlBv0+JbN971XY8FSMwFTMktP5FnmhtCk7ZTyWfPMvTzQMlm 9jBYpUtrZs3D7BmVNAykuRJ7jvQUHfhL76WkcTpSa+9njOnn/rnarprT56oXuUx4xPNE M9WdqqGdf/CL6GzfGsrOTl+CZ1pBkzd2Q5NOIyIjNPxfIthcWqzIUEz4CDmmkBgOXoYT 8CNQ== 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:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=lYOUn7bh0UicjBFjjEdDwT1xATl/+MO6+EoBl3NK56I=; b=nOKRmgUQz2HMk8lIGyNf0qoSStb5Hq9SDAbq4GLpN+3FjL2rIdoqtXN3KjjwcOMryv fIGgDYkO5spBqNZ8Gd9HWQjmx87DzUx6hmMWaYZMtJtD/TTfwzKzMjVAK/cc8krm+iJt tjT7dtnsDFPrM9ZyhXxo8BKifzaMJ6CirsKx/RbZ5bb5O/W2gD6VLgUGLlB4+zcPEY7W o4UJysr5QvZ36CyOZ/LWk0pTADQsRgUl4WnUPqJTaD/lTRLA8Kr6IboFhtkZ3oebcqXi ISFc+ve1yUvmdToaBQzN0sh5HEucgOZzIO5uPNNnufy7qS2G7Ve4kUSW/jtKSm3jUUUV zosQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=JFoorMQd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j25-20020a635519000000b0047875582864si38380188pgb.263.2023.01.05.17.20.48; Thu, 05 Jan 2023 17:21:00 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=JFoorMQd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S233429AbjAFBSQ (ORCPT + 99 others); Thu, 5 Jan 2023 20:18:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37670 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234012AbjAFBRo (ORCPT ); Thu, 5 Jan 2023 20:17:44 -0500 Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EBFBC6A0DE for ; Thu, 5 Jan 2023 17:14:38 -0800 (PST) Received: by mail-pf1-x44a.google.com with SMTP id v23-20020aa78097000000b005748c087db1so63796pff.2 for ; Thu, 05 Jan 2023 17:14:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=lYOUn7bh0UicjBFjjEdDwT1xATl/+MO6+EoBl3NK56I=; b=JFoorMQdp+YgGEAg84gXvng2oRxSc4H5kJAMfboM5Mhb3vLfvIO60QTModIJsKv4jb js+UtfEVxx0ljRZ4LROq3D9pzaagrjQu/rIoJrzwTwAsBWtOmbkF4MACp5qDxwmXldZ7 Hqv5BmP5u4BHn9IfhyH3q4d9HQfLLN3//ceZhVB9phW6GJ12YdFm7CyGMHl2KzWy6ptu M8XdaaM/LdUnmDvHKu3UHgWArzMl9mfDM0BHwlNpIRR8SsdCTLRnqJrIhXWtdLM5eYep P2BPCDVq6QebSx86cXamSHSU/iG28oHVF4OZNL0BPpndI7AWGTZVH9ZxQTsiMfbC3Gvb YTYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lYOUn7bh0UicjBFjjEdDwT1xATl/+MO6+EoBl3NK56I=; b=O/Ls8jGST6ta1WP50kftd6pszvAZ9lrOueEI6ZLDgr4U/jc3Xvei4fTAjOQzfK1QCp xVleORZ9zthVGZlbSQWQSAQtCGZm64gLBANSALMWsPXCjbXiIMgsoLdoEtGxNS2+d+u+ Ych+DQRpM3tOMY1H4rrTrGO3iuStYTV8miMsOfQZ+ZfekOZvqAvdNHWiS4NmngtAnKkv 6nMcArmarbHYPQURpInfgyqXW8N++z2f2GzIeYXFmjgBixBSppAi44g2XnYDVCMiTeXw W+mqRw9Dzt32toBQSWH2U8HnMq8eRcvXI/qiHM9f6yI9JCvn8SN1KWZSnzIDbHy/4KuP jv+w== X-Gm-Message-State: AFqh2koX8dkdGR7r4HH9ZdV/ugmn0FxBgTxw0tWuU69N5DiD/d6PuuqA 9GYxvksDi+L2fOXM6TaBnwrtnTD2kmg= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:e548:b0:18f:8f1e:992f with SMTP id n8-20020a170902e54800b0018f8f1e992fmr3573473plf.64.1672967650383; Thu, 05 Jan 2023 17:14:10 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 6 Jan 2023 01:13:06 +0000 In-Reply-To: <20230106011306.85230-1-seanjc@google.com> Mime-Version: 1.0 References: <20230106011306.85230-1-seanjc@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230106011306.85230-34-seanjc@google.com> Subject: [PATCH v5 33/33] KVM: x86: Add helpers to recalc physical vs. logical optimized APIC maps From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Maxim Levitsky , Suravee Suthikulpanit , Li RongQing , Greg Edwards X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754234156931226287?= X-GMAIL-MSGID: =?utf-8?q?1754234156931226287?= Move the guts of kvm_recalculate_apic_map()'s main loop to two separate helpers to handle recalculating the physical and logical pieces of the optimized map. Having 100+ lines of code in the for-loop makes it hard to understand what is being calculated where. No functional change intended. Suggested-by: Maxim Levitsky Signed-off-by: Sean Christopherson Reviewed-by: Maxim Levitsky --- arch/x86/kvm/lapic.c | 250 +++++++++++++++++++++++-------------------- 1 file changed, 133 insertions(+), 117 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 856e81a2dc64..669ea125b7e2 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -218,6 +218,134 @@ static void kvm_apic_map_free(struct rcu_head *rcu) kvfree(map); } +static int kvm_recalculate_phys_map(struct kvm_apic_map *new, + struct kvm_vcpu *vcpu, + bool *xapic_id_mismatch) +{ + struct kvm_lapic *apic = vcpu->arch.apic; + u32 x2apic_id = kvm_x2apic_id(apic); + u32 xapic_id = kvm_xapic_id(apic); + u32 physical_id; + + /* + * Deliberately truncate the vCPU ID when detecting a mismatched APIC + * ID to avoid false positives if the vCPU ID, i.e. x2APIC ID, is a + * 32-bit value. Any unwanted aliasing due to truncation results will + * be detected below. + */ + if (!apic_x2apic_mode(apic) && xapic_id != (u8)vcpu->vcpu_id) + *xapic_id_mismatch = true; + + /* + * Apply KVM's hotplug hack if userspace has enable 32-bit APIC IDs. + * Allow sending events to vCPUs by their x2APIC ID even if the target + * vCPU is in legacy xAPIC mode, and silently ignore aliased xAPIC IDs + * (the x2APIC ID is truncated to 8 bits, causing IDs > 0xff to wrap + * and collide). + * + * Honor the architectural (and KVM's non-optimized) behavior if + * userspace has not enabled 32-bit x2APIC IDs. Each APIC is supposed + * to process messages independently. If multiple vCPUs have the same + * effective APIC ID, e.g. due to the x2APIC wrap or because the guest + * manually modified its xAPIC IDs, events targeting that ID are + * supposed to be recognized by all vCPUs with said ID. + */ + if (vcpu->kvm->arch.x2apic_format) { + /* See also kvm_apic_match_physical_addr(). */ + if ((apic_x2apic_mode(apic) || x2apic_id > 0xff) && + x2apic_id <= new->max_apic_id) + new->phys_map[x2apic_id] = apic; + + if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id]) + new->phys_map[xapic_id] = apic; + } else { + /* + * Disable the optimized map if the physical APIC ID is already + * mapped, i.e. is aliased to multiple vCPUs. The optimized + * map requires a strict 1:1 mapping between IDs and vCPUs. + */ + if (apic_x2apic_mode(apic)) + physical_id = x2apic_id; + else + physical_id = xapic_id; + + if (new->phys_map[physical_id]) + return -EINVAL; + + new->phys_map[physical_id] = apic; + } + + return 0; +} + +static void kvm_recalculate_logical_map(struct kvm_apic_map *new, + struct kvm_vcpu *vcpu) +{ + struct kvm_lapic *apic = vcpu->arch.apic; + enum kvm_apic_logical_mode logical_mode; + struct kvm_lapic **cluster; + u16 mask; + u32 ldr; + + if (new->logical_mode == KVM_APIC_MODE_MAP_DISABLED) + return; + + if (!kvm_apic_sw_enabled(apic)) + return; + + ldr = kvm_lapic_get_reg(apic, APIC_LDR); + if (!ldr) + return; + + if (apic_x2apic_mode(apic)) { + logical_mode = KVM_APIC_MODE_X2APIC; + } else { + ldr = GET_APIC_LOGICAL_ID(ldr); + if (kvm_lapic_get_reg(apic, APIC_DFR) == APIC_DFR_FLAT) + logical_mode = KVM_APIC_MODE_XAPIC_FLAT; + else + logical_mode = KVM_APIC_MODE_XAPIC_CLUSTER; + } + + /* + * To optimize logical mode delivery, all software-enabled APICs must + * be configured for the same mode. + */ + if (new->logical_mode == KVM_APIC_MODE_SW_DISABLED) { + new->logical_mode = logical_mode; + } else if (new->logical_mode != logical_mode) { + new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; + return; + } + + /* + * In x2APIC mode, the LDR is read-only and derived directly from the + * x2APIC ID, thus is guaranteed to be addressable. KVM reuses + * kvm_apic_map.phys_map to optimize logical mode x2APIC interrupts by + * reversing the LDR calculation to get cluster of APICs, i.e. no + * additional work is required. + */ + if (apic_x2apic_mode(apic)) { + WARN_ON_ONCE(ldr != kvm_apic_calc_x2apic_ldr(kvm_x2apic_id(apic))); + return; + } + + if (WARN_ON_ONCE(!kvm_apic_map_get_logical_dest(new, ldr, + &cluster, &mask))) { + new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; + return; + } + + if (!mask) + return; + + ldr = ffs(mask) - 1; + if (!is_power_of_2(mask) || cluster[ldr]) + new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; + else + cluster[ldr] = apic; +} + /* * CLEAN -> DIRTY and UPDATE_IN_PROGRESS -> DIRTY changes happen without a lock. * @@ -272,128 +400,16 @@ void kvm_recalculate_apic_map(struct kvm *kvm) new->logical_mode = KVM_APIC_MODE_SW_DISABLED; kvm_for_each_vcpu(i, vcpu, kvm) { - struct kvm_lapic *apic = vcpu->arch.apic; - struct kvm_lapic **cluster; - enum kvm_apic_logical_mode logical_mode; - u32 x2apic_id, physical_id; - u16 mask; - u32 ldr; - u8 xapic_id; - if (!kvm_apic_present(vcpu)) continue; - xapic_id = kvm_xapic_id(apic); - x2apic_id = kvm_x2apic_id(apic); - - /* - * Deliberately truncate the vCPU ID when detecting a mismatched - * APIC ID to avoid false positives if the vCPU ID, i.e. x2APIC - * ID, is a 32-bit value. Any unwanted aliasing due to - * truncation results will be detected below. - */ - if (!apic_x2apic_mode(apic) && xapic_id != (u8)vcpu->vcpu_id) - xapic_id_mismatch = true; - - /* - * Apply KVM's hotplug hack if userspace has enable 32-bit APIC - * IDs. Allow sending events to vCPUs by their x2APIC ID even - * if the target vCPU is in legacy xAPIC mode, and silently - * ignore aliased xAPIC IDs (the x2APIC ID is truncated to 8 - * bits, causing IDs > 0xff to wrap and collide). - * - * Honor the architectural (and KVM's non-optimized) behavior - * if userspace has not enabled 32-bit x2APIC IDs. Each APIC - * is supposed to process messages independently. If multiple - * vCPUs have the same effective APIC ID, e.g. due to the - * x2APIC wrap or because the guest manually modified its xAPIC - * IDs, events targeting that ID are supposed to be recognized - * by all vCPUs with said ID. - */ - if (kvm->arch.x2apic_format) { - /* See also kvm_apic_match_physical_addr(). */ - if ((apic_x2apic_mode(apic) || x2apic_id > 0xff) && - x2apic_id <= new->max_apic_id) - new->phys_map[x2apic_id] = apic; - - if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id]) - new->phys_map[xapic_id] = apic; - } else { - /* - * Disable the optimized map if the physical APIC ID is - * already mapped, i.e. is aliased to multiple vCPUs. - * The optimized map requires a strict 1:1 mapping - * between IDs and vCPUs. - */ - if (apic_x2apic_mode(apic)) - physical_id = x2apic_id; - else - physical_id = xapic_id; - - if (new->phys_map[physical_id]) { - kvfree(new); - new = NULL; - goto out; - } - new->phys_map[physical_id] = apic; - } - - if (new->logical_mode == KVM_APIC_MODE_MAP_DISABLED || - !kvm_apic_sw_enabled(apic)) - continue; - - ldr = kvm_lapic_get_reg(apic, APIC_LDR); - if (!ldr) - continue; - - if (apic_x2apic_mode(apic)) { - logical_mode = KVM_APIC_MODE_X2APIC; - } else { - ldr = GET_APIC_LOGICAL_ID(ldr); - if (kvm_lapic_get_reg(apic, APIC_DFR) == APIC_DFR_FLAT) - logical_mode = KVM_APIC_MODE_XAPIC_FLAT; - else - logical_mode = KVM_APIC_MODE_XAPIC_CLUSTER; + if (kvm_recalculate_phys_map(new, vcpu, &xapic_id_mismatch)) { + kvfree(new); + new = NULL; + goto out; } - /* - * To optimize logical mode delivery, all software-enabled APICs must - * be configured for the same mode. - */ - if (new->logical_mode == KVM_APIC_MODE_SW_DISABLED) { - new->logical_mode = logical_mode; - } else if (new->logical_mode != logical_mode) { - new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; - continue; - } - - /* - * In x2APIC mode, the LDR is read-only and derived directly - * from the x2APIC ID, thus is guaranteed to be addressable. - * KVM reuses kvm_apic_map.phys_map to optimize logical mode - * x2APIC interrupts by reversing the LDR calculation to get - * cluster of APICs, i.e. no additional work is required. - */ - if (apic_x2apic_mode(apic)) { - WARN_ON_ONCE(ldr != kvm_apic_calc_x2apic_ldr(x2apic_id)); - continue; - } - - if (WARN_ON_ONCE(!kvm_apic_map_get_logical_dest(new, ldr, - &cluster, &mask))) { - new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; - continue; - } - - if (!mask) - continue; - - ldr = ffs(mask) - 1; - if (!is_power_of_2(mask) || cluster[ldr]) { - new->logical_mode = KVM_APIC_MODE_MAP_DISABLED; - continue; - } - cluster[ldr] = apic; + kvm_recalculate_logical_map(new, vcpu); } out: /*