Received: by 2002:a05:6358:489b:b0:bb:da1:e618 with SMTP id x27csp2574562rwn; Fri, 16 Sep 2022 12:28:37 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5Rjt7bUKwaC59JyLFgytbNO5zMDyUDRfjxyeSUO/FOTALFVIAugMozSnHwZnctmz9hpWvu X-Received: by 2002:a17:907:6ea7:b0:780:840:f050 with SMTP id sh39-20020a1709076ea700b007800840f050mr4798598ejc.394.1663356517395; Fri, 16 Sep 2022 12:28:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1663356517; cv=none; d=google.com; s=arc-20160816; b=JpMls3b+TG18NvWAfnUJqD93xyaymw9XjG/9rK9rCakbhVejvoI8OT6RG5wVFjC5wh UkUhAlJhrTzl5otSpUvkIvTaP5XaN+Tt7AKLrfZwJMcUBFM83zFvrR7GeTI5D1SW3lUs HSoC9sH0IaXZNRwAhcSSV0gXZ0DiODLvbRh5MpUPbT7X/qqS/Kt1giwmWxXMVLGEXk8Q EXwsSXYxIFnnXEU6CZ3Bh9GFjvm2rve2Rnw4fCkzxsaY22OLQWd1DcY4FupqndArcVSO pVCr1/mNIarCuiYJ3a7g6WbR098bwnvhU7uOBsqFK8JePhHZD9XMlXllGP98cAhvjJfe 0Dfw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=di38Vx0xcwobovXFuqa+aqs6mrMaWt2alUPAsQ25AHE=; b=XLuai9PC6nZQw0OlK4Vy8NcUP9Zfyon6WZ73fEGVKU9DTnuhZg/s7yBvR4i2u9J6ie n2Z1gCN3ZXy3/iAv6JW10HIk5+i3a/3Tmcnj5Sj7gozolSEfwN6CAHLArDr1Kbmki0X4 ZitJUD2MiVFAM55WOJNmVmN1RzrwF76DVJ0QEuNwtAuP+1tDuMPxaaN29+OjqdC3sFrm lbeE25syovwAefq10M598bBHvKNQiJGFlqR2HijFm707g4WXV32H3UCez5CJOHP5IQvX /wMkjMvKuR1Jya7zQuPXyqT7MYGdBpdfiijKeT5IDHZ8kVd0FTcvW2/kvlBHtp0nfOG9 YD0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=HMcch5Jk; 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id go12-20020a1709070d8c00b0077c099a6413si16603117ejc.59.2022.09.16.12.28.12; Fri, 16 Sep 2022 12:28:37 -0700 (PDT) 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=HMcch5Jk; 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 S230233AbiIPSwg (ORCPT + 99 others); Fri, 16 Sep 2022 14:52:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54490 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229501AbiIPSwf (ORCPT ); Fri, 16 Sep 2022 14:52:35 -0400 Received: from mail-pj1-x102c.google.com (mail-pj1-x102c.google.com [IPv6:2607:f8b0:4864:20::102c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1DD23B775F for ; Fri, 16 Sep 2022 11:52:34 -0700 (PDT) Received: by mail-pj1-x102c.google.com with SMTP id a5-20020a17090aa50500b002008eeb040eso1966552pjq.1 for ; Fri, 16 Sep 2022 11:52:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date; bh=di38Vx0xcwobovXFuqa+aqs6mrMaWt2alUPAsQ25AHE=; b=HMcch5JkSHJGz9ZQUqTzI4QHZMH3bJxFOKm3B2upHhnBl8/9dF5xCiieB6xk0c+KIl q/UQNLIza5wPp9U3ZRDC11bREH40xKg9rwbBLS/9/Ngdpi9jalz5O98gp9u2AmKOwT84 PvyXmUaQlLAt3Ta2OHtGUN9Vj0lbmm/pMUAwf7Z3KykezFtqcQz6mZZeR6IVSwkyBA3d EluQsbFtgxctVh2rodhtkv1Aw5XtjXzP3lzDieu3mil82A92fnXrZMquY428RedIw3Dz ZXEjrLpT0t0t35F5zT6pv9mEso44N9Xs3fE4HlTNQTj9jFY7LTvDHbHlzv8x7dAtaPNP 4NLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date; bh=di38Vx0xcwobovXFuqa+aqs6mrMaWt2alUPAsQ25AHE=; b=ygZd3oB5F0dJHaR6RaloRcnZ3JyCju7KMtOrZBykYCuyVOxFftcsvcq1xhHzpNyiH2 SVgtK3wrEy4yalBUYfwP8wwIZ8YnDKhl4hKYtKtQ+44eWObRC50OK0U0kdOYWwqKspYr yJo1Y2Fb4EPSW2MTlwqIzQFoT6c7vqJ6f+bEILA9Zp4JQZrSNwGbHvplpnLajtSlEwRp JrK1SWbGko0i1rBzP0DLFVyy2bMVbbrTBRGsrcmzR5cSltMkNsuWOSIMCjq0JQKrJSG0 yaEWovXcusjOxubOPP2MbRVOKPEoRXeRVbofUMYtkCHmQKRcv8ta0aMJouMT8wP6+q07 fMRA== X-Gm-Message-State: ACrzQf1FDzSqg7bUjjBl1S4fXLwV3MHz42BImJiPz9UdB/SJHLV92yw/ rcXmYbhfByLfYEl2jrcvVFpFQA== X-Received: by 2002:a17:90b:1b4d:b0:202:c05f:6ea0 with SMTP id nv13-20020a17090b1b4d00b00202c05f6ea0mr7040678pjb.7.1663354353552; Fri, 16 Sep 2022 11:52:33 -0700 (PDT) Received: from google.com (7.104.168.34.bc.googleusercontent.com. [34.168.104.7]) by smtp.gmail.com with ESMTPSA id a10-20020a170902ecca00b0016c574aa0fdsm15487240plh.76.2022.09.16.11.52.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Sep 2022 11:52:32 -0700 (PDT) Date: Fri, 16 Sep 2022 18:52:29 +0000 From: Sean Christopherson To: "Suthikulpanit, Suravee" Cc: Paolo Bonzini , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Maxim Levitsky , Li RongQing Subject: Re: [PATCH v2 13/23] KVM: x86: Disable APIC logical map if vCPUs are aliased in logical mode Message-ID: References: <20220903002254.2411750-1-seanjc@google.com> <20220903002254.2411750-14-seanjc@google.com> <59c2085e-1f0a-fe7d-8146-6c1bc570c97b@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <59c2085e-1f0a-fe7d-8146-6c1bc570c97b@amd.com> X-Spam-Status: No, score=-17.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_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 On Wed, Sep 14, 2022, Suthikulpanit, Suravee wrote: > > > > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c > > > > index 6b2f538b8fd0..75748c380ceb 100644 > > > > --- a/arch/x86/kvm/lapic.c > > > > +++ b/arch/x86/kvm/lapic.c > > > > @@ -303,12 +303,13 @@ 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]) { > > > > > > Should this be checking if the cluster[ldr] is pointing to the same struct > > > apic instead? For example: > > > > > > if (!is_power_of_2(mask) || cluster[ldr] != apic) > > > > > > From my observation, the kvm_recalculate_apic_map() can be called many > > > times, and the cluster[ldr] could have already been assigned from the > > > previous invocation. So, as long as it is the same, it should be okay. > > > > No, because cluster[ldr] can never match "apic". kvm_recalculate_apic_map() > > creates and populates a _new_ kvm_apic_map every time, it doesn't do an in-place > > update of the current map. > > Yes, the _new_ is getting created and initialized every time we call > kvm_recalculate_apic_map(), and then passed into > kvm_apic_map_get_logical_dest() along with the reference of cluster and mask > to get populated based on the provided ldr. Please note that the > new->phys_map[x2apic_id] is already assigned before the calling of Ooh, this is what I was missing. LDR is read-only for x2APIC, and so KVM simply uses the phys_map and computes the phys_map indices by reversing the x2APIC=>LDR calculation. So it's so much not that _can_ "apic" can match "cluster[ldr]", it's actually that "apic" _must_ match "cluster[ldr]" for this flow. Overwriting the cluster entry is all kinds of pointless. It's either unnecessary (no bugs) or it breaks things (bugs in either LDR calculation or logical dest math). Rather than add an exception to the cluster[] check, which is very confusing for xAPIC, the whole flow can be skipped for x2APIC, with a sanity check that the LDR does indeed align with the x2APIC ID. diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 76a19bf1eb55..e9d7c647e8a7 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -347,6 +347,12 @@ void kvm_recalculate_apic_map(struct kvm *kvm) } new->logical_mode = logical_mode; + /* I'll add a comment here. */ + 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; Alternatively, the x2APIC handling could be done after kvm_apic_map_get_logical_dest(), e.g. so that KVM can sanity check mask+cluster[ldr], but that's annoying to implement and IMO it's overkill since the we can just as easily verify the math via tests on top of the LDR sanity check. I'll do a better job of verifying that APICv + x2APIC yields the correct inhibits. I verified x2APIC functional correctness, and that APICv + xAPIC yielded the correct inhibits, but I obviously didn't verify APICv + x2APIC yielded the correct inhibits. Thanks much!