From patchwork Tue Oct 24 00:26:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157159 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633646vqx; Mon, 23 Oct 2023 17:27:27 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHqFzrUy/C9DPZcEEuSgQ8D1mbWWXOMbfdkQZgIyoJPXjdFhgH/F7dSg3XKDaYoFH2ptXJJ X-Received: by 2002:aa7:8c56:0:b0:6bf:239b:e841 with SMTP id e22-20020aa78c56000000b006bf239be841mr14367521pfd.0.1698107247251; Mon, 23 Oct 2023 17:27:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107247; cv=none; d=google.com; s=arc-20160816; b=M6Nbl2y8eQdN4Eq+HNjLCpVi5TDAVJKXxfYKVolBPDzUw+IDj3fhIO1sGe6mh0OXR7 Wz/j7g2thCGsWhwdH1YIFp44ZUFZRuoivGXxCeOsr84w39UOzALnCMQ9t9XJV4Qj9/DY 5ZN0Wy9hy3Trb7vrFLCR8px6+vtST2ql6vkqgtP44rPb7XjnE+2kOihTEPogkFG9tKe4 vhrXicPTx2r+Zc5u44cyE0Rn4gveajbe5Dy158zifOX1xueP2Kb2fghc5zmob1K+x2wp Z4wiV9c2smkZ9ntyqMkhTZL07q06S78dR5omDA3QMkZLc/hGxjTOlLHm8tNrxXv6hsvp rHbw== 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=eiyrZUCrtXg6DUYczSD0Onn4lO3H8IBkZ8lYsggwbsM=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=uX42WDDAWUpdJT0WSJiiWUunIpo/2EDDOTujfWESTVsNbe6BmLZ6TestZgwHFZ05Ew gWsUyVdWdiIqwwHpx7USVRxOWTa527s6elSjD7WpVBTGuQU2N/ZrenqG16lfBxEvmQTv pBQ2ow5kr+8C+Vy8QLHMzFoQuglLm6JC1gRsJvBFrpnefpyDJAxZnwIakYQ7JBPfJBcD 9DRcCz2nOY1g105sbi5a0TqPdkieUMxsknamL0LTQQMc3JXhC4y8ZjTtfU3SgeDbC9FM VY9PKcEy+l8Nvbf+qkrGAxhQkCcv/URbW5IZFgPSIUA17zwxKrSaYndbtXXt/effwtDi VnyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=prC4RNRG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 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 pete.vger.email (pete.vger.email. [23.128.96.36]) by mx.google.com with ESMTPS id z16-20020a634c10000000b005b874265d26si6875286pga.284.2023.10.23.17.27.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:27:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) client-ip=23.128.96.36; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=prC4RNRG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id C1D0880ACC6C; Mon, 23 Oct 2023 17:27:14 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231658AbjJXA0o (ORCPT + 27 others); Mon, 23 Oct 2023 20:26:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41790 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230477AbjJXA0l (ORCPT ); Mon, 23 Oct 2023 20:26:41 -0400 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 6887110E for ; Mon, 23 Oct 2023 17:26:39 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1c9d140fcddso28146765ad.1 for ; Mon, 23 Oct 2023 17:26:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107199; x=1698711999; darn=vger.kernel.org; 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=eiyrZUCrtXg6DUYczSD0Onn4lO3H8IBkZ8lYsggwbsM=; b=prC4RNRG9KDEzUdaKcOxD4bCKkR79gHNgBrWobLc3nJT/IUYiPAZVeEC8/FT1WrAPP Ium5Uz5RtJLP39gGZRvTsEm6UxjqbhwYb2NDL8xv646BQ+UpqLRvhJaByh0/FTC/lEY2 WUv9YX29SF2x1Rpk3nyU08d2NLNkvgKlbCQdG8akyeD7bntsrKCCaU67vt6IAcaB+y8C Uks4skqGFCHek1Vgtx4KEBHG83kCe6llbz9PBN/27d//yC975/Uk7G9tNG9o+K4k/ZcE uenz3U2F4Y3Yo/sEXn3HQaaluWgRfjki0VBsrCYLVNe23mGjkHpU5xIpr53L8RuAfO2U zFHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107199; x=1698711999; 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=eiyrZUCrtXg6DUYczSD0Onn4lO3H8IBkZ8lYsggwbsM=; b=VZ9aC9uOgRbFR8noQsiVCDP0C3vshIn7etd9ZbUoe0XI/5lvNGVr2UJHv+8RdWFyCl QnOEe2+0w4foy4MvlNh87dwpcM23MN83inSZXecNv6hhqvthOSkpy/W501fgeQ4QYVIi bDysjmmJeLmbB9yUneGE9cfCiajyTuRfDrHiLRNRXg2pdLJzAUYQ1Z+tNwxGlaVjLB7d tKGxGNa5n9SdyRnAPsN3gJK47afSMM5kyER3SqUGLtgleGK4f4XE7d67m7XqxU7qKnjq eR20oYKsw61XK/41fjdMqqKEWM5tJi7Wc471QD4Iz+gmxrN9Mk2GsLCFOcKNyg1F3MmD gnlQ== X-Gm-Message-State: AOJu0YxXA0iTteV3qmJCyuwoRXbe7tX59gABIGBDr380Fzb4MVaJ3t+k 7DDD9sigkvhQqOwmitmRB6INt2E4wqo= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:4346:b0:1ca:85ab:1638 with SMTP id lo6-20020a170903434600b001ca85ab1638mr189311plb.12.1698107198877; Mon, 23 Oct 2023 17:26:38 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:21 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-2-seanjc@google.com> Subject: [PATCH v5 01/13] KVM: x86/pmu: Don't allow exposing unsupported architectural events From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 pete.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:27:14 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594504933032588 X-GMAIL-MSGID: 1780594504933032588 Hide architectural events that are unsupported according to guest CPUID *or* hardware, i.e. don't let userspace advertise and potentially program unsupported architectural events. Note, KVM already limits the length of the reverse polarity field, only the mask itself is missing. Fixes: f5132b01386b ("KVM: Expose a version 2 architectural PMU to a guests") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/pmu_intel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 820d3e1f6b4f..1b13a472e3f2 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -533,7 +533,7 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu) pmu->counter_bitmask[KVM_PMC_GP] = ((u64)1 << eax.split.bit_width) - 1; eax.split.mask_length = min_t(int, eax.split.mask_length, kvm_pmu_cap.events_mask_len); - pmu->available_event_types = ~entry->ebx & + pmu->available_event_types = ~(entry->ebx | kvm_pmu_cap.events_mask) & ((1ull << eax.split.mask_length) - 1); if (pmu->version == 1) { From patchwork Tue Oct 24 00:26:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157155 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633484vqx; Mon, 23 Oct 2023 17:26:58 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGkfl6wni1ktKYY++l1jG8MsG1u537IwA0BMA4msMP7wFOLSKD6W9PQeytlj+ygBu58bpgN X-Received: by 2002:a05:6a00:1705:b0:6be:bc50:b5e6 with SMTP id h5-20020a056a00170500b006bebc50b5e6mr10879971pfc.0.1698107217993; Mon, 23 Oct 2023 17:26:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107217; cv=none; d=google.com; s=arc-20160816; b=by8CWbiLXm6FQlI9aJ44Sa9ulX3jUtYefD1g/mvUxGOTHdmObFrKMi19g+sRHWcXSH gRN/2w4DAQvMJw3JV01K1/HAl3y7cQKD8liUax32wCkww7uwo1em2e43RESnlWhD1wpN dQgBw9hwV9tGGqVMZKdgwv/ufrq+/ywEzhDcSdn4H7AOWwB2WnAMjWaThcvS8xvTUhFO e8YDmlO98jE8XSYNW8eUQn+P7uHp5lMKyEPe6sgO6VOksYYFZrnUIqt0I2iafPRrt0q4 IP85XXeQEOoUr88Fxy+iHTp1C5/Y7HZfF/cqqAvnLZCYV4IX3oQXHD0gHrzhHLGSse65 7+bQ== 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=xj3Z6F7wtWkzGUCF9WkpLNZQGBSMludr8th6Vmamu+0=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=DTCU1JnmyEOL9cL7bKPvY1MihCAsKmzfvaaSvCA2awtrMtvaxIoO2e0LSvOdV2Hu8X gsLsPPXtXi6jzBFehSKzZuW32boZFLHkJpe42kDS0v4e7kfMLzqIYbGww8gveXeNx1FO c16eqEn8OzOu0p9QHEGHfw5bb74KXwYwAtPCAlosgLE7qKsBm+Zs1vjUpIQbgH12G5nP E1npZt4HUyNAZkA5lz2MOKKTZlqEZVi4NExs51YbxRkkywd/IOL6TCN9vxZ6+y58Y1Nk f/yGN6sV5QQnLqls+KiE1XR/j/rbGD7Qjoux6UxRcxpGkufr4kFhlCA10WCk6P4QpSUB T2DQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=RFpUY5O3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id k14-20020a056a00134e00b006be01b51af8si7597943pfu.33.2023.10.23.17.26.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:26:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=RFpUY5O3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 0D4C180C244A; Mon, 23 Oct 2023 17:26:57 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231733AbjJXA0r (ORCPT + 27 others); Mon, 23 Oct 2023 20:26:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41828 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231629AbjJXA0n (ORCPT ); Mon, 23 Oct 2023 20:26:43 -0400 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 7FAEF10D for ; Mon, 23 Oct 2023 17:26:41 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5a7aa161b2fso51690357b3.2 for ; Mon, 23 Oct 2023 17:26:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107200; x=1698712000; darn=vger.kernel.org; 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=xj3Z6F7wtWkzGUCF9WkpLNZQGBSMludr8th6Vmamu+0=; b=RFpUY5O3ZnwQB/qyj/xfIACsmkSXkQfqhgnKyfhhw4b9ic2ebsFm6pmMPDhp8Ueza4 nFjHokhYEzLG79M6H4T4IyniknSILbyN0/LbLFiFCbRFTlRO1S6xWrdPMaDXyAOaYyLT 5fZkhVts9wioNIU8ZvgxdoMayQxR/u1SbVo4r69lL2ZY2d71wmAqJGjLm7Vii17fGL31 WtsyP6dz/5quWe8JJ5aD++Q0PgTFKO7WWf/APPQbmjxW9SgJwa9bw7w5S9bGn70yxalw JepDJBguIN/hjH88DP5DdHVVCejACxNPGI4cIyKq6iYkQfpODH/iBs+wa/vldul0ELPt yokQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107200; x=1698712000; 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=xj3Z6F7wtWkzGUCF9WkpLNZQGBSMludr8th6Vmamu+0=; b=ebIM3YGPnIZolaP9dXzsiWZy6HuFOrD7rvRwKOVQEvXeOFPecY5PhKD8GpzR3hCUaT 52UjTA9mAgvH+XWQ2MSfBhTyYIyEqKXFDTCAsNKTyLDgBQ0vmR56Vxe/noH9Wgm56M3i Llbr2a7FrqzQ+AH66AhyXMAJlnVJemH0IB9/CDgPOxJrQiirfX9h5YzCnSQkrcte/9dK 9+KwbkZQDAfUJPPL3skhCBT7o5xcFakZ7ryRBxz+NGe6vWcpVREfGtjLzZWo6l9LDcQB yGzkvSVhigi38WCtGydISue981Zd99u295V5MVRabY4Kk2paqA5YDFXIsnMlGRczM8px KI9g== X-Gm-Message-State: AOJu0Yz0JuK91glDCzFs0bYFjYeJXfh84ar9IZZLnT+l/gJN9Jt9AoJf +/vzHfXid1WLrpG4Nqo6BEWghSQ0VHM= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a0d:cac6:0:b0:5a7:b543:7f0c with SMTP id m189-20020a0dcac6000000b005a7b5437f0cmr247826ywd.10.1698107200739; Mon, 23 Oct 2023 17:26:40 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:22 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-3-seanjc@google.com> Subject: [PATCH v5 02/13] KVM: x86/pmu: Don't enumerate support for fixed counters KVM can't virtualize From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu 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_BLOCKED,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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:26:57 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594474253265313 X-GMAIL-MSGID: 1780594474253265313 Hide fixed counters for which perf is incapable of creating the associated architectural event. Except for the so called pseudo-architectural event for counting TSC reference cycle, KVM virtualizes fixed counters by creating a perf event for the associated general purpose architectural event. If the associated event isn't supported in hardware, KVM can't actually virtualize the fixed counter because perf will likely not program up the correct event. Note, this issue is almost certainly limited to running KVM on a funky virtual CPU model, no known real hardware has an asymmetric PMU where a fixed counter is supported but the associated architectural event is not. Fixes: f5132b01386b ("KVM: Expose a version 2 architectural PMU to a guests") Signed-off-by: Sean Christopherson --- arch/x86/kvm/pmu.h | 4 ++++ arch/x86/kvm/vmx/pmu_intel.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h index 1d64113de488..5341e8f69a22 100644 --- a/arch/x86/kvm/pmu.h +++ b/arch/x86/kvm/pmu.h @@ -19,6 +19,7 @@ #define VMWARE_BACKDOOR_PMC_APPARENT_TIME 0x10002 struct kvm_pmu_ops { + void (*init_pmu_capability)(void); bool (*hw_event_available)(struct kvm_pmc *pmc); struct kvm_pmc *(*pmc_idx_to_pmc)(struct kvm_pmu *pmu, int pmc_idx); struct kvm_pmc *(*rdpmc_ecx_to_pmc)(struct kvm_vcpu *vcpu, @@ -218,6 +219,9 @@ static inline void kvm_init_pmu_capability(const struct kvm_pmu_ops *pmu_ops) pmu_ops->MAX_NR_GP_COUNTERS); kvm_pmu_cap.num_counters_fixed = min(kvm_pmu_cap.num_counters_fixed, KVM_PMC_MAX_FIXED); + + if (pmu_ops->init_pmu_capability) + pmu_ops->init_pmu_capability(); } static inline void kvm_pmu_request_counter_reprogram(struct kvm_pmc *pmc) diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 1b13a472e3f2..3316fdea212a 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -68,6 +68,36 @@ static int fixed_pmc_events[] = { [2] = PSEUDO_ARCH_REFERENCE_CYCLES, }; +static void intel_init_pmu_capability(void) +{ + int i; + + /* + * Perf may (sadly) back a guest fixed counter with a general purpose + * counter, and so KVM must hide fixed counters whose associated + * architectural event are unsupported. On real hardware, this should + * never happen, but if KVM is running on a funky virtual CPU model... + * + * TODO: Drop this horror if/when KVM stops using perf events for + * guest fixed counters, or can explicitly request fixed counters. + */ + for (i = 0; i < kvm_pmu_cap.num_counters_fixed; i++) { + int event = fixed_pmc_events[i]; + + /* + * Ignore pseudo-architectural events, they're a bizarre way of + * requesting events from perf that _can't_ be backed with a + * general purpose architectural event, i.e. they're guaranteed + * to be backed by the real fixed counter. + */ + if (event < NR_REAL_INTEL_ARCH_EVENTS && + (kvm_pmu_cap.events_mask & BIT(event))) + break; + } + + kvm_pmu_cap.num_counters_fixed = i; +} + static void reprogram_fixed_counters(struct kvm_pmu *pmu, u64 data) { struct kvm_pmc *pmc; @@ -789,6 +819,7 @@ void intel_pmu_cross_mapped_check(struct kvm_pmu *pmu) } struct kvm_pmu_ops intel_pmu_ops __initdata = { + .init_pmu_capability = intel_init_pmu_capability, .hw_event_available = intel_hw_event_available, .pmc_idx_to_pmc = intel_pmc_idx_to_pmc, .rdpmc_ecx_to_pmc = intel_rdpmc_ecx_to_pmc, From patchwork Tue Oct 24 00:26:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157156 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633516vqx; Mon, 23 Oct 2023 17:27:02 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFdu7Yzakf/T9UEVekDse3xxoK/+FMefMVlQGTfm1TTC4ZxD+iLQR9GSOLXJgIekitDkszd X-Received: by 2002:a17:903:22d0:b0:1ca:e16f:a713 with SMTP id y16-20020a17090322d000b001cae16fa713mr8200353plg.2.1698107222532; Mon, 23 Oct 2023 17:27:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107222; cv=none; d=google.com; s=arc-20160816; b=nOW3Bka5eY1ald62pKO7ep+slBp1AVQMDLixSWTnefOLUvaFTuQ3N1JMH0xj5wzDJ/ M9gH6rKfO5Pr/jHOf+EeI8l1UwNPEB/KFSOGxgIU+RnY81Y6c1MryDLbTTExKcxe8M31 0frof7k/vgFmePlzuxt9cXUNdKL/4WhI2ZjgG5hbqnukBxEwIrDjx+y3JKSrGN2wegSp 6zOe51wt5q/Svh29PstZZOjpLs9wb12imRuVuVHsdQi8T4h888C1HAgotEB+CoPt286e P0ui0KM8RH77ocZ394chCrPmvcvy6rJpKZlQbwq5La8BnY0KzbQyfcD8MFcTK1XfmClK Rhyw== 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=g4kIN+NDAiITyOKUUPdApOuHTeRJ+9iSBbDvve6Hp2k=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=VNqmH/s1mi+eYehi1fQDoB+hcEoSAAwDLDMqwYUR4ptg5L1JkDcSP9o3WRD/6Xjxo+ hM7fbx7Tf+Z32WZkBgEdgk/Vj+XUDBUIL9vXsHCJyb76xFWUoNJAbTslL9mX8+htOhTy Nyk5ofLldCLz/BmIMSEZP0fTPAX6w1fm/A1tGsaB26XkC/2j/boFtKPFEH2d46V8wbf+ Mt3ptIVjymx5UNscVMsqO+5YaRpKd2uNoHbSFFR5Nzuh93jPxfRHUNopQeWKsQ94xH0a 5YYD4lvaUa+HcBxfkzMijA73qFAU/HlcDp7Ri54HXNTdNcUW8PXT7vYMhXXnlN1iUNQq 5PrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=H8TaCRA2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 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 snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id y6-20020a170902864600b001c3da86939csi7065430plt.546.2023.10.23.17.27.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:27:02 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=H8TaCRA2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id A48EF80C244E; Mon, 23 Oct 2023 17:27:01 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231834AbjJXA0u (ORCPT + 27 others); Mon, 23 Oct 2023 20:26:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41820 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231686AbjJXA0p (ORCPT ); Mon, 23 Oct 2023 20:26:45 -0400 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 E7346D7A for ; Mon, 23 Oct 2023 17:26:42 -0700 (PDT) Received: by mail-pl1-x649.google.com with SMTP id d9443c01a7336-1c9d7dc2b36so26443175ad.0 for ; Mon, 23 Oct 2023 17:26:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107202; x=1698712002; darn=vger.kernel.org; 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=g4kIN+NDAiITyOKUUPdApOuHTeRJ+9iSBbDvve6Hp2k=; b=H8TaCRA2WdMcgeLNicN4Q6UXVdf2rogIWpIqrhMdMmcUXs+ILMQ2RoITtq216ZG9/5 On9Mkcsxv5EpnKLQdm9FTezrA9m9zD9PBy8by3EXmRtfVwXFTNubp1qoEDBqaw7HLxG5 9ADcrqhJsajjZIpJeHbFaAC3HSUtbWLMW2Au22ZiB9KSBacaF6sXhICpCRsTDPXSHTSs gjcJl++k3ym5PNUA06IRcTXbVx7+xKR37N0ukjXp+uD5f1nYmZG81qxqCnvuarftO+fn IQtY5Ker0LxxAEdS3gofO5a9bRBsl8h9ArxpQf2/VYpOOk9Cn5ZB66adJyYw2jWSpJaT 6dCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107202; x=1698712002; 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=g4kIN+NDAiITyOKUUPdApOuHTeRJ+9iSBbDvve6Hp2k=; b=TVxlRyNpmUHbTkT15YsSaolYq11yGRlWMZVxu1XTVzNI+jNiydj+2mhe8xQ3h7rl8i aUFJIuImZCxOpRxtbQ2pqBtkGzt/QDjUeo1/nIc71bkNTEn+AbwU+n34kYpkme7sI1rg fAVL7QlHq36YTIAIvc+Uv8brJ/ahQROeuQR8VmWRU3EmWp59qifFDewuk5S49Zzdb7ud ykarCz7UIEnw+vEP20BI9L+hHjoz20tgdYwQ9yo6DLQzMK/bzcdPkki3caiEMGXHEUl0 O7duTv6ksWYymARhZ0dlrk7s+P9ZrykNbMeAC+c2Z+OEvMSQHaFh3PE7sLF46Lr9KYFO RFIg== X-Gm-Message-State: AOJu0Yz6OszfK7FosA51OXManVA7wNzTKqZaFI8WpZrS4IAh7pSsblaq y2Uxbn22klJb72uJ901Vq4lCs/C/+Ek= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:26c6:b0:1bb:a78c:7a3e with SMTP id jg6-20020a17090326c600b001bba78c7a3emr226757plb.3.1698107202417; Mon, 23 Oct 2023 17:26:42 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:23 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-4-seanjc@google.com> Subject: [PATCH v5 03/13] KVM: x86/pmu: Always treat Fixed counters as available when supported From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu 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_BLOCKED,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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:27:01 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594478490593987 X-GMAIL-MSGID: 1780594478490593987 Now that KVM hides fixed counters that can't be virtualized, treat fixed counters as available when they are supported, i.e. don't silently ignore an enabled fixed counter just because guest CPUID says the associated general purpose architectural event is unavailable. KVM originally treated fixed counters as always available, but that got changed as part of a fix to avoid confusing REF_CPU_CYCLES, which does NOT map to an architectural event, with the actual architectural event used associated with bit 7, TOPDOWN_SLOTS. The commit justified the change with: If the event is marked as unavailable in the Intel guest CPUID 0AH.EBX leaf, we need to avoid any perf_event creation, whether it's a gp or fixed counter. but that justification doesn't mesh with reality. The Intel SDM uses "architectural events" to refer to both general purpose events (the ones with the reverse polarity mask in CPUID.0xA.EBX) and the events for fixed counters, e.g. the SDM makes statements like: Each of the fixed-function PMC can count only one architectural performance event. but the fact that fixed counter 2 (TSC reference cycles) doesn't have an associated general purpose architectural makes trying to apply the mask from CPUID.0xA.EBX impossible. Furthermore, the SDM never explicitly says that an architectural events that's marked unavailable in EBX affects the fixed counters. Note, at the time of the change, KVM didn't enforce hardware support, i.e. didn't prevent userspace from enumerating support in guest CPUID.0xA.EBX for architectural events that aren't supported in hardware. I.e. silently dropping the fixed counter didn't somehow protection against counting the wrong event, it just enforced guest CPUID. Arguably, userspace is creating a bogus vCPU model by advertising a fixed counter but saying the associated general purpose architectural event is unavailable. But regardless of the validity of the vCPU model, letting the guest enable a fixed counter and then not actually having it count anything is completely nonsensical. I.e. even if all of the above is wrong and it's illegal for a fixed counter to exist when the architectural event is unavailable, silently doing nothing is still the wrong behavior and KVM should instead disallow enabling the fixed counter in the first place. Fixes: a21864486f7e ("KVM: x86/pmu: Fix available_event_types check for REF_CPU_CYCLES event") Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/pmu_intel.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 3316fdea212a..1c0a17661781 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -138,11 +138,24 @@ static bool intel_hw_event_available(struct kvm_pmc *pmc) u8 unit_mask = (pmc->eventsel & ARCH_PERFMON_EVENTSEL_UMASK) >> 8; int i; + /* + * Fixed counters are always available if KVM reaches this point. If a + * fixed counter is unsupported in hardware or guest CPUID, KVM doesn't + * allow the counter's corresponding MSR to be written. KVM does use + * architectural events to program fixed counters, as the interface to + * perf doesn't allow requesting a specific fixed counter, e.g. perf + * may (sadly) back a guest fixed PMC with a general purposed counter. + * But if _hardware_ doesn't support the associated event, KVM simply + * doesn't enumerate support for the fixed counter. + */ + if (pmc_is_fixed(pmc)) + return true; + BUILD_BUG_ON(ARRAY_SIZE(intel_arch_events) != NR_INTEL_ARCH_EVENTS); /* * Disallow events reported as unavailable in guest CPUID. Note, this - * doesn't apply to pseudo-architectural events. + * doesn't apply to pseudo-architectural events (see above). */ for (i = 0; i < NR_REAL_INTEL_ARCH_EVENTS; i++) { if (intel_arch_events[i].eventsel != event_select || From patchwork Tue Oct 24 00:26:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157161 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633791vqx; Mon, 23 Oct 2023 17:27:51 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH0TcHs2ZX0IkeeUb+oSLUZs7O0mKORS1pSwWyI7mVMZqNVvyvhuV59kwLv2YlyqllPmv3Y X-Received: by 2002:a05:6a20:734f:b0:161:2389:e34b with SMTP id v15-20020a056a20734f00b001612389e34bmr1329061pzc.13.1698107271510; Mon, 23 Oct 2023 17:27:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107271; cv=none; d=google.com; s=arc-20160816; b=GaCwQHD02wa1BenB/LJw6dCR5MFdZfD2mrkrwRz2sKwQPoi2fH8xN4358dUroGNqB4 7XxerKapVDxAH3ttGELKqDA+2AQEkrH8Q3XrdrGCosIodMhKt8aKvQ6J+AfzmdJq+r7N T7oSUvVhuP/HNWT9xAee/DrnaO0LNZJcPkXOHWT16I64zLPqkChJLLZqr2a/DRDlDTQi Ck4F8VD4odyU+vHRXyyoNOiIqwZwyKm6bcG4+ZaVrRRFc7GKNGAEsBfsgq2O9CK6FHYU OZmY66dlTFV0siP5C9groauvqzonkDbd3PHpT6XVIUvDVI62z8kdfkuZz4BgKuc6fAkI EvDw== 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=F8dxA5PYrMgcC3TCFQUnjkCAgDkYN5FCICeYb/ZzON0=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=vs4YCV1ejiLfBNv6JQ/s+Yr5/G1tRO+M2FgtTjr05ps0U6nWH7UPrsuiJxaNiVOK0G 9BnvdS+4dyvh/1cCL2hCn1iRqy+SBOMBtEdpu8f8G/v+7GSj3Ytoh8gzP0gAUJ0ytHOc nwDie+xjyR7L2a/ZdFT8FVeApw2nMUN1Ln4QZRla+GShTHxZFnhmTouK0OrRzu1Tk7JE nOkmo3rBAX4LaLL5G7kxOEm/jvZSCG+GZU6LtFCMJ9bDfI+egRLfAsghvX0gJxn09Gbm 0z1a5CkC/VrGwVkgIdpywf3y3PxpVKzryFpPT2cq5qgKdDF5wPBpihNW/+ggvW7SDrdu rEtQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=3ANCsRAO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 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 groat.vger.email (groat.vger.email. [2620:137:e000::3:5]) by mx.google.com with ESMTPS id b69-20020a633448000000b005ac13df150bsi7196727pga.594.2023.10.23.17.27.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:27:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) client-ip=2620:137:e000::3:5; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=3ANCsRAO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id 86847805DC76; Mon, 23 Oct 2023 17:27:35 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231629AbjJXA0x (ORCPT + 27 others); Mon, 23 Oct 2023 20:26:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41828 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231725AbjJXA0q (ORCPT ); Mon, 23 Oct 2023 20:26:46 -0400 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 BBCC210D for ; Mon, 23 Oct 2023 17:26:44 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1c9c83b656fso32912225ad.1 for ; Mon, 23 Oct 2023 17:26:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107204; x=1698712004; darn=vger.kernel.org; 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=F8dxA5PYrMgcC3TCFQUnjkCAgDkYN5FCICeYb/ZzON0=; b=3ANCsRAOhw2Bys8XhAYGao+LqGKuUu60I6BcYMOl9QOwq9ONFG9TSzR7Db/ay/LHFA Xd8NBJ+hpOPC/ocdqgLZnBu5DE/fOTJ90krxvyQ2J5UJk9h8Pz0y7r9m0LIBN2dnPy8D wWBUmtudodW93UWc3NQdUIAdL1RWCFlkRce3lR+535kkwWn8yZFvMicZtm8MEC1qDk/5 5lcT0fugNM7bDMb4eJgdP4qsw1Vy2qpTUkfOC3OuBaxuye0wAY8lk0XVXrvvRjBk+zQI lBUNt2mdmDA+q/X/U+0ipYte8bmyhk9lhbMjjQradhvWUDxGmKBEMF/Q+8RSWsYhyd4W Xx2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107204; x=1698712004; 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=F8dxA5PYrMgcC3TCFQUnjkCAgDkYN5FCICeYb/ZzON0=; b=YeDPpcpsA9d56HW4RKf5dSw/tCCTgZDNvxajfo5V783FSaO6z7D5GH94kX7/UMop6g CNwifPIDsOif6zuQxdeibTh3gw9Wz9KqSMPb5ibRQrSBsOydP51eDrza8QNrQORx2X4m oEqHPjBuydA9f0preMHwDqsWAUA00H+Fav0QM1KUpaSdOV8wCppOhVBJBfviFhzcJSxE uB3xgfPv24+zy/yP2SKr9UJPiK454cyjsM48QRRGrJKebMykKNUxfcGnCq7ksPXlq9fo VN6ugV+krmiz3qQXdcHeGuh3NHVJw5W6MhnjQrQyFldiskHwC/MmM3KGyIoQ9099T3tt yPng== X-Gm-Message-State: AOJu0Yw2L+sO2nGSYxbs6w38Sj9g/zGHFDTa/Z/nJA8sKvoTK2Tg/zw3 TA8jPifvTnUWdPtm8/ex4b/IWwWyZzI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:c1d4:b0:1bc:2547:b17c with SMTP id c20-20020a170902c1d400b001bc2547b17cmr202838plc.1.1698107204068; Mon, 23 Oct 2023 17:26:44 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:24 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-5-seanjc@google.com> Subject: [PATCH v5 04/13] KVM: selftests: Add vcpu_set_cpuid_property() to set properties From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 groat.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:27:35 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594530214255306 X-GMAIL-MSGID: 1780594530214255306 From: Jinrong Liang Add vcpu_set_cpuid_property() helper function for setting properties, and use it instead of open coding an equivalent for MAX_PHY_ADDR. Future vPMU testcases will also need to stuff various CPUID properties. Signed-off-by: Jinrong Liang Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/include/x86_64/processor.h | 4 +++- tools/testing/selftests/kvm/lib/x86_64/processor.c | 12 +++++++++--- .../kvm/x86_64/smaller_maxphyaddr_emulation_test.c | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 25bc61dac5fb..a01931f7d954 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -994,7 +994,9 @@ static inline void vcpu_set_cpuid(struct kvm_vcpu *vcpu) vcpu_ioctl(vcpu, KVM_GET_CPUID2, vcpu->cpuid); } -void vcpu_set_cpuid_maxphyaddr(struct kvm_vcpu *vcpu, uint8_t maxphyaddr); +void vcpu_set_cpuid_property(struct kvm_vcpu *vcpu, + struct kvm_x86_cpu_property property, + uint32_t value); void vcpu_clear_cpuid_entry(struct kvm_vcpu *vcpu, uint32_t function); void vcpu_set_or_clear_cpuid_feature(struct kvm_vcpu *vcpu, diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c index d8288374078e..9e717bc6bd6d 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/processor.c +++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c @@ -752,11 +752,17 @@ void vcpu_init_cpuid(struct kvm_vcpu *vcpu, const struct kvm_cpuid2 *cpuid) vcpu_set_cpuid(vcpu); } -void vcpu_set_cpuid_maxphyaddr(struct kvm_vcpu *vcpu, uint8_t maxphyaddr) +void vcpu_set_cpuid_property(struct kvm_vcpu *vcpu, + struct kvm_x86_cpu_property property, + uint32_t value) { - struct kvm_cpuid_entry2 *entry = vcpu_get_cpuid_entry(vcpu, 0x80000008); + struct kvm_cpuid_entry2 *entry; + + entry = __vcpu_get_cpuid_entry(vcpu, property.function, property.index); + + (&entry->eax)[property.reg] &= ~GENMASK(property.hi_bit, property.lo_bit); + (&entry->eax)[property.reg] |= value << (property.lo_bit); - entry->eax = (entry->eax & ~0xff) | maxphyaddr; vcpu_set_cpuid(vcpu); } diff --git a/tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c b/tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c index 06edf00a97d6..9b89440dff19 100644 --- a/tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c +++ b/tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) vm_init_descriptor_tables(vm); vcpu_init_descriptor_tables(vcpu); - vcpu_set_cpuid_maxphyaddr(vcpu, MAXPHYADDR); + vcpu_set_cpuid_property(vcpu, X86_PROPERTY_MAX_PHY_ADDR, MAXPHYADDR); rc = kvm_check_cap(KVM_CAP_EXIT_ON_EMULATION_FAILURE); TEST_ASSERT(rc, "KVM_CAP_EXIT_ON_EMULATION_FAILURE is unavailable"); From patchwork Tue Oct 24 00:26:25 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157160 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633666vqx; Mon, 23 Oct 2023 17:27:29 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF+Uv22iO5uyjuhLFEzlbfo3sEU9T+AnwS+ZYW57tlMI8mo/jn8dDPkSn7+KyjuEtWnScso X-Received: by 2002:a05:6359:428b:b0:168:ea37:4708 with SMTP id kp11-20020a056359428b00b00168ea374708mr1885863rwb.5.1698107249655; Mon, 23 Oct 2023 17:27:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107249; cv=none; d=google.com; s=arc-20160816; b=Yn/BKwuM8hnysLfqVl00xoHpDLPfUENMy8L1IPK1TG3ZqCB+ALzGvdj3ob35fRj0rj ZtqGdpPu/aN7NyvIpISCgxs5n6Z4k/0nUfm2sA5WwSGbQYkIovSex2JOds+FC/0liHgP NtuW5MjkQB1tWtrcOIvqWQ7D0UyiSUaIIcfO8uy2wp+RiHuFCqnZJ2REtWNG9j1lJcGV uQREz0gw5hjWy4garhdpTg7VVL4dLghfnh8Hv9q/F8KIhaq7ta1vMlXboiclHmBpwsUi rLFG8clzDgfc8FR/uDGG9yXJ9ARBD7fGZLcCzWvxZxycbvhiUOkOtmVnDRA0w9sjLD0J Lm5w== 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=cKw2oFXjDBeLUy3TN9d0wAQBta1CYNuO3g/uAt5rkPU=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=J3nRLwXu03R7QBs0NdV6Kb3DGiw/b1/YUvugSatUnrNTi+LXO3CamCUPZXYt98LSxp UW2fiFqzqn7xPCNsRV6GlbmbRvkMUVioLJvTSb4PehhNGhlgw1iRyLEdZNTw57B8T7ds /rniUjOwCfjVpFmyhqahJp2uX8T+8KkvE7KdLabV0mNHs4tKF+6tn6Yuqj95PxKxydkg Gm/2gvu5suJcc/EBVLJ4vYOfHELXjC8gH9qeQ2U3wNZ8i6BLVRDsC3FhOsUnJMypHK6K hnJwupJu2eWapifRhGZMNsEGpqPuyyONppK+QBWQKYePtxVuJCh+Ir0xnWDl74Aya8Y3 OhMw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="vKn+/AUw"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 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 morse.vger.email (morse.vger.email. [23.128.96.31]) by mx.google.com with ESMTPS id d18-20020a637352000000b005b87be63da6si6593960pgn.488.2023.10.23.17.27.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:27:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) client-ip=23.128.96.31; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="vKn+/AUw"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id 8B86A80BB5D6; Mon, 23 Oct 2023 17:27:22 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231878AbjJXA05 (ORCPT + 27 others); Mon, 23 Oct 2023 20:26:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52602 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231775AbjJXA0t (ORCPT ); Mon, 23 Oct 2023 20:26:49 -0400 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 60D3110C6 for ; Mon, 23 Oct 2023 17:26:46 -0700 (PDT) Received: by mail-pl1-x649.google.com with SMTP id d9443c01a7336-1c9d4e38f79so28089905ad.2 for ; Mon, 23 Oct 2023 17:26:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107206; x=1698712006; darn=vger.kernel.org; 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=cKw2oFXjDBeLUy3TN9d0wAQBta1CYNuO3g/uAt5rkPU=; b=vKn+/AUweDCsC14TZMn+KQtWldIkLL/EkEtYsn7yPtJgZgLCDuGNTFQyNehKIDs1R7 2FB+dXItFGodP1BAWiHTDoszQ/2epqk2+DLDZ3/icmwMhkqkXPB7LO/IEaZhjCoFY75L KfyRKl2evBUXW1EqhZY37jGU9mukWm7yqYjEcVWsmx1MBH5F7zZFaVLBCmeaUs9euDKy kV8CtKhvlLu+3oOrHnCLyg66x6ADD307XIa10ei2nGsQWCB9oF5lGxaxcfxvQ25lqhQJ 9YIhQ5BaLmhXjViiiGegjaV+2ew5fo0UFqXaFCOxQOvfna56hAqEm7rZ29ar39TuCVYF t4zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107206; x=1698712006; 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=cKw2oFXjDBeLUy3TN9d0wAQBta1CYNuO3g/uAt5rkPU=; b=fkfihSrx5F1bT71qRyL+xn3alU/FE4tBHxzg+MTxSJKdW2dywnDx7Y56wtTD/FZnyZ yidkp9KqzyVotucS55eqGwf3TIwFagIq1DwW3tFVCTaZeUC96ve1ts4AMK7plKtikxdO zBxcyKJR8rVazN0Fa+noL18BVJ8qdWBe8/lCmxxnbMdtpAzxST+5VGTd/Qz2AiCICJ9Z 3BVpfSWsmG2OBEK2nfZJgayk5zVkvhTKiC8PuQDMqJg1Svef4Jl+jPt1NpRoca9bcYGW Sab6YgZaK3BCQgYPPQZUY79UD3haN/FtPzME2P5DrQkAd3VXhSfYg4yhKfeXhZPlL9VC 5gag== X-Gm-Message-State: AOJu0YzUHgSeIFMnC5EzJGN+ti+LvhUE6qEKXl/8Ai8sRmGqC6V06x9a lqv6nYu3D4S6ckitB4DQh8wbwTOV5zU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ab5a:b0:1c7:3462:ce8d with SMTP id ij26-20020a170902ab5a00b001c73462ce8dmr193856plb.10.1698107205898; Mon, 23 Oct 2023 17:26:45 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:25 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-6-seanjc@google.com> Subject: [PATCH v5 05/13] KVM: selftests: Drop the "name" param from KVM_X86_PMU_FEATURE() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 morse.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:27:22 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594507059852317 X-GMAIL-MSGID: 1780594507059852317 Drop the "name" parameter from KVM_X86_PMU_FEATURE(), it's unused and the name is redundant with the macro, i.e. it's truly useless. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/x86_64/processor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index a01931f7d954..2d9771151dd9 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -289,7 +289,7 @@ struct kvm_x86_cpu_property { struct kvm_x86_pmu_feature { struct kvm_x86_cpu_feature anti_feature; }; -#define KVM_X86_PMU_FEATURE(name, __bit) \ +#define KVM_X86_PMU_FEATURE(__bit) \ ({ \ struct kvm_x86_pmu_feature feature = { \ .anti_feature = KVM_X86_CPU_FEATURE(0xa, 0, EBX, __bit), \ @@ -298,7 +298,7 @@ struct kvm_x86_pmu_feature { feature; \ }) -#define X86_PMU_FEATURE_BRANCH_INSNS_RETIRED KVM_X86_PMU_FEATURE(BRANCH_INSNS_RETIRED, 5) +#define X86_PMU_FEATURE_BRANCH_INSNS_RETIRED KVM_X86_PMU_FEATURE(5) static inline unsigned int x86_family(unsigned int eax) { From patchwork Tue Oct 24 00:26:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157158 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633584vqx; Mon, 23 Oct 2023 17:27:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFO4NUGF271XF3wN1r/G3AcnJugk17TgjiUzdX5qt9a8niKgOvPYDaTg1bO9IEv+zdmiv85 X-Received: by 2002:a17:90a:e409:b0:27d:1126:1ff6 with SMTP id hv9-20020a17090ae40900b0027d11261ff6mr19941573pjb.8.1698107238141; Mon, 23 Oct 2023 17:27:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107238; cv=none; d=google.com; s=arc-20160816; b=QhIiiaYS34fUEq54GoLOXFAYwJ9uUi6zIR8mKArk0evnzGRtChC97b+5GogWnvMXd6 Ag4LZF/FyM36rh7UD4qeoqtjqhnqe3o13cKYzHUkjm3Td3fawVxSwHsEhzNgMZ5wv3mz /N8aRHF+2B45u+LvDBkzDoq2YLTSFDZfDgvrwCAkfYlhhH+PqF5NgvLAZJpfcshxr1Au +/OjQjCIVjeNDZy1wnvLwURkZiF2gYw93hcGvyQmPT1biZTzvEVVbgdm0lLVOPMI3EY8 WqnoosAv+Dj0tpr7ScPOBM7VDUQeZy3Cg5saOhVfYWbwdtpVvQChcRyq162KD//oWfbf eHJQ== 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=U9FAqMqGtvimJV8duNMrmOEEttYHO7Vcjr1pZFha2AI=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=UmYy9AooOorSK/MAS+qrOWjWAcVXRfX5jZXVIsfnjTTW1U0o2obF8XncFW9txLrX0g KhrtWZNiMQNsGEoEBgU8cGFIKbngCi4c2wDnf7E+1DJSoPrQ14ZI1GM6+3U8eAHV5EzT v4c483me6mqPLO1grXTVrxFQT5NR2Ft+ZjNQ+zBM41HOFw/bd/mHJ+zMlyEI0a43f6Ed qECzhC0sbgGe3a5dnKySmD6tcFz0pSvUfpVv9SsC5ZECXO4lC3s7HLylgLto/fi6+9xT /m4YuadJZW6CRIeIIzlgpVug3uLcBjipFhXLVpzLa3y5ZDqTnxHHL9Wbpm0lFN/bVlAn aB8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=ymyrPoeH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id y23-20020a1709027c9700b001c71eb782b0si7411171pll.94.2023.10.23.17.27.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:27:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=ymyrPoeH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 680F680C2478; Mon, 23 Oct 2023 17:27:16 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231892AbjJXA1G (ORCPT + 27 others); Mon, 23 Oct 2023 20:27:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231845AbjJXA0w (ORCPT ); Mon, 23 Oct 2023 20:26:52 -0400 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 9B4CF10DB for ; Mon, 23 Oct 2023 17:26:48 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-5a7af69a4baso52994427b3.0 for ; Mon, 23 Oct 2023 17:26:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107207; x=1698712007; darn=vger.kernel.org; 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=U9FAqMqGtvimJV8duNMrmOEEttYHO7Vcjr1pZFha2AI=; b=ymyrPoeHtVTHjKzVDHZ3lYEMIix9RkvQml9sH1EKPAPBpnckYVYW+gVePkIixl5pIi sTGO/gSzZ/bIQ/SHNU7srTlKMhMjfg9I4mgjvtxO2KtuxWDVjgoHEOSbxuc3wp+hIDvn fAxttTmZlDYJv7fQ302ghiVKJzW/sNgyI4Q2So4rDqenZ2Wum/Zto/EHoboZewtVVL8E b2qt7YyDsI5HQ1mtF1X7A+Gf2SeOrL1f1tVxMVgfuUdF2wlbbo3QPhmKXqmXlZ7NZTnh +EOVh47DtAL1p4ETxEtL5bS2yCOv8JCErPchVyzVdHOmtREI5znIcXl5k3PsJyidnWSc Wp6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107207; x=1698712007; 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=U9FAqMqGtvimJV8duNMrmOEEttYHO7Vcjr1pZFha2AI=; b=Rkq9sLPRY64blKwRniDLov3dgbHDh7sl89qv3WfDz+fngQJsrnfmsh827aWP4meVK4 jC5emGLBpCrQlmgJT2+YMrqUzsK+MoO39ar7KYUuXYu8wIdm0QC0GzvsycgtSVC+osko ZqC4o5Wc6thPkngDivg/mpfm8cdAWICfcOz774UNCFFuMwZW/bg4+dY1uXM5TZIxRAyY 02H5lZa6xKqHmItXdbfKK8bMXYLE91aPCvNLPT0aby1pIcmTxkfQeyCq8zWUeNPrnN6d swGJ1GSioMQ4KgH2cwjXY4tCE1BeI2ZEEVWe2P251ndUVNFqWrBbDxR96HIPASS34HHp sGHg== X-Gm-Message-State: AOJu0YxZAtTKc6qF/VXea2qtDK7YqL2cnVa+fq44ekVi8BYo9nu8zAeH XqoBY5/j8R6n00Nj7fh/57s4Nl+rbUs= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6902:1083:b0:d9a:c3b8:4274 with SMTP id v3-20020a056902108300b00d9ac3b84274mr281851ybu.7.1698107207733; Mon, 23 Oct 2023 17:26:47 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:26 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-7-seanjc@google.com> Subject: [PATCH v5 06/13] KVM: selftests: Extend {kvm,this}_pmu_has() to support fixed counters From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu 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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:27:16 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594495450881500 X-GMAIL-MSGID: 1780594495450881500 Extend the kvm_x86_pmu_feature framework to allow querying for fixed counters via {kvm,this}_pmu_has(). Like architectural events, checking for a fixed counter annoyingly requires checking multiple CPUID fields, as a fixed counter exists if: FxCtr[i]_is_supported := ECX[i] || (EDX[4:0] > i); Note, KVM currently doesn't actually support exposing fixed counters via the bitmask, but that will hopefully change sooner than later, and Intel's SDM explicitly "recommends" checking both the number of counters and the mask. Rename the intermedate "anti_feature" field to simply 'f' since the fixed counter bitmask (thankfully) doesn't have reversed polarity like the architectural events bitmask. Note, ideally the helpers would use BUILD_BUG_ON() to assert on the incoming register, but the expected usage in PMU tests can't guarantee the inputs are compile-time constants. Opportunistically define macros for all of the architectural events and fixed counters that KVM currently supports. Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/x86_64/processor.h | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 2d9771151dd9..b103c462701b 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -281,24 +281,39 @@ struct kvm_x86_cpu_property { * that indicates the feature is _not_ supported, and a property that states * the length of the bit mask of unsupported features. A feature is supported * if the size of the bit mask is larger than the "unavailable" bit, and said - * bit is not set. + * bit is not set. Fixed counters also bizarre enumeration, but inverted from + * arch events for general purpose counters. Fixed counters are supported if a + * feature flag is set **OR** the total number of fixed counters is greater + * than index of the counter. * - * Wrap the "unavailable" feature to simplify checking whether or not a given - * architectural event is supported. + * Wrap the events for general purpose and fixed counters to simplify checking + * whether or not a given architectural event is supported. */ struct kvm_x86_pmu_feature { - struct kvm_x86_cpu_feature anti_feature; + struct kvm_x86_cpu_feature f; }; -#define KVM_X86_PMU_FEATURE(__bit) \ -({ \ - struct kvm_x86_pmu_feature feature = { \ - .anti_feature = KVM_X86_CPU_FEATURE(0xa, 0, EBX, __bit), \ - }; \ - \ - feature; \ +#define KVM_X86_PMU_FEATURE(__reg, __bit) \ +({ \ + struct kvm_x86_pmu_feature feature = { \ + .f = KVM_X86_CPU_FEATURE(0xa, 0, __reg, __bit), \ + }; \ + \ + kvm_static_assert(KVM_CPUID_##__reg == KVM_CPUID_EBX || \ + KVM_CPUID_##__reg == KVM_CPUID_ECX); \ + feature; \ }) -#define X86_PMU_FEATURE_BRANCH_INSNS_RETIRED KVM_X86_PMU_FEATURE(5) +#define X86_PMU_FEATURE_CPU_CYCLES KVM_X86_PMU_FEATURE(EBX, 0) +#define X86_PMU_FEATURE_INSNS_RETIRED KVM_X86_PMU_FEATURE(EBX, 1) +#define X86_PMU_FEATURE_REFERENCE_CYCLES KVM_X86_PMU_FEATURE(EBX, 2) +#define X86_PMU_FEATURE_LLC_REFERENCES KVM_X86_PMU_FEATURE(EBX, 3) +#define X86_PMU_FEATURE_LLC_MISSES KVM_X86_PMU_FEATURE(EBX, 4) +#define X86_PMU_FEATURE_BRANCH_INSNS_RETIRED KVM_X86_PMU_FEATURE(EBX, 5) +#define X86_PMU_FEATURE_BRANCHES_MISPREDICTED KVM_X86_PMU_FEATURE(EBX, 6) + +#define X86_PMU_FEATURE_INSNS_RETIRED_FIXED KVM_X86_PMU_FEATURE(ECX, 0) +#define X86_PMU_FEATURE_CPU_CYCLES_FIXED KVM_X86_PMU_FEATURE(ECX, 1) +#define X86_PMU_FEATURE_REFERENCE_CYCLES_FIXED KVM_X86_PMU_FEATURE(ECX, 2) static inline unsigned int x86_family(unsigned int eax) { @@ -697,10 +712,16 @@ static __always_inline bool this_cpu_has_p(struct kvm_x86_cpu_property property) static inline bool this_pmu_has(struct kvm_x86_pmu_feature feature) { - uint32_t nr_bits = this_cpu_property(X86_PROPERTY_PMU_EBX_BIT_VECTOR_LENGTH); + uint32_t nr_bits; - return nr_bits > feature.anti_feature.bit && - !this_cpu_has(feature.anti_feature); + if (feature.f.reg == KVM_CPUID_EBX) { + nr_bits = this_cpu_property(X86_PROPERTY_PMU_EBX_BIT_VECTOR_LENGTH); + return nr_bits > feature.f.bit && !this_cpu_has(feature.f); + } + + GUEST_ASSERT(feature.f.reg == KVM_CPUID_ECX); + nr_bits = this_cpu_property(X86_PROPERTY_PMU_NR_FIXED_COUNTERS); + return nr_bits > feature.f.bit || this_cpu_has(feature.f); } static __always_inline uint64_t this_cpu_supported_xcr0(void) @@ -916,10 +937,16 @@ static __always_inline bool kvm_cpu_has_p(struct kvm_x86_cpu_property property) static inline bool kvm_pmu_has(struct kvm_x86_pmu_feature feature) { - uint32_t nr_bits = kvm_cpu_property(X86_PROPERTY_PMU_EBX_BIT_VECTOR_LENGTH); + uint32_t nr_bits; - return nr_bits > feature.anti_feature.bit && - !kvm_cpu_has(feature.anti_feature); + if (feature.f.reg == KVM_CPUID_EBX) { + nr_bits = kvm_cpu_property(X86_PROPERTY_PMU_EBX_BIT_VECTOR_LENGTH); + return nr_bits > feature.f.bit && !kvm_cpu_has(feature.f); + } + + TEST_ASSERT_EQ(feature.f.reg, KVM_CPUID_ECX); + nr_bits = kvm_cpu_property(X86_PROPERTY_PMU_NR_FIXED_COUNTERS); + return nr_bits > feature.f.bit || kvm_cpu_has(feature.f); } static __always_inline uint64_t kvm_cpu_supported_xcr0(void) From patchwork Tue Oct 24 00:26:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157157 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633577vqx; Mon, 23 Oct 2023 17:27:17 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEhHlH8phYMsjmo2D/k4zJeBkTMBKIJaEoZCdzlaEuHloX0yLNEwv33qeCBnld+ljHMgQKq X-Received: by 2002:a17:902:74c2:b0:1ca:71:ea43 with SMTP id f2-20020a17090274c200b001ca0071ea43mr11406592plt.9.1698107237344; Mon, 23 Oct 2023 17:27:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107237; cv=none; d=google.com; s=arc-20160816; b=EkuRbcn2UOHn5neEznjJGMX+ukwx6wNIGMUYZGKnTupWLXwqI8a78snzIqWG4yYS52 tatvy4YgEW84MU3X+Ker1BUjlCoBRQyQHSXkrnltzmfk9TwqlPCk8eWCptgR5HUD7C8B /WgceI4iwvMqJwqtckiEAaP1wWNhkf9H3cN0WFY8vuLgZ2P8o5icfiiEx3kJBAYo2NaI RLdLXs1TNIWJ2Wd6g+nEfmf9MDfHQ/nQaNZ2JhSCLY7QIFhshjOMns8GDdIxOeSaErQl NMpymsquqop2SrNTSaPCrZlrY5QQgo8IjsQGRFVNfqRRC3eI0TRwoCXpvEXr67npg+ty PWqA== 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=JwQXCr637BG2GMnZ3Zgjp5AEv/uuEs9akrm/IfbGmL8=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=dmHsDHc+QJ2Jzun0J+oJE/lOyxrAqMI6iPekeV1zJ0+WmyOKf4kitNs3SHJdYBaO8x pcfgKpitw0U3WlyyzxEAKmsbFGFa3dusy+Tk8V8EfB2yv6msmCFOnFoQ53CuCNKTX64a 6bCqJlOHNs5KxkR4uTpLbCiAS/TE4U80BM3BUnXNMavhFCYlSIPmMWgC5t/SNuKkAGdd kCKRF2lY8CQcTNs7zCZznPy3mT0dI2ggTTW1MxAFmfyncywgGce0x8XCoRBXCb9hlUlp mEm8CV2KdfXz9l8GPFW41hgbvq5YJ7WsOu76ZghgJAVf/ch+lej95I+kr8nwRW7vo0It uJRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="lkD/UItx"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id l12-20020a170902f68c00b001b6ae9f8bb1si7575488plg.75.2023.10.23.17.27.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:27:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="lkD/UItx"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 0F83980C2476; Mon, 23 Oct 2023 17:27:16 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232122AbjJXA1L (ORCPT + 27 others); Mon, 23 Oct 2023 20:27:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52628 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231776AbjJXA1D (ORCPT ); Mon, 23 Oct 2023 20:27:03 -0400 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 548C410C8 for ; Mon, 23 Oct 2023 17:26:50 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1c9da175faaso26359545ad.1 for ; Mon, 23 Oct 2023 17:26:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107209; x=1698712009; darn=vger.kernel.org; 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=JwQXCr637BG2GMnZ3Zgjp5AEv/uuEs9akrm/IfbGmL8=; b=lkD/UItx0iwqy2N9mYXLbZR//gwHVHVPGnz6SiR0YIplbf45hPVKTom8Bh9jRHdyPV nxJpjAPtRF6HDbXU1InMnNTlz7VEWFkxKVcyyVqZnDr5pbRpNE0riYBJeYjYqeYBFlZA L0NYOX1ksavUSeaYlkJYPa9Nx1FDeyhUIR39nYz+CBOxA0Jpct2LpJdMkuip09A/cVO/ 0QYEMFDr446/r1LEcLZRXf9dX1Y1YFFKvLHdVjculiRr+92xafSTQoybqHkhxN3rHaEf Yi0gB1kmGK/mLeS2gF3fVNl17JWQMMMsimKasUcXL6xq1ZYBzdBdimzkXo1j07XxNtEO ZF8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107209; x=1698712009; 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=JwQXCr637BG2GMnZ3Zgjp5AEv/uuEs9akrm/IfbGmL8=; b=REb/dxMmhezuNzWr49ZK32N9fUrGquwXrw2oKI6DJlvncGbqBSyilj8xGGX6q1QnFe LbdDssKN/sfcG6RtpY1gFdbK4+BwNoHxgyQVxlKsdYac6XM7ogujxoCbFnC3fSb+Sytf 9wzf8pL/J5f9Iyzxg6bhpwXFSxg758tIDI9oHDl4jPHf3RqNt69AMoF25+h0MS7j4hST rWpc/JRYobYrwMjuznkLEzjyjXPl/U/KiOeKqM29emCU4yfRDjWC/+hp24rSpGQgyf0s G7PsQs0p24hTAux9XpsiH/FpK9RyNrIfL5rk35MS6k+EXjl5w8q5ARzamm53x+zUSWgt zCIg== X-Gm-Message-State: AOJu0YwHOiqRy6MjHA803+B7m0E0xbuuvujrkrUTIQCBfSMeeM0YfU3E CAj6udjWRGAuFUU+TUMY0h2IPcldAvE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ab5a:b0:1bf:cc5:7b53 with SMTP id ij26-20020a170902ab5a00b001bf0cc57b53mr198433plb.1.1698107209479; Mon, 23 Oct 2023 17:26:49 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:27 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-8-seanjc@google.com> Subject: [PATCH v5 07/13] KVM: selftests: Add pmu.h and lib/pmu.c for common PMU assets From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu 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_BLOCKED,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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:27:16 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594494076801312 X-GMAIL-MSGID: 1780594494076801312 From: Jinrong Liang By defining the PMU performance events and masks relevant for x86 in the new pmu.h and pmu.c, it becomes easier to reference them, minimizing potential errors in code that handles these values. Clean up pmu_event_filter_test.c by including pmu.h and removing unnecessary macros. Suggested-by: Sean Christopherson Signed-off-by: Jinrong Liang [sean: drop PSEUDO_ARCH_REFERENCE_CYCLES] Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + tools/testing/selftests/kvm/include/pmu.h | 84 +++++++++++++++++++ tools/testing/selftests/kvm/lib/pmu.c | 28 +++++++ .../kvm/x86_64/pmu_event_filter_test.c | 32 ++----- 4 files changed, 122 insertions(+), 23 deletions(-) create mode 100644 tools/testing/selftests/kvm/include/pmu.h create mode 100644 tools/testing/selftests/kvm/lib/pmu.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index fb01c3f8d3da..ed1c17cabc07 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -23,6 +23,7 @@ LIBKVM += lib/guest_modes.c LIBKVM += lib/io.c LIBKVM += lib/kvm_util.c LIBKVM += lib/memstress.c +LIBKVM += lib/pmu.c LIBKVM += lib/guest_sprintf.c LIBKVM += lib/rbtree.c LIBKVM += lib/sparsebit.c diff --git a/tools/testing/selftests/kvm/include/pmu.h b/tools/testing/selftests/kvm/include/pmu.h new file mode 100644 index 000000000000..987602c62b51 --- /dev/null +++ b/tools/testing/selftests/kvm/include/pmu.h @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2023, Tencent, Inc. + */ +#ifndef SELFTEST_KVM_PMU_H +#define SELFTEST_KVM_PMU_H + +#include + +#define X86_PMC_IDX_MAX 64 +#define INTEL_PMC_MAX_GENERIC 32 +#define KVM_PMU_EVENT_FILTER_MAX_EVENTS 300 + +#define GP_COUNTER_NR_OFS_BIT 8 +#define EVENT_LENGTH_OFS_BIT 24 + +#define PMU_VERSION_MASK GENMASK_ULL(7, 0) +#define EVENT_LENGTH_MASK GENMASK_ULL(31, EVENT_LENGTH_OFS_BIT) +#define GP_COUNTER_NR_MASK GENMASK_ULL(15, GP_COUNTER_NR_OFS_BIT) +#define FIXED_COUNTER_NR_MASK GENMASK_ULL(4, 0) + +#define ARCH_PERFMON_EVENTSEL_EVENT GENMASK_ULL(7, 0) +#define ARCH_PERFMON_EVENTSEL_UMASK GENMASK_ULL(15, 8) +#define ARCH_PERFMON_EVENTSEL_USR BIT_ULL(16) +#define ARCH_PERFMON_EVENTSEL_OS BIT_ULL(17) +#define ARCH_PERFMON_EVENTSEL_EDGE BIT_ULL(18) +#define ARCH_PERFMON_EVENTSEL_PIN_CONTROL BIT_ULL(19) +#define ARCH_PERFMON_EVENTSEL_INT BIT_ULL(20) +#define ARCH_PERFMON_EVENTSEL_ANY BIT_ULL(21) +#define ARCH_PERFMON_EVENTSEL_ENABLE BIT_ULL(22) +#define ARCH_PERFMON_EVENTSEL_INV BIT_ULL(23) +#define ARCH_PERFMON_EVENTSEL_CMASK GENMASK_ULL(31, 24) + +#define PMC_MAX_FIXED 16 +#define PMC_IDX_FIXED 32 + +/* RDPMC offset for Fixed PMCs */ +#define PMC_FIXED_RDPMC_BASE BIT_ULL(30) +#define PMC_FIXED_RDPMC_METRICS BIT_ULL(29) + +#define FIXED_BITS_MASK 0xFULL +#define FIXED_BITS_STRIDE 4 +#define FIXED_0_KERNEL BIT_ULL(0) +#define FIXED_0_USER BIT_ULL(1) +#define FIXED_0_ANYTHREAD BIT_ULL(2) +#define FIXED_0_ENABLE_PMI BIT_ULL(3) + +#define fixed_bits_by_idx(_idx, _bits) \ + ((_bits) << ((_idx) * FIXED_BITS_STRIDE)) + +#define AMD64_NR_COUNTERS 4 +#define AMD64_NR_COUNTERS_CORE 6 + +#define PMU_CAP_FW_WRITES BIT_ULL(13) +#define PMU_CAP_LBR_FMT 0x3f + +enum intel_pmu_architectural_events { + /* + * The order of the architectural events matters as support for each + * event is enumerated via CPUID using the index of the event. + */ + INTEL_ARCH_CPU_CYCLES, + INTEL_ARCH_INSTRUCTIONS_RETIRED, + INTEL_ARCH_REFERENCE_CYCLES, + INTEL_ARCH_LLC_REFERENCES, + INTEL_ARCH_LLC_MISSES, + INTEL_ARCH_BRANCHES_RETIRED, + INTEL_ARCH_BRANCHES_MISPREDICTED, + NR_INTEL_ARCH_EVENTS, +}; + +enum amd_pmu_k7_events { + AMD_ZEN_CORE_CYCLES, + AMD_ZEN_INSTRUCTIONS, + AMD_ZEN_BRANCHES, + AMD_ZEN_BRANCH_MISSES, + NR_AMD_ARCH_EVENTS, +}; + +extern const uint64_t intel_pmu_arch_events[]; +extern const uint64_t amd_pmu_arch_events[]; +extern const int intel_pmu_fixed_pmc_events[]; + +#endif /* SELFTEST_KVM_PMU_H */ diff --git a/tools/testing/selftests/kvm/lib/pmu.c b/tools/testing/selftests/kvm/lib/pmu.c new file mode 100644 index 000000000000..27a6c35f98a1 --- /dev/null +++ b/tools/testing/selftests/kvm/lib/pmu.c @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2023, Tencent, Inc. + */ + +#include + +#include "pmu.h" + +/* Definitions for Architectural Performance Events */ +#define ARCH_EVENT(select, umask) (((select) & 0xff) | ((umask) & 0xff) << 8) + +const uint64_t intel_pmu_arch_events[] = { + [INTEL_ARCH_CPU_CYCLES] = ARCH_EVENT(0x3c, 0x0), + [INTEL_ARCH_INSTRUCTIONS_RETIRED] = ARCH_EVENT(0xc0, 0x0), + [INTEL_ARCH_REFERENCE_CYCLES] = ARCH_EVENT(0x3c, 0x1), + [INTEL_ARCH_LLC_REFERENCES] = ARCH_EVENT(0x2e, 0x4f), + [INTEL_ARCH_LLC_MISSES] = ARCH_EVENT(0x2e, 0x41), + [INTEL_ARCH_BRANCHES_RETIRED] = ARCH_EVENT(0xc4, 0x0), + [INTEL_ARCH_BRANCHES_MISPREDICTED] = ARCH_EVENT(0xc5, 0x0), +}; + +const uint64_t amd_pmu_arch_events[] = { + [AMD_ZEN_CORE_CYCLES] = ARCH_EVENT(0x76, 0x00), + [AMD_ZEN_INSTRUCTIONS] = ARCH_EVENT(0xc0, 0x00), + [AMD_ZEN_BRANCHES] = ARCH_EVENT(0xc2, 0x00), + [AMD_ZEN_BRANCH_MISSES] = ARCH_EVENT(0xc3, 0x00), +}; diff --git a/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c b/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c index 283cc55597a4..b6e4f57a8651 100644 --- a/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c +++ b/tools/testing/selftests/kvm/x86_64/pmu_event_filter_test.c @@ -11,31 +11,18 @@ */ #define _GNU_SOURCE /* for program_invocation_short_name */ -#include "test_util.h" + #include "kvm_util.h" +#include "pmu.h" #include "processor.h" - -/* - * In lieu of copying perf_event.h into tools... - */ -#define ARCH_PERFMON_EVENTSEL_OS (1ULL << 17) -#define ARCH_PERFMON_EVENTSEL_ENABLE (1ULL << 22) - -/* End of stuff taken from perf_event.h. */ - -/* Oddly, this isn't in perf_event.h. */ -#define ARCH_PERFMON_BRANCHES_RETIRED 5 +#include "test_util.h" #define NUM_BRANCHES 42 -#define INTEL_PMC_IDX_FIXED 32 - -/* Matches KVM_PMU_EVENT_FILTER_MAX_EVENTS in pmu.c */ -#define MAX_FILTER_EVENTS 300 #define MAX_TEST_EVENTS 10 #define PMU_EVENT_FILTER_INVALID_ACTION (KVM_PMU_EVENT_DENY + 1) #define PMU_EVENT_FILTER_INVALID_FLAGS (KVM_PMU_EVENT_FLAGS_VALID_MASK << 1) -#define PMU_EVENT_FILTER_INVALID_NEVENTS (MAX_FILTER_EVENTS + 1) +#define PMU_EVENT_FILTER_INVALID_NEVENTS (KVM_PMU_EVENT_FILTER_MAX_EVENTS + 1) /* * This is how the event selector and unit mask are stored in an AMD @@ -63,7 +50,6 @@ #define AMD_ZEN_BR_RETIRED EVENT(0xc2, 0) - /* * "Retired instructions", from Processor Programming Reference * (PPR) for AMD Family 17h Model 01h, Revision B1 Processors, @@ -84,7 +70,7 @@ struct __kvm_pmu_event_filter { __u32 fixed_counter_bitmap; __u32 flags; __u32 pad[4]; - __u64 events[MAX_FILTER_EVENTS]; + __u64 events[KVM_PMU_EVENT_FILTER_MAX_EVENTS]; }; /* @@ -729,14 +715,14 @@ static void add_dummy_events(uint64_t *events, int nevents) static void test_masked_events(struct kvm_vcpu *vcpu) { - int nevents = MAX_FILTER_EVENTS - MAX_TEST_EVENTS; - uint64_t events[MAX_FILTER_EVENTS]; + int nevents = KVM_PMU_EVENT_FILTER_MAX_EVENTS - MAX_TEST_EVENTS; + uint64_t events[KVM_PMU_EVENT_FILTER_MAX_EVENTS]; /* Run the test cases against a sparse PMU event filter. */ run_masked_events_tests(vcpu, events, 0); /* Run the test cases against a dense PMU event filter. */ - add_dummy_events(events, MAX_FILTER_EVENTS); + add_dummy_events(events, KVM_PMU_EVENT_FILTER_MAX_EVENTS); run_masked_events_tests(vcpu, events, nevents); } @@ -818,7 +804,7 @@ static void intel_run_fixed_counter_guest_code(uint8_t fixed_ctr_idx) /* Only OS_EN bit is enabled for fixed counter[idx]. */ wrmsr(MSR_CORE_PERF_FIXED_CTR_CTRL, BIT_ULL(4 * fixed_ctr_idx)); wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, - BIT_ULL(INTEL_PMC_IDX_FIXED + fixed_ctr_idx)); + BIT_ULL(PMC_IDX_FIXED + fixed_ctr_idx)); __asm__ __volatile__("loop ." : "+c"((int){NUM_BRANCHES})); wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0); From patchwork Tue Oct 24 00:26:28 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157164 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633994vqx; Mon, 23 Oct 2023 17:28:22 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHK/t7PIrs6PXJGvPLCLcnJVanIN7SqVBzYVINf/lUA/zZIRXUrbizzrHqRiGfYZQwyVkKC X-Received: by 2002:a05:6358:ce30:b0:168:cd22:c8e3 with SMTP id gt48-20020a056358ce3000b00168cd22c8e3mr7424780rwb.0.1698107302035; Mon, 23 Oct 2023 17:28:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107301; cv=none; d=google.com; s=arc-20160816; b=0pGncnizqdzmjxFL1Yb8OXeem+PtRkrzJbz6DraZyhgwCsXw8o9XM7Sc++hBtWifXx L2vjEJi5F03J9DTzgLD5RdhTYDaGsK8e+K2TfdF8pE/6oHT46zlcT0hzLyEFoBklgzzS h3Dk8rDKNjajbz1uVu+5OOPLxs3Ye6F3YQFaUrjqGDH9Tg/uEduvrFDAut6VnyZmg8/9 CPZRGvVdNMU/dCRmlyK65zMvRhzfGBrdw4/Xz9MDdDtPOrXJhFNTdVMeW6V1QEiaQUOG Xdyi/l4VAu6r6bhuacC/Ra1il6iismskKRV6+C0av13nJVUs43eBFIdj7/6MrO95pHQx kP3g== 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=0U+dLPR8elz3+cGklc6/3G8uITKyjqrZ5KLIjMTZ3q8=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=uPCy7oQW8wg9nxM6iPE/wq7oKiO1LFCYXDJI3FCQrExF6AtlahLS0yqeOsCUgtRbEh j6ynH5VXqyINa6j2JrgcxrsCUUfgjhxzZ/iT7VuVcx049sqhkXO2RLlVkgtFic/3xIOn xD6PJYYiiq60bIpvjRjY8FUzn+P58Sv+uUHpkL8LWR1mY4Qe4TGneitSkx08/5reYkz9 h1IMV6oHKbNFSwELJyBUp63vIMhUrRUN2MI8yeJqdfSWhTFKGGBwdLJQeeTe4JoIQBzG OZ/3lizJC+kuao10hdrjnS+e2iD4R6NiqkkhNYw3jw0TuEiSQOCSU+Jmv6uGqrDXWjw7 PCRg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=yU1A3L10; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 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 groat.vger.email (groat.vger.email. [2620:137:e000::3:5]) by mx.google.com with ESMTPS id j17-20020a633c11000000b00578b9d1d118si7224570pga.219.2023.10.23.17.28.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:28:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) client-ip=2620:137:e000::3:5; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=yU1A3L10; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id 44B03809A799; Mon, 23 Oct 2023 17:28:08 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231942AbjJXA1W (ORCPT + 27 others); Mon, 23 Oct 2023 20:27:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231913AbjJXA1D (ORCPT ); Mon, 23 Oct 2023 20:27:03 -0400 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 D8D0B10F3 for ; Mon, 23 Oct 2023 17:26:51 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1c9c939cc94so28740485ad.1 for ; Mon, 23 Oct 2023 17:26:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107211; x=1698712011; darn=vger.kernel.org; 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=0U+dLPR8elz3+cGklc6/3G8uITKyjqrZ5KLIjMTZ3q8=; b=yU1A3L10BSMTA6J2kZ593aTlbJ7631hanoC4gNl2rTP6fQ7wgVbTPa3+ExDiRICWDp qMgaeRkd0SBl/TBpLh2yAyfp+iCgibWfqpkoUjE+gOr9roCdicYQYl6L6B71U2Z30OvF kCTea/DCcpUykKLj7n7gPgoLa6MJBPlGtgoS914YjvDNy98Tg+8zacG7GMlKuq+BrgwD JNdZ+aTz7e+WM5Xlc0XXK93E487SjI7AlRwTmFaPeUDr0zzh/npVktOJpGFirTBfrRTE Rod8OZtUCrH+wT5+qbFA2SVBuRsPBeu07qBozr01n2g0MnlfI629RKOwVc7mHC8uoEbR /K0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107211; x=1698712011; 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=0U+dLPR8elz3+cGklc6/3G8uITKyjqrZ5KLIjMTZ3q8=; b=YA7zSnJj1sTm2PinT2h6ast30nbRq/hPsYnJzknQ52n2cnYlZHB50C2sIWBMPZLkJ6 gnH+iR7+RcEIWA5aeITylUCIjVONg1iIkS7dwffFZbi6AIPrK2+TfTPC2WRY+uJriBr9 sHuSskzx+OZpNHfiXY3fbje+WAwSMBqAk5WCksQ2S3yJA3rxZjqmhnGYMzGNl5FOOxJ0 OzoBcAffmdJMQVN/bCeehTYHF5LHadCsL9xTQgISmdqE8DN2z8UHnXsG1oqdhxqGkTne DAqcwEmyQndEzW9AyBKmHVyw7/++9TDshX3VmaH5iv+wPFYQTz9MtO5m6HMuBrIPsAY6 g6Ig== X-Gm-Message-State: AOJu0Yw0fyg+uyP1OikILuFasAQvdGMIpky+7zWuKePgy4Enf5RrNx2G hFyyCOoj2an6OnsqLyQM27riBE6FWJY= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:64c2:b0:1cb:de60:874c with SMTP id y2-20020a17090264c200b001cbde60874cmr37994pli.12.1698107211277; Mon, 23 Oct 2023 17:26:51 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:28 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-9-seanjc@google.com> Subject: [PATCH v5 08/13] KVM: selftests: Test Intel PMU architectural events on gp counters From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 groat.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:28:08 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594562656788396 X-GMAIL-MSGID: 1780594562656788396 From: Jinrong Liang Add test cases to check if different Architectural events are available after it's marked as unavailable via CPUID. It covers vPMU event filtering logic based on Intel CPUID, which is a complement to pmu_event_filter. According to Intel SDM, the number of architectural events is reported through CPUID.0AH:EAX[31:24] and the architectural event x is supported if EBX[x]=0 && EAX[31:24]>x. Co-developed-by: Like Xu Signed-off-by: Like Xu Signed-off-by: Jinrong Liang Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/x86_64/pmu_counters_test.c | 189 ++++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/pmu_counters_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index ed1c17cabc07..4c024fb845b4 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -82,6 +82,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/mmio_warning_test TEST_GEN_PROGS_x86_64 += x86_64/monitor_mwait_test TEST_GEN_PROGS_x86_64 += x86_64/nested_exceptions_test TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test +TEST_GEN_PROGS_x86_64 += x86_64/pmu_counters_test TEST_GEN_PROGS_x86_64 += x86_64/pmu_event_filter_test TEST_GEN_PROGS_x86_64 += x86_64/set_boot_cpu_id TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test diff --git a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c new file mode 100644 index 000000000000..2a6336b994d5 --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2023, Tencent, Inc. + */ + +#define _GNU_SOURCE /* for program_invocation_short_name */ +#include + +#include "pmu.h" +#include "processor.h" + +/* Guest payload for any performance counter counting */ +#define NUM_BRANCHES 10 + +static struct kvm_vm *pmu_vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, + void *guest_code) +{ + struct kvm_vm *vm; + + vm = vm_create_with_one_vcpu(vcpu, guest_code); + vm_init_descriptor_tables(vm); + vcpu_init_descriptor_tables(*vcpu); + + return vm; +} + +static void run_vcpu(struct kvm_vcpu *vcpu) +{ + struct ucall uc; + + do { + vcpu_run(vcpu); + switch (get_ucall(vcpu, &uc)) { + case UCALL_SYNC: + break; + case UCALL_ABORT: + REPORT_GUEST_ASSERT(uc); + break; + case UCALL_DONE: + break; + default: + TEST_FAIL("Unexpected ucall: %lu", uc.cmd); + } + } while (uc.cmd != UCALL_DONE); +} + +static bool pmu_is_intel_event_stable(uint8_t idx) +{ + switch (idx) { + case INTEL_ARCH_CPU_CYCLES: + case INTEL_ARCH_INSTRUCTIONS_RETIRED: + case INTEL_ARCH_REFERENCE_CYCLES: + case INTEL_ARCH_BRANCHES_RETIRED: + return true; + default: + return false; + } +} + +static void guest_measure_pmu_v1(struct kvm_x86_pmu_feature event, + uint32_t counter_msr, uint32_t nr_gp_counters) +{ + uint8_t idx = event.f.bit; + unsigned int i; + + for (i = 0; i < nr_gp_counters; i++) { + wrmsr(counter_msr + i, 0); + wrmsr(MSR_P6_EVNTSEL0 + i, ARCH_PERFMON_EVENTSEL_OS | + ARCH_PERFMON_EVENTSEL_ENABLE | intel_pmu_arch_events[idx]); + __asm__ __volatile__("loop ." : "+c"((int){NUM_BRANCHES})); + + if (pmu_is_intel_event_stable(idx)) + GUEST_ASSERT_EQ(this_pmu_has(event), !!_rdpmc(i)); + + wrmsr(MSR_P6_EVNTSEL0 + i, ARCH_PERFMON_EVENTSEL_OS | + !ARCH_PERFMON_EVENTSEL_ENABLE | + intel_pmu_arch_events[idx]); + wrmsr(counter_msr + i, 0); + __asm__ __volatile__("loop ." : "+c"((int){NUM_BRANCHES})); + + if (pmu_is_intel_event_stable(idx)) + GUEST_ASSERT(!_rdpmc(i)); + } + + GUEST_DONE(); +} + +static void guest_measure_loop(uint8_t idx) +{ + const struct { + struct kvm_x86_pmu_feature gp_event; + } intel_event_to_feature[] = { + [INTEL_ARCH_CPU_CYCLES] = { X86_PMU_FEATURE_CPU_CYCLES }, + [INTEL_ARCH_INSTRUCTIONS_RETIRED] = { X86_PMU_FEATURE_INSNS_RETIRED }, + [INTEL_ARCH_REFERENCE_CYCLES] = { X86_PMU_FEATURE_REFERENCE_CYCLES }, + [INTEL_ARCH_LLC_REFERENCES] = { X86_PMU_FEATURE_LLC_REFERENCES }, + [INTEL_ARCH_LLC_MISSES] = { X86_PMU_FEATURE_LLC_MISSES }, + [INTEL_ARCH_BRANCHES_RETIRED] = { X86_PMU_FEATURE_BRANCH_INSNS_RETIRED }, + [INTEL_ARCH_BRANCHES_MISPREDICTED] = { X86_PMU_FEATURE_BRANCHES_MISPREDICTED }, + }; + + uint32_t nr_gp_counters = this_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); + uint32_t pmu_version = this_cpu_property(X86_PROPERTY_PMU_VERSION); + struct kvm_x86_pmu_feature gp_event; + uint32_t counter_msr; + unsigned int i; + + if (rdmsr(MSR_IA32_PERF_CAPABILITIES) & PMU_CAP_FW_WRITES) + counter_msr = MSR_IA32_PMC0; + else + counter_msr = MSR_IA32_PERFCTR0; + + gp_event = intel_event_to_feature[idx].gp_event; + TEST_ASSERT_EQ(idx, gp_event.f.bit); + + if (pmu_version < 2) { + guest_measure_pmu_v1(gp_event, counter_msr, nr_gp_counters); + return; + } + + for (i = 0; i < nr_gp_counters; i++) { + wrmsr(counter_msr + i, 0); + wrmsr(MSR_P6_EVNTSEL0 + i, ARCH_PERFMON_EVENTSEL_OS | + ARCH_PERFMON_EVENTSEL_ENABLE | + intel_pmu_arch_events[idx]); + + wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, BIT_ULL(i)); + __asm__ __volatile__("loop ." : "+c"((int){NUM_BRANCHES})); + wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0); + + if (pmu_is_intel_event_stable(idx)) + GUEST_ASSERT_EQ(this_pmu_has(gp_event), !!_rdpmc(i)); + } + + GUEST_DONE(); +} + +static void test_arch_events_cpuid(uint8_t i, uint8_t j, uint8_t idx) +{ + uint8_t arch_events_unavailable_mask = BIT_ULL(j); + uint8_t arch_events_bitmap_size = BIT_ULL(i); + struct kvm_vcpu *vcpu; + struct kvm_vm *vm; + + vm = pmu_vm_create_with_one_vcpu(&vcpu, guest_measure_loop); + + vcpu_set_cpuid_property(vcpu, X86_PROPERTY_PMU_EBX_BIT_VECTOR_LENGTH, + arch_events_bitmap_size); + vcpu_set_cpuid_property(vcpu, X86_PROPERTY_PMU_EVENTS_MASK, + arch_events_unavailable_mask); + + vcpu_args_set(vcpu, 1, idx); + + run_vcpu(vcpu); + + kvm_vm_free(vm); +} + +static void test_intel_arch_events(void) +{ + uint8_t idx, i, j; + + for (idx = 0; idx < NR_INTEL_ARCH_EVENTS; idx++) { + /* + * A brute force iteration of all combinations of values is + * likely to exhaust the limit of the single-threaded thread + * fd nums, so it's test by iterating through all valid + * single-bit values. + */ + for (i = 0; i < NR_INTEL_ARCH_EVENTS; i++) { + for (j = 0; j < NR_INTEL_ARCH_EVENTS; j++) + test_arch_events_cpuid(i, j, idx); + } + } +} + +int main(int argc, char *argv[]) +{ + TEST_REQUIRE(get_kvm_param_bool("enable_pmu")); + + TEST_REQUIRE(host_cpu_is_intel); + TEST_REQUIRE(kvm_cpu_has_p(X86_PROPERTY_PMU_VERSION)); + TEST_REQUIRE(kvm_cpu_property(X86_PROPERTY_PMU_VERSION) > 0); + TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_PDCM)); + + test_intel_arch_events(); + + return 0; +} From patchwork Tue Oct 24 00:26:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157162 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633951vqx; Mon, 23 Oct 2023 17:28:16 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHlHJvXDIqjdlVi1EvzHAjBDuXECs45Yp+io/976zx4952VwxjXYWIlk4iVi71cuFa9/CJa X-Received: by 2002:a17:902:d489:b0:1ca:28f3:568e with SMTP id c9-20020a170902d48900b001ca28f3568emr9202907plg.51.1698107296061; Mon, 23 Oct 2023 17:28:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107296; cv=none; d=google.com; s=arc-20160816; b=sYFNjZCigQEUAqtbrM/izXtiwOuAdIyaZo+wQiB9N+HKz0u0A8FfMbI6POjU1NyJl8 YrcYCH+sguyNaNWROZwy7jqwPrBvDcVnCdvyL0+WEtjny7/Z9q14zYaBI5N1Fe6l62rS ACQdrwHRxQvkbVanx4k3PT8GRHssMdZvymR+fVzLTjRE4xLGGfAEv5NrhKIZilCJl6GC fKR3XgG8ssBBBMl88K09nYs8RXye7YL3hI5jYeZXajvW0h0O9+Jaf7KonpVbqCIX1Iab DpP5kkbOHvyQ/YjkaELSiBGa7pLzlsB0CkbT35xEJX5Pw8WWLtPiwc7OoiZk2wCdMCra tueg== 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=9PRm2qPI6Hb9eDZmaLCMIjwG1XEncicGFs+ftKdyMw0=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=t8uB6RSUenZZw80d9u/bI1WJZzc7puSau//hCby8ChLu+W6LriTTdq1bN51KHkw+HR 7yKDixi4qEtHl5QdGK+0DfeoRUUwpqaOT6jrr/nxsNqztLz1JohyRrrwLvnrAJ5bksZH yMfRfKR5H+bhkpxslWXNThs9DBbh9PJyR07fstPp8wiAkQPAsjZv/8etfZG5NETpGm8z 2ws30OBMvkCGrplvHV6nNnqmqWh0DQMu1Z0K4ME9TRm6Ddo+vBZ+i1z/HrWtscmKZnv7 pZNnAY9ZbZQE7zv6CNZ7WModIskl9HcRM+anArbijMFLiKnbxJCeG/OxU9mH5Lq527Hz 76+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=GeXm48us; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 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 groat.vger.email (groat.vger.email. [2620:137:e000::3:5]) by mx.google.com with ESMTPS id u3-20020a17090282c300b001c72c792794si7055814plz.47.2023.10.23.17.28.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:28:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) client-ip=2620:137:e000::3:5; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=GeXm48us; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id 7ED26809A79E; Mon, 23 Oct 2023 17:28:03 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231880AbjJXA1R (ORCPT + 27 others); Mon, 23 Oct 2023 20:27:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49894 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231736AbjJXA1F (ORCPT ); Mon, 23 Oct 2023 20:27:05 -0400 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 DFFC71709 for ; Mon, 23 Oct 2023 17:26:53 -0700 (PDT) Received: by mail-pl1-x649.google.com with SMTP id d9443c01a7336-1c9e0b9b96cso28687515ad.2 for ; Mon, 23 Oct 2023 17:26:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107213; x=1698712013; darn=vger.kernel.org; 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=9PRm2qPI6Hb9eDZmaLCMIjwG1XEncicGFs+ftKdyMw0=; b=GeXm48usbyMoKFGdJEwQhQDL9/O9HJeRxfbvPhBBb1X52Twog2iuZNPGRwm7iSyWdM sO0ZTWxrEGzzaAGMEEChkCfv8CDlpo82tpYElzaooxFKkFy26Y72SQHlvFLnj1WtxraZ 6taImWgIfq8Q8pqOpHD1n73cqwikfXNzSUe1JKbkN2MV25TVCwBHUWlrl9v+ysJnWuy+ YYJJY3Q5AAAGPuQDVqWyqGj1apgDtP3gKItyKway2+y2mcduhcSL4AMK+jio3ve2NZ+E PxuND/AqDrvQ+bjLYzTEGOad+1UJ89KBBhOws3ACJJ0DaBIbO49g9h81GQDCBDusyf/d RZwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107213; x=1698712013; 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=9PRm2qPI6Hb9eDZmaLCMIjwG1XEncicGFs+ftKdyMw0=; b=WT77Qgle/RnrqWUzjPKLDCGIRFO5m32JLoafdIWfNptH4RyDmC+u/5RHg9cktX++x1 fgJmM89nw81q10vYRPfDxsl4PRedZpjX2CEUwG+NT1MBajT54GiepNQCwUiIcLo6iesx BQ/e5lzlDMiFSABYV2AlfOZSUUJ+khIj6i5/6hp1DALpknYHL1qMV8Xrv2vgSs8Y9Kkm fllFUox6w6wEDqO1W7sjb73ZkNaAN/bB/x6boW5x/zTWiOygm8Ye/u4CBqWeCUXGYzLv B8yIbKnOLllvqap93GWjTOggroC0WPMnKq0oqNkX5C+YXivB+8beOrJOq5lmIRO1weEf hzWg== X-Gm-Message-State: AOJu0Yz2AWjN1V8RINQEF19KDlpxV+yuzhmBLMGzr8VSjj7QgKsZBKnR 2G5cTyDTTKjRLLqTj1+9VnpvEeq/6js= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:8c:b0:1ca:8629:82a3 with SMTP id o12-20020a170903008c00b001ca862982a3mr170488pld.6.1698107213086; Mon, 23 Oct 2023 17:26:53 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:29 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-10-seanjc@google.com> Subject: [PATCH v5 09/13] KVM: selftests: Test Intel PMU architectural events on fixed counters From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 groat.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:28:03 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594556225711534 X-GMAIL-MSGID: 1780594556225711534 From: Jinrong Liang Update test to cover Intel PMU architectural events on fixed counters. Per Intel SDM, PMU users can also count architecture performance events on fixed counters (specifically, FIXED_CTR0 for the retired instructions and FIXED_CTR1 for cpu core cycles event). Therefore, if guest's CPUID indicates that an architecture event is not available, the corresponding fixed counter will also not count that event. Co-developed-by: Like Xu Signed-off-by: Like Xu Signed-off-by: Jinrong Liang Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../selftests/kvm/x86_64/pmu_counters_test.c | 54 ++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c index 2a6336b994d5..410d09f788ef 100644 --- a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c +++ b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c @@ -85,23 +85,44 @@ static void guest_measure_pmu_v1(struct kvm_x86_pmu_feature event, GUEST_DONE(); } +#define X86_PMU_FEATURE_NULL \ +({ \ + struct kvm_x86_pmu_feature feature = {}; \ + \ + feature; \ +}) + +static bool pmu_is_null_feature(struct kvm_x86_pmu_feature event) +{ + return !(*(u64 *)&event); +} + static void guest_measure_loop(uint8_t idx) { const struct { struct kvm_x86_pmu_feature gp_event; + struct kvm_x86_pmu_feature fixed_event; } intel_event_to_feature[] = { - [INTEL_ARCH_CPU_CYCLES] = { X86_PMU_FEATURE_CPU_CYCLES }, - [INTEL_ARCH_INSTRUCTIONS_RETIRED] = { X86_PMU_FEATURE_INSNS_RETIRED }, - [INTEL_ARCH_REFERENCE_CYCLES] = { X86_PMU_FEATURE_REFERENCE_CYCLES }, - [INTEL_ARCH_LLC_REFERENCES] = { X86_PMU_FEATURE_LLC_REFERENCES }, - [INTEL_ARCH_LLC_MISSES] = { X86_PMU_FEATURE_LLC_MISSES }, - [INTEL_ARCH_BRANCHES_RETIRED] = { X86_PMU_FEATURE_BRANCH_INSNS_RETIRED }, - [INTEL_ARCH_BRANCHES_MISPREDICTED] = { X86_PMU_FEATURE_BRANCHES_MISPREDICTED }, + [INTEL_ARCH_CPU_CYCLES] = { X86_PMU_FEATURE_CPU_CYCLES, X86_PMU_FEATURE_CPU_CYCLES_FIXED }, + [INTEL_ARCH_INSTRUCTIONS_RETIRED] = { X86_PMU_FEATURE_INSNS_RETIRED, X86_PMU_FEATURE_INSNS_RETIRED_FIXED }, + /* + * Note, the fixed counter for reference cycles is NOT the same + * as the general purpose architectural event (because the GP + * event is garbage). The fixed counter explicitly counts at + * the same frequency as the TSC, whereas the GP event counts + * at a fixed, but uarch specific, frequency. Bundle them here + * for simplicity. + */ + [INTEL_ARCH_REFERENCE_CYCLES] = { X86_PMU_FEATURE_REFERENCE_CYCLES, X86_PMU_FEATURE_REFERENCE_CYCLES_FIXED }, + [INTEL_ARCH_LLC_REFERENCES] = { X86_PMU_FEATURE_LLC_REFERENCES, X86_PMU_FEATURE_NULL }, + [INTEL_ARCH_LLC_MISSES] = { X86_PMU_FEATURE_LLC_MISSES, X86_PMU_FEATURE_NULL }, + [INTEL_ARCH_BRANCHES_RETIRED] = { X86_PMU_FEATURE_BRANCH_INSNS_RETIRED, X86_PMU_FEATURE_NULL }, + [INTEL_ARCH_BRANCHES_MISPREDICTED] = { X86_PMU_FEATURE_BRANCHES_MISPREDICTED, X86_PMU_FEATURE_NULL }, }; uint32_t nr_gp_counters = this_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); uint32_t pmu_version = this_cpu_property(X86_PROPERTY_PMU_VERSION); - struct kvm_x86_pmu_feature gp_event; + struct kvm_x86_pmu_feature gp_event, fixed_event; uint32_t counter_msr; unsigned int i; @@ -132,6 +153,23 @@ static void guest_measure_loop(uint8_t idx) GUEST_ASSERT_EQ(this_pmu_has(gp_event), !!_rdpmc(i)); } + fixed_event = intel_event_to_feature[idx].fixed_event; + if (pmu_is_null_feature(fixed_event) || !this_pmu_has(fixed_event)) + goto done; + + i = fixed_event.f.bit; + + wrmsr(MSR_CORE_PERF_FIXED_CTR0 + i, 0); + wrmsr(MSR_CORE_PERF_FIXED_CTR_CTRL, BIT_ULL(4 * i)); + + wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, BIT_ULL(PMC_IDX_FIXED + i)); + __asm__ __volatile__("loop ." : "+c"((int){NUM_BRANCHES})); + wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0); + + if (pmu_is_intel_event_stable(idx)) + GUEST_ASSERT_NE(_rdpmc(PMC_FIXED_RDPMC_BASE | i), 0); + +done: GUEST_DONE(); } From patchwork Tue Oct 24 00:26:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157163 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1633965vqx; Mon, 23 Oct 2023 17:28:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG3QC7oDmJkmtc9KtjKiw6J1Bhl6TNsVwhLV2I82QwqwTkPMH3aePY3VCBXn3gqCF9obatM X-Received: by 2002:a17:903:294e:b0:1ca:5a82:e582 with SMTP id li14-20020a170903294e00b001ca5a82e582mr8826391plb.22.1698107298274; Mon, 23 Oct 2023 17:28:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107298; cv=none; d=google.com; s=arc-20160816; b=h3iHpTyPmt8lnmo8EtDv7VyBaKD6vvMQEh8PbSNENVMP036eF1Q8NwTehXx7XdFYQI 694B3q0i+0SFDKW8ct4ZyJ2jA959q86O/Lj4FIY2cdx69wJ++04o9BjPN2lu8X6BmJg6 cPwDC42yLi61Idu2QJ2L/sYLAEvSlN4Tg8OneG3r9UJN7YLtH76WNff+UeHqBu73YFD6 dykKf3ayEQIUzy3eOYoYATjr4cSAJmMcmOK89IEELEE0JIHg2Z9zWUYoCH7IFexDJKq7 1iNgminTh9r/2LnIKF8tmutErKRAh+5BAm3zfgLHGgX4IPOICAf2zAAFnPEkx9YNgTtl bV2w== 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=iY/ybdzlTO573Vp4ngFbRoGUgka/mobzIHiA6krmWYs=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=Zxv+2FlTAVApm25dVarN98pidhrE5dL/7u0zGkbMbC7EU3PkTsRjrft4uDTVbkHZcr /hycd4qu1OJX8FmW8EoflALp8Qtr5wnkvp/R+S6yN44JOVLOw6hQMzvmipRcWJHbWSSi j8+z7DFglpx4F03OWYtR5xrOYSkxjRX8//YnUK+EZudlV8/5gS3NJDROeilzRG9ATJXV +tT4nxeVKzLDx9LKUljNvr4bH41LQNEpmkpIE0RokQWdhsdjqU8uvZc+K3aB3Es4RkMw LH7hVuaG6AFz/dgdlkv+Kchc/asQg0gdtlauuXmdA/pxtlM9qV14+FJ1wHFxNV9ZY9f2 wzGQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=aEKVFk3N; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 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 agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id 18-20020a170902ee5200b001c60502ccd4si6947703plo.642.2023.10.23.17.28.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:28:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=aEKVFk3N; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id E5E2C80A9AA9; Mon, 23 Oct 2023 17:28:14 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232098AbjJXA1g (ORCPT + 27 others); Mon, 23 Oct 2023 20:27:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52676 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232058AbjJXA1I (ORCPT ); Mon, 23 Oct 2023 20:27:08 -0400 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 4F968172D for ; Mon, 23 Oct 2023 17:26:57 -0700 (PDT) Received: by mail-pg1-x549.google.com with SMTP id 41be03b00d2f7-5b7f3f47547so2400575a12.3 for ; Mon, 23 Oct 2023 17:26:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107215; x=1698712015; darn=vger.kernel.org; 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=iY/ybdzlTO573Vp4ngFbRoGUgka/mobzIHiA6krmWYs=; b=aEKVFk3N/H5E+o4007jXxqL/1Cp5rVStABXX7rWvMw1ngAaIJpJYDUZ5esW7Obisdw GoOAKZ1Yb/o/rOY4apwP2opyU51Z74G03IQ1cnaXmgqsj3PFS38DW4Oq8T9KZbgj8UHh ZZlwR9bUFwkjhBQx+yMNpAfsop7ZPyZsyAKedLF1Bc+YCRGokjQP5gIB5ERM2jBbD19K bdvzrNCsLucA06MhGyRjMZtwngNGu3Jj9AtSf7iC5l6ncHHJzqQfiLB3hbdSSVAkgVvP wv0AquTx+tnvDfgBCsEn3uxmrGEeF3W27hZSlBN0vBgMJUwngKs9qMkXxOhwsr/9SvRA dGlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107215; x=1698712015; 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=iY/ybdzlTO573Vp4ngFbRoGUgka/mobzIHiA6krmWYs=; b=cbao5lhqJaoavZCAzt8e3QVFzMlQxpyq+RkCwG3q0KuGuJa+Sn70H0BPLudLoinjZ0 pDCULThHA5aN4eBLXE5B9Oh7Un1I/kamJV6yOjsrwn5ydQ/VxQK71RR8wAEYnRI9WQae TDCcWdzm3/QnXzkHDZhFyf5mCA9Pfi8yoYUdbjSTbqcW+fBj2Hx7pQ9z4dhPs5VOOCU+ bDav45PO6SvbLv07tXPknTjCXbxsJUND4xxAkuCd2hmYWxHaOnymwvy83d9chonc8e2F qKPvSyZaEpLvcRrRV2fWFUGCDpdXU0Vtr4/z3MlJVR64F5m/0TnvNIYJOaZuZJgrbYBl 9opw== X-Gm-Message-State: AOJu0YyRnfiz+9sk0o5Oxm5ZfrX4qla2SthHJqVF4NJepqe55LdtAyRx GDEUuzEGBDqqNZxWKv43W3fZy27jFVE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ee53:b0:1ca:8c48:736e with SMTP id 19-20020a170902ee5300b001ca8c48736emr174043plo.9.1698107215022; Mon, 23 Oct 2023 17:26:55 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:30 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-11-seanjc@google.com> Subject: [PATCH v5 10/13] KVM: selftests: Test consistency of CPUID with num of gp counters From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:28:15 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594558292724303 X-GMAIL-MSGID: 1780594558292724303 From: Jinrong Liang Add a test to verify that KVM correctly emulates MSR-based accesses to general purpose counters based on guest CPUID, e.g. that accesses to non-existent counters #GP and accesses to existent counters succeed. Note, for compatibility reasons, KVM does not emulate #GP when MSR_P6_PERFCTR[0|1] is not present (writes should be dropped). Co-developed-by: Like Xu Signed-off-by: Like Xu Signed-off-by: Jinrong Liang Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../selftests/kvm/x86_64/pmu_counters_test.c | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c index 410d09f788ef..274b7f4d4b53 100644 --- a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c +++ b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c @@ -212,6 +212,103 @@ static void test_intel_arch_events(void) } } +/* + * Limit testing to MSRs that are actually defined by Intel (in the SDM). MSRs + * that aren't defined counter MSRs *probably* don't exist, but there's no + * guarantee that currently undefined MSR indices won't be used for something + * other than PMCs in the future. + */ +#define MAX_NR_GP_COUNTERS 8 +#define MAX_NR_FIXED_COUNTERS 3 + +#define GUEST_ASSERT_PMC_MSR_ACCESS(insn, msr, expect_gp, vector) \ +__GUEST_ASSERT(expect_gp ? vector == GP_VECTOR : !vector, \ + "Expected %s on " #insn "(0x%x), got vector %u", \ + expect_gp ? "#GP" : "no fault", msr, vector) \ + +static void guest_rd_wr_counters(uint32_t base_msr, uint8_t nr_possible_counters, + uint8_t nr_counters) +{ + uint8_t i; + + for (i = 0; i < nr_possible_counters; i++) { + const uint32_t msr = base_msr + i; + const bool expect_success = i < nr_counters; + + /* + * KVM drops writes to MSR_P6_PERFCTR[0|1] if the counters are + * unsupported, i.e. doesn't #GP and reads back '0'. + */ + const uint64_t expected_val = expect_success ? 0xffff : 0; + const bool expect_gp = !expect_success && msr != MSR_P6_PERFCTR0 && + msr != MSR_P6_PERFCTR1; + uint8_t vector; + uint64_t val; + + vector = wrmsr_safe(msr, 0xffff); + GUEST_ASSERT_PMC_MSR_ACCESS(WRMSR, msr, expect_gp, vector); + + vector = rdmsr_safe(msr, &val); + GUEST_ASSERT_PMC_MSR_ACCESS(RDMSR, msr, expect_gp, vector); + + /* On #GP, the result of RDMSR is undefined. */ + if (!expect_gp) + __GUEST_ASSERT(val == expected_val, + "Expected RDMSR(0x%x) to yield 0x%lx, got 0x%lx", + msr, expected_val, val); + + vector = wrmsr_safe(msr, 0); + GUEST_ASSERT_PMC_MSR_ACCESS(WRMSR, msr, expect_gp, vector); + } + GUEST_DONE(); +} + +static void guest_test_gp_counters(void) +{ + uint8_t nr_gp_counters = this_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); + uint32_t base_msr; + + if (rdmsr(MSR_IA32_PERF_CAPABILITIES) & PMU_CAP_FW_WRITES) + base_msr = MSR_IA32_PMC0; + else + base_msr = MSR_IA32_PERFCTR0; + + guest_rd_wr_counters(base_msr, MAX_NR_GP_COUNTERS, nr_gp_counters); +} + +static void test_gp_counters(uint8_t nr_gp_counters, uint64_t perf_cap) +{ + struct kvm_vcpu *vcpu; + struct kvm_vm *vm; + + vm = pmu_vm_create_with_one_vcpu(&vcpu, guest_test_gp_counters); + + vcpu_set_cpuid_property(vcpu, X86_PROPERTY_PMU_NR_GP_COUNTERS, + nr_gp_counters); + vcpu_set_msr(vcpu, MSR_IA32_PERF_CAPABILITIES, perf_cap); + + run_vcpu(vcpu); + + kvm_vm_free(vm); +} + +static void test_intel_counters(void) +{ + uint8_t nr_gp_counters = kvm_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); + unsigned int i; + uint8_t j; + + const uint64_t perf_caps[] = { + 0, + PMU_CAP_FW_WRITES, + }; + + for (i = 0; i < ARRAY_SIZE(perf_caps); i++) { + for (j = 0; j <= nr_gp_counters; j++) + test_gp_counters(j, perf_caps[i]); + } +} + int main(int argc, char *argv[]) { TEST_REQUIRE(get_kvm_param_bool("enable_pmu")); @@ -222,6 +319,7 @@ int main(int argc, char *argv[]) TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_PDCM)); test_intel_arch_events(); + test_intel_counters(); return 0; } From patchwork Tue Oct 24 00:26:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157167 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1634098vqx; Mon, 23 Oct 2023 17:28:37 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGKzRR+2AGbo7g+h2yqxGedgFOFV9yEBZ9/rReoaYSBSJhQsyVqWLaS50L4L8gA8Rl7fp+g X-Received: by 2002:a05:6870:1396:b0:1e9:faca:bd1d with SMTP id 22-20020a056870139600b001e9facabd1dmr11765477oas.24.1698107317701; Mon, 23 Oct 2023 17:28:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107317; cv=none; d=google.com; s=arc-20160816; b=IUXyd8MnwuNXupZQ7r8x11WPyx6+JItlHrIW1dQQwp+2wOm3rB5sURLaEwJoABTlys ckCBw2DzQdwNUoR+NtthVBqCU+egWNcXsyNZUDrJxcOfh3qnOZyJuEHXBNB/GQa9L+ID Hvyn7fdEyrlniivq0r07d6EzyrYDPjoicKQadwDDWNZO8oP+48Rv4sS6A5EvLxrV7txg iwua8jFhh4PsQR+Irwt+kCsR7Xbmzr1MjEIY8bR6yEGB0jCOiB7GHkAIrCpmX+nRhVzA 60OkYLHtPDaS7XuXZaD4iZLU4NDlbGJv0YG0JgjRz7+yEQ5iebKM/kBq+AkJtZwJokH+ DQJw== 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=+RoABScHftr6hc85optkCJ7nhZ5E1OiZawbS1myLt1k=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=bZ+G0KesrCNAEwzNkxtPvdTdZDyGdVhHMTqvmZ3whaMaGgv8uNd6iCv9SBC3XMeuL5 nJyr0IKBzYw8W+w7twg2ZaAQwmm332mlJG4u3feMu/pwYpUEuEJUU0d8MZqy/5uAgLF3 qCSCDgzixWD1URSzkDmHhmHcKPgeWT4qzs0XgNqA/VnGQ+48nHZfG9cEOqCAISHUazk0 NlrXzjcXXb8JXm7PbUWQD/vaZWnlaArafrrItq8xmIm9p5+HpE1jL1YX3RofilMEDc7Z zz0v1dAJ6d/bGZDs+YaIsrxeTdJIsaQAisvvg9BQg1GbdwkoL5sivilTT6eiPVgrvuV8 eILg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=eMGZGAZk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 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 groat.vger.email (groat.vger.email. [23.128.96.35]) by mx.google.com with ESMTPS id bs189-20020a6328c6000000b005b837dc0b4fsi7118610pgb.445.2023.10.23.17.28.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:28:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 as permitted sender) client-ip=23.128.96.35; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=eMGZGAZk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id 3CA7A809B760; Mon, 23 Oct 2023 17:28:23 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232022AbjJXA1n (ORCPT + 27 others); Mon, 23 Oct 2023 20:27:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49794 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232017AbjJXA1c (ORCPT ); Mon, 23 Oct 2023 20:27:32 -0400 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 BE80F10C for ; Mon, 23 Oct 2023 17:27:00 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id 3f1490d57ef6-da03ef6fc30so120437276.0 for ; Mon, 23 Oct 2023 17:27:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107217; x=1698712017; darn=vger.kernel.org; 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=+RoABScHftr6hc85optkCJ7nhZ5E1OiZawbS1myLt1k=; b=eMGZGAZkRO4INJO88zyNeJLn+DRIDaKftvYeybrSWKHr04FRGR3jYgdBGqt5xkFHAD ZJjgaEpzztwtuFxLc8DHNz/fQKIDWajon8LfcNUtDN2cGQHb8tKsW2w5VnAzKty5YLve 67yAnoTlwuDLkRiqxHaQdcKZHeSFty1ErgaxUDLNS0FHnuDnblobFoNXqR4ujyALWXBP Jf42k1TVteAhtajErQva3jngeJY6IriDmnmKnQtTXZrcOPp8KQN0YfYeUQqA/yR3bien IUzPyo8f3PYVNBCTm2QnM4IiI5Z07YFtvy5D0XKvEKJFESxELcxqM/iIf6ZmCqPcn9LY Wrow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107217; x=1698712017; 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=+RoABScHftr6hc85optkCJ7nhZ5E1OiZawbS1myLt1k=; b=A6qS3YU9+qsxaH+imzFYqtyR1taiX7qVFS1F56IoJgL/BP5ga3sFwaqoKtWdjgT5ky 4QgphfWGy0r3XUiFSvdtyPCDljREB/+jqRYtHJZWVSaM1mP0X+xsrASaIOR2TbSj2ZnB Hsk6/Gs5t3lxcZ1MxsoI/Bb+RRbwMv1iWiqMUDoC3Mnxc7Y8gL8Tktqfi9mjJS7mFk8o DI8UeJcqbyAF1Qs9PzC/h5ztB2GSJwjTVINT1MY7G5Jdgu7gCNKh0NHWfLK7zLvo0yf8 iD6z+ObkD+dmSnoXtd9oR00e3fiQY4ntZBTklg19JEVMrMAt5cEWCpfnYkhMSyC/mGU5 1Dww== X-Gm-Message-State: AOJu0YwseaiFJ1WsHZaMkLagTwegzHSpMAOyW1vBjk03zxCianLr/h0D qn77Dg0F5AhlU6LB3gReDnctNovGe/c= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6902:1083:b0:d9a:47ea:69a5 with SMTP id v3-20020a056902108300b00d9a47ea69a5mr291702ybu.1.1698107216905; Mon, 23 Oct 2023 17:26:56 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:31 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-12-seanjc@google.com> Subject: [PATCH v5 11/13] KVM: selftests: Test consistency of CPUID with num of fixed counters From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 groat.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:28:23 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594578709612344 X-GMAIL-MSGID: 1780594578709612344 From: Jinrong Liang Extend the PMU counters test to verify KVM emulation of fixed counters in addition to general purpose counters. Fixed counters add an extra wrinkle in the form of an extra supported bitmask. Thus quoth the SDM: fixed-function performance counter 'i' is supported if ECX[i] || (EDX[4:0] > i) Test that KVM handles a counter being available through either method. Co-developed-by: Like Xu Signed-off-by: Like Xu Signed-off-by: Jinrong Liang Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../selftests/kvm/x86_64/pmu_counters_test.c | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c index 274b7f4d4b53..f1d9cdd69a17 100644 --- a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c +++ b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c @@ -227,13 +227,19 @@ __GUEST_ASSERT(expect_gp ? vector == GP_VECTOR : !vector, \ expect_gp ? "#GP" : "no fault", msr, vector) \ static void guest_rd_wr_counters(uint32_t base_msr, uint8_t nr_possible_counters, - uint8_t nr_counters) + uint8_t nr_counters, uint32_t or_mask) { uint8_t i; for (i = 0; i < nr_possible_counters; i++) { const uint32_t msr = base_msr + i; - const bool expect_success = i < nr_counters; + + /* + * Fixed counters are supported if the counter is less than the + * number of enumerated contiguous counters *or* the counter is + * explicitly enumerated in the supported counters mask. + */ + const bool expect_success = i < nr_counters || (or_mask & BIT(i)); /* * KVM drops writes to MSR_P6_PERFCTR[0|1] if the counters are @@ -273,7 +279,7 @@ static void guest_test_gp_counters(void) else base_msr = MSR_IA32_PERFCTR0; - guest_rd_wr_counters(base_msr, MAX_NR_GP_COUNTERS, nr_gp_counters); + guest_rd_wr_counters(base_msr, MAX_NR_GP_COUNTERS, nr_gp_counters, 0); } static void test_gp_counters(uint8_t nr_gp_counters, uint64_t perf_cap) @@ -292,10 +298,51 @@ static void test_gp_counters(uint8_t nr_gp_counters, uint64_t perf_cap) kvm_vm_free(vm); } +static void guest_test_fixed_counters(void) +{ + uint64_t supported_bitmask = 0; + uint8_t nr_fixed_counters = 0; + + /* KVM provides fixed counters iff the vPMU version is 2+. */ + if (this_cpu_property(X86_PROPERTY_PMU_VERSION) >= 2) + nr_fixed_counters = this_cpu_property(X86_PROPERTY_PMU_NR_FIXED_COUNTERS); + + /* + * The supported bitmask for fixed counters was introduced in PMU + * version 5. + */ + if (this_cpu_property(X86_PROPERTY_PMU_VERSION) >= 5) + supported_bitmask = this_cpu_property(X86_PROPERTY_PMU_FIXED_COUNTERS_BITMASK); + + guest_rd_wr_counters(MSR_CORE_PERF_FIXED_CTR0, MAX_NR_FIXED_COUNTERS, + nr_fixed_counters, supported_bitmask); +} + +static void test_fixed_counters(uint8_t nr_fixed_counters, + uint32_t supported_bitmask, uint64_t perf_cap) +{ + struct kvm_vcpu *vcpu; + struct kvm_vm *vm; + + vm = pmu_vm_create_with_one_vcpu(&vcpu, guest_test_fixed_counters); + + vcpu_set_cpuid_property(vcpu, X86_PROPERTY_PMU_FIXED_COUNTERS_BITMASK, + supported_bitmask); + vcpu_set_cpuid_property(vcpu, X86_PROPERTY_PMU_NR_FIXED_COUNTERS, + nr_fixed_counters); + vcpu_set_msr(vcpu, MSR_IA32_PERF_CAPABILITIES, perf_cap); + + run_vcpu(vcpu); + + kvm_vm_free(vm); +} + static void test_intel_counters(void) { + uint8_t nr_fixed_counters = kvm_cpu_property(X86_PROPERTY_PMU_NR_FIXED_COUNTERS); uint8_t nr_gp_counters = kvm_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); unsigned int i; + uint32_t k; uint8_t j; const uint64_t perf_caps[] = { @@ -306,6 +353,11 @@ static void test_intel_counters(void) for (i = 0; i < ARRAY_SIZE(perf_caps); i++) { for (j = 0; j <= nr_gp_counters; j++) test_gp_counters(j, perf_caps[i]); + + for (j = 0; j <= nr_fixed_counters; j++) { + for (k = 0; k <= (BIT(nr_fixed_counters) - 1); k++) + test_fixed_counters(j, k, perf_caps[i]); + } } } From patchwork Tue Oct 24 00:26:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157165 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1634034vqx; Mon, 23 Oct 2023 17:28:27 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGb2+xJNVX+4eYdq8cmsqBGW9OJM7u9kRJXP1YBwQlQn0/K2azgTQnX+29DNNxv8Tg0hp/U X-Received: by 2002:a17:90a:17c5:b0:27d:2100:b57c with SMTP id q63-20020a17090a17c500b0027d2100b57cmr8964535pja.37.1698107307195; Mon, 23 Oct 2023 17:28:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107307; cv=none; d=google.com; s=arc-20160816; b=eKCgpF6sonvIDrCPQjnDN813IdpI0qbPF8lX7nHwkgA4I1j8F4HqO1nkbYoAdbCRLE RxNrY0jxq5+pTRegRq/24zq9tC2NBbSxgIWX+8AOc+yZGawEzg2/QA4ikHTkK3AeWbiz QLu8SmYh9gxit2e90ztP9/QyBfKXcRBd2/5/3WkN3qlpzeKgEfWoqnnGhXf+L1D87gmG bPX5YQpp0q7sx6752jZFzyGogTSN7ZprGkem1RdZ39tDPQp8x52PJni0iG5dx7aus/e3 r4mGv13jLLKzckMUHD0sn9uD/G5eDpmjSqefZ4pZBfWxsGzqWAHe+8ZCbKySgognFOI7 Rwww== 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=14wArEVnBNhNrbZ4s3cIhEfuNUwYxvC64ZUFQ1mIX8Y=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=b2zEtCC1Hoysn0J7C5uQY4FgowDK6WKxbKdUe1+qTTeYPhctYS31flLIjuuzxe5Xki 1KQV1UenR0Lxgr4/7+GwEuI+a6oKd6wqfiKR6ir7KdXd2Yh/Au+d4V8hML7Tqa5nyFZ9 2VKWiW4IxIr+TbFAM5F37VfUZs8KwNPXtYhACDvXotFOf/WhsypcOmKTWvNmqN3ALdg2 sQ4z3I26MMGS0IM3DwmdBN60F+GmLOkV4nebF/q9Blm9AbaTBQKS4sLvAocS1BAtT+h3 Phb87+hxm5vpGbXQ9/F3U0sJzkDyiS+rhkfX5MIczsUL0+7BEzeXzCIwP6nZMBMoo/gE Ndsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=nTIWCNrV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 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 agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id go14-20020a17090b03ce00b002773152a294si6393737pjb.80.2023.10.23.17.28.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:28:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=nTIWCNrV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 685DA80A7CF6; Mon, 23 Oct 2023 17:28:24 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231835AbjJXA1s (ORCPT + 27 others); Mon, 23 Oct 2023 20:27:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48610 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231817AbjJXA1c (ORCPT ); Mon, 23 Oct 2023 20:27:32 -0400 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 DE2D210DB for ; Mon, 23 Oct 2023 17:27:01 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5a81cd8d267so75335057b3.1 for ; Mon, 23 Oct 2023 17:27:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107219; x=1698712019; darn=vger.kernel.org; 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=14wArEVnBNhNrbZ4s3cIhEfuNUwYxvC64ZUFQ1mIX8Y=; b=nTIWCNrVOi4oWDJcxrd7dX3VpfEMFgMw8vyCBc5tB6ggMhlwXYvOVBzyw+AvzF5wob gIDwhJIR7mXT/3UhsK4+N4PepcSIAcF6ceRhc7vg27nO09eSrVvpNF2Yr7fiAwSpMUBs fNuITbfgNemreJ7n4sHVWJHGr9uuhAOZLOrPjG9yQoR5MX6kqxBAGHRErUjdg7N+Btpw 7VBnYJ2jAVz2PKA9Ul013LZogOOTXE+Lpd6t3n5/KSGcNXWh3ig4b24fcdTWd8rwa5+0 nCtvEEqRCFPKJazlIL7DcnQbqA/N0saxzc71dxG7pCZhJCcME+RrsL//Xc3aB1BEbXpR f2Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107219; x=1698712019; 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=14wArEVnBNhNrbZ4s3cIhEfuNUwYxvC64ZUFQ1mIX8Y=; b=RBx80dlB7ea3NJj27dzbMImaJcbMrO8bM/01JRFq5uucQ5y67loEkIbmmRF1sP1Bcq ylL26q5bvtzFo+AN5xHfETNYLsUognKq1eWa1Ry/w9FWOYPVfRUPCkZdn/1riy5p/XJn s1nBApTIIr6lv+rgZLnMgPeq/fdVDLifvEEcNUW4QkyMZeOfsXlIgObVIZ3jmUNQZCTI otB/5nG1cOF+f2n6bNhUn0qV6OeA1QzxQg86pRMkSq6EfLsXlUlrqZ85uPN8eJ8s4lDT 29M+wPTX6iQidjpQ4z3YTha6IrSgSMSNE2XyTineE6bnLG+EpkuQuP6jRZhomDSAYVvS 6JAQ== X-Gm-Message-State: AOJu0YzQrel3JlLiqF2oVY4XzoGGJPIFrCaGRH1s3E75mmho/BgO7X66 uDH21B5CA5rjapD4dFZAhW7G3RT/mgE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a0d:ccd4:0:b0:58c:b45f:3e94 with SMTP id o203-20020a0dccd4000000b0058cb45f3e94mr209290ywd.8.1698107218929; Mon, 23 Oct 2023 17:26:58 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:32 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-13-seanjc@google.com> Subject: [PATCH v5 12/13] KVM: selftests: Add functional test for Intel's fixed PMU counters From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:28:24 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594567969535122 X-GMAIL-MSGID: 1780594567969535122 From: Jinrong Liang Extend the fixed counters test to verify that supported counters can actually be enabled in the control MSRs, that unsupported counters cannot, and that enabled counters actually count. Co-developed-by: Like Xu Signed-off-by: Like Xu Signed-off-by: Jinrong Liang [sean: fold into the rd/wr access test, massage changelog] Signed-off-by: Sean Christopherson --- .../selftests/kvm/x86_64/pmu_counters_test.c | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c index f1d9cdd69a17..1c392ad156f4 100644 --- a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c +++ b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c @@ -266,7 +266,6 @@ static void guest_rd_wr_counters(uint32_t base_msr, uint8_t nr_possible_counters vector = wrmsr_safe(msr, 0); GUEST_ASSERT_PMC_MSR_ACCESS(WRMSR, msr, expect_gp, vector); } - GUEST_DONE(); } static void guest_test_gp_counters(void) @@ -280,6 +279,7 @@ static void guest_test_gp_counters(void) base_msr = MSR_IA32_PERFCTR0; guest_rd_wr_counters(base_msr, MAX_NR_GP_COUNTERS, nr_gp_counters, 0); + GUEST_DONE(); } static void test_gp_counters(uint8_t nr_gp_counters, uint64_t perf_cap) @@ -302,6 +302,7 @@ static void guest_test_fixed_counters(void) { uint64_t supported_bitmask = 0; uint8_t nr_fixed_counters = 0; + uint8_t i; /* KVM provides fixed counters iff the vPMU version is 2+. */ if (this_cpu_property(X86_PROPERTY_PMU_VERSION) >= 2) @@ -316,6 +317,32 @@ static void guest_test_fixed_counters(void) guest_rd_wr_counters(MSR_CORE_PERF_FIXED_CTR0, MAX_NR_FIXED_COUNTERS, nr_fixed_counters, supported_bitmask); + + for (i = 0; i < MAX_NR_FIXED_COUNTERS; i++) { + uint8_t vector; + uint64_t val; + + if (i >= nr_fixed_counters && !(supported_bitmask & BIT_ULL(i))) { + vector = wrmsr_safe(MSR_CORE_PERF_FIXED_CTR_CTRL, BIT_ULL(4 * i)); + __GUEST_ASSERT(vector == GP_VECTOR, + "Expected #GP for counter %u in FIXED_CTRL_CTRL", i); + + vector = wrmsr_safe(MSR_CORE_PERF_GLOBAL_CTRL, BIT_ULL(PMC_IDX_FIXED + i)); + __GUEST_ASSERT(vector == GP_VECTOR, + "Expected #GP for counter %u in PERF_GLOBAL_CTRL", i); + continue; + } + + wrmsr(MSR_CORE_PERF_FIXED_CTR0 + i, 0); + wrmsr(MSR_CORE_PERF_FIXED_CTR_CTRL, BIT_ULL(4 * i)); + wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, BIT_ULL(PMC_IDX_FIXED + i)); + __asm__ __volatile__("loop ." : "+c"((int){NUM_BRANCHES})); + wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0); + val = rdmsr(MSR_CORE_PERF_FIXED_CTR0 + i); + + GUEST_ASSERT_NE(val, 0); + } + GUEST_DONE(); } static void test_fixed_counters(uint8_t nr_fixed_counters, From patchwork Tue Oct 24 00:26:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 157166 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1634059vqx; Mon, 23 Oct 2023 17:28:32 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHwHhyKXSfuMDwp09UDK/oikiSmRla7JdnG4+gbnJHUKZAlIMCHUU01EZqSN3ejB+obHT8z X-Received: by 2002:a17:90a:1996:b0:27c:fa10:fc82 with SMTP id 22-20020a17090a199600b0027cfa10fc82mr8017879pji.28.1698107311792; Mon, 23 Oct 2023 17:28:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698107311; cv=none; d=google.com; s=arc-20160816; b=veKAOS/0mUhFhN5nRXveTp6rIymt8addGmlH6fYHuXhCNyPbsbAuLy5ohSdP6xboTA p1j4lz1X5hicfuJ9R58NiA+KPdJ9NpE9vfUjMQYCHn6OFDzZGQhTQVLoCYzwJcnNJtNL Ic0UO9jfNkqiSu18BLR3hodrJiQt1hZ7n5qWqYZ8LOterYvQQDAFXcLz4zbKEu5PkheR p/TOJjjcEU+P301P6O85yJGLYaUh/ZSxDPwd5pJ5hsUf96VGqJZnTfZoA1PrlU6jRggv X5EqAo0Rwk+Kh+O+b2i26D5oaqTnf5Etpvr4GoRFwqoAVRcrIzD57G7qLWv1FYT1rvs+ QHBg== 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=LVgGvnFW9q/mijlkpvY+O1Zix6lIKT3NeTV0IdzcrJI=; fh=D//PLXZS63mgWSQM2kcZZyW+2k64a7rh3i2k12EZPR4=; b=ifKeBiB6NIIQqlcsMnal3aWf/sWVFGRca/IzbrDilNlXPvh1RBGOg1hu/GgTrMG6ZY mUpvjXnya6ReOPpdoRociwzUurG3V6189wN3BowtUgq3k0pwUMXc1l6joNy4wWWUU4Ug pjP2N5H3qvBTKq81zAPtl3Ipvp8gi/clzxqGa1l6u5IlygUDaXBbjUrIo03cwr3yzqjn FlZYeelnEohjyXEik4tpngnTJwYlUnLpySS1UzrZC7w5B58wzjVY9ILnuseThijUXE/o lkWzyNozx464ExuLPFlsduQDdxHVmiw79f/F/Jt0cgdDsdXgft5m7t4RbD4VZ8BYAJ2w a3SQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=ZlsezbuS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 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 morse.vger.email (morse.vger.email. [23.128.96.31]) by mx.google.com with ESMTPS id oa8-20020a17090b1bc800b0027cde38c731si10170411pjb.17.2023.10.23.17.28.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 17:28:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) client-ip=23.128.96.31; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=ZlsezbuS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id B616580BB5FA; Mon, 23 Oct 2023 17:28:29 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232303AbjJXA2A (ORCPT + 27 others); Mon, 23 Oct 2023 20:28:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49918 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232289AbjJXA1g (ORCPT ); Mon, 23 Oct 2023 20:27:36 -0400 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 5D3EC19B1 for ; Mon, 23 Oct 2023 17:27:05 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-5a818c1d2c7so55846427b3.0 for ; Mon, 23 Oct 2023 17:27:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698107220; x=1698712020; darn=vger.kernel.org; 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=LVgGvnFW9q/mijlkpvY+O1Zix6lIKT3NeTV0IdzcrJI=; b=ZlsezbuSc+49AlP1bQ2PbpiZz+SvGIjUjkpTcqbur2L82OEZHm/v2oH9FbQMBa+nD8 z9vwRJcPw9HE83O5eH8uKM3UKVoq8lIyZAUBZHtsROj5AV4Wia46Ii931l2owGabLBwO a3xJAhU2ROlfPTSvG6aNWeO80IVZjbde0stEmzzEd9ZJ9rzRP6tmBvX5A9hlE95QTQN/ hgRxXwcsWQHWeeeaOHu9wj9ejFaCtAcmnBxYZb9CrlZEuoi5EP70JtQaCRcrVtK23xRQ 6MYlBqp5+TEk+s0nNHJIWj3r/oW9Seik3JaNzL72Is4ch3OrpPifsTI7NbijX2G0Ce5W K4TQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698107220; x=1698712020; 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=LVgGvnFW9q/mijlkpvY+O1Zix6lIKT3NeTV0IdzcrJI=; b=hnPQGPvyNG+wixx0jAUhlwRD/zvWG+0/oT7wFjHpu/EaB2akO2bXR3fnQem7WhTpbE 29VPDqIUTPyUdbgT2MnADQZtlNopsNg8aD+lFtldWQXa9NsgYfFp0PgTG9tTa/ev/IxP AQdjA94bYjZwt5HKnkZCZOfH/Jlv5E5B3KlXqOx9ekHdv6lhiRtjcjNPYKcGLsAIgAxK lqmAlzTi0zvCHISM6PoUX3acX2qMl2PU6PAcNBBMQ3CfhjapMT5cJIc7HVFgNlJ5FdTj DzDzrqt8XDIMGgyxpS0muAGJ5kT+u1x3JkXqq8HtdfRMfMXy1gkaSyP/hVw2h7QvLHNT Uehw== X-Gm-Message-State: AOJu0Yz++unoh7OFdwEVRj0T223QjGBIAF+vKaRZsj3Ftv8YB0f0EFMZ muiOJWTxPGb8kTD66J7ZjjsitnBx6Qc= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6902:105:b0:da0:3da9:ce08 with SMTP id o5-20020a056902010500b00da03da9ce08mr8158ybh.10.1698107220804; Mon, 23 Oct 2023 17:27:00 -0700 (PDT) Reply-To: Sean Christopherson Date: Mon, 23 Oct 2023 17:26:33 -0700 In-Reply-To: <20231024002633.2540714-1-seanjc@google.com> Mime-Version: 1.0 References: <20231024002633.2540714-1-seanjc@google.com> X-Mailer: git-send-email 2.42.0.758.gaed0368e0e-goog Message-ID: <20231024002633.2540714-14-seanjc@google.com> Subject: [PATCH v5 13/13] KVM: selftests: Extend PMU counters test to permute on vPMU version From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Jinrong Liang , Like Xu X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 morse.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Mon, 23 Oct 2023 17:28:29 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780594572632298528 X-GMAIL-MSGID: 1780594572632298528 Extent the PMU counters test to verify that KVM emulates the vPMU (or not) according to the vPMU version exposed to the guest. KVM's ABI (which does NOT reflect Intel's architectural behavior) is that GP counters are available if the PMU version is >0, and that fixed counters and PERF_GLOBAL_CTRL are available if the PMU version is >1. Test up to vPMU version 5, i.e. the current architectural max. KVM only officially supports up to version 2, but the behavior of the counters is backwards compatible, i.e. KVM shouldn't do something completely different for a higher, architecturally-defined vPMU version. Verify KVM behavior against the effective vPMU version, e.g. advertising vPMU 5 when KVM only supports vPMU 2 shouldn't magically unlock vPMU 5 features. Suggested-by: Like Xu Suggested-by: Jinrong Liang Signed-off-by: Sean Christopherson --- .../selftests/kvm/x86_64/pmu_counters_test.c | 60 +++++++++++++++---- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c index 1c392ad156f4..85b01dd5b2cd 100644 --- a/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c +++ b/tools/testing/selftests/kvm/x86_64/pmu_counters_test.c @@ -12,6 +12,8 @@ /* Guest payload for any performance counter counting */ #define NUM_BRANCHES 10 +static uint8_t kvm_pmu_version; + static struct kvm_vm *pmu_vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, void *guest_code) { @@ -21,6 +23,8 @@ static struct kvm_vm *pmu_vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, vm_init_descriptor_tables(vm); vcpu_init_descriptor_tables(*vcpu); + sync_global_to_guest(vm, kvm_pmu_version); + return vm; } @@ -97,6 +101,19 @@ static bool pmu_is_null_feature(struct kvm_x86_pmu_feature event) return !(*(u64 *)&event); } +static uint8_t guest_get_pmu_version(void) +{ + /* + * Return the effective PMU version, i.e. the minimum between what KVM + * supports and what is enumerated to the guest. The counters test + * deliberately advertises a PMU version to the guest beyond what is + * actually supported by KVM to verify KVM doesn't freak out and do + * something bizarre with an architecturally valid, but unsupported, + * version. + */ + return min_t(uint8_t, kvm_pmu_version, this_cpu_property(X86_PROPERTY_PMU_VERSION)); +} + static void guest_measure_loop(uint8_t idx) { const struct { @@ -121,7 +138,7 @@ static void guest_measure_loop(uint8_t idx) }; uint32_t nr_gp_counters = this_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); - uint32_t pmu_version = this_cpu_property(X86_PROPERTY_PMU_VERSION); + uint32_t pmu_version = guest_get_pmu_version(); struct kvm_x86_pmu_feature gp_event, fixed_event; uint32_t counter_msr; unsigned int i; @@ -270,9 +287,12 @@ static void guest_rd_wr_counters(uint32_t base_msr, uint8_t nr_possible_counters static void guest_test_gp_counters(void) { - uint8_t nr_gp_counters = this_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); + uint8_t nr_gp_counters = 0; uint32_t base_msr; + if (guest_get_pmu_version()) + nr_gp_counters = this_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); + if (rdmsr(MSR_IA32_PERF_CAPABILITIES) & PMU_CAP_FW_WRITES) base_msr = MSR_IA32_PMC0; else @@ -282,7 +302,8 @@ static void guest_test_gp_counters(void) GUEST_DONE(); } -static void test_gp_counters(uint8_t nr_gp_counters, uint64_t perf_cap) +static void test_gp_counters(uint8_t pmu_version, uint8_t nr_gp_counters, + uint64_t perf_cap) { struct kvm_vcpu *vcpu; struct kvm_vm *vm; @@ -305,16 +326,17 @@ static void guest_test_fixed_counters(void) uint8_t i; /* KVM provides fixed counters iff the vPMU version is 2+. */ - if (this_cpu_property(X86_PROPERTY_PMU_VERSION) >= 2) + if (guest_get_pmu_version() >= 2) nr_fixed_counters = this_cpu_property(X86_PROPERTY_PMU_NR_FIXED_COUNTERS); /* * The supported bitmask for fixed counters was introduced in PMU * version 5. */ - if (this_cpu_property(X86_PROPERTY_PMU_VERSION) >= 5) + if (guest_get_pmu_version() >= 5) supported_bitmask = this_cpu_property(X86_PROPERTY_PMU_FIXED_COUNTERS_BITMASK); + guest_rd_wr_counters(MSR_CORE_PERF_FIXED_CTR0, MAX_NR_FIXED_COUNTERS, nr_fixed_counters, supported_bitmask); @@ -345,7 +367,7 @@ static void guest_test_fixed_counters(void) GUEST_DONE(); } -static void test_fixed_counters(uint8_t nr_fixed_counters, +static void test_fixed_counters(uint8_t pmu_version, uint8_t nr_fixed_counters, uint32_t supported_bitmask, uint64_t perf_cap) { struct kvm_vcpu *vcpu; @@ -368,22 +390,32 @@ static void test_intel_counters(void) { uint8_t nr_fixed_counters = kvm_cpu_property(X86_PROPERTY_PMU_NR_FIXED_COUNTERS); uint8_t nr_gp_counters = kvm_cpu_property(X86_PROPERTY_PMU_NR_GP_COUNTERS); + uint8_t max_pmu_version = kvm_cpu_property(X86_PROPERTY_PMU_VERSION); unsigned int i; + uint8_t j, v; uint32_t k; - uint8_t j; const uint64_t perf_caps[] = { 0, PMU_CAP_FW_WRITES, }; - for (i = 0; i < ARRAY_SIZE(perf_caps); i++) { - for (j = 0; j <= nr_gp_counters; j++) - test_gp_counters(j, perf_caps[i]); + /* + * Test up to PMU v5, which is the current maximum version defined by + * Intel, i.e. is the last version that is guaranteed to be backwards + * compatible with KVM's existing behavior. + */ + max_pmu_version = max_t(typeof(max_pmu_version), max_pmu_version, 5); - for (j = 0; j <= nr_fixed_counters; j++) { - for (k = 0; k <= (BIT(nr_fixed_counters) - 1); k++) - test_fixed_counters(j, k, perf_caps[i]); + for (v = 0; v <= max_pmu_version; v++) { + for (i = 0; i < ARRAY_SIZE(perf_caps) + 1; i++) { + for (j = 0; j <= nr_gp_counters; j++) + test_gp_counters(v, j, perf_caps[i]); + + for (j = 0; j <= nr_fixed_counters; j++) { + for (k = 0; k <= (BIT(nr_fixed_counters) - 1); k++) + test_fixed_counters(v, j, k, perf_caps[i]); + } } } } @@ -397,6 +429,8 @@ int main(int argc, char *argv[]) TEST_REQUIRE(kvm_cpu_property(X86_PROPERTY_PMU_VERSION) > 0); TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_PDCM)); + kvm_pmu_version = kvm_cpu_property(X86_PROPERTY_PMU_VERSION); + test_intel_arch_events(); test_intel_counters();