Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp1441548rwl; Fri, 7 Apr 2023 16:36:07 -0700 (PDT) X-Google-Smtp-Source: AKy350Z82haIEyTmhtBFJGCBVL7D71hvU/vJWskO5/0Fx6hk+uzZH9sOY8Kftg6IHLRya0XgLA9X X-Received: by 2002:a17:902:f684:b0:1a5:1109:f58e with SMTP id l4-20020a170902f68400b001a51109f58emr3160285plg.29.1680910567524; Fri, 07 Apr 2023 16:36:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680910567; cv=none; d=google.com; s=arc-20160816; b=UXBf08aeXVQxBhyxdIe7wz0icD/LnOFVBu6/BuSS51YCXaANuAOcy5slz1TKHfMsDl y2F0nqcf0BKou16bRfzHgCe1FIUKoitpCFBd0APOokAZ7kWFCQjeUfAMAT1YI014mTIN K+2r4DHN2aZmYmNBqR3Qx671rbcxromnGiJGPmWWGucC8lGy20B7WjMgPRP1X61mi41P M15Gz17BxEZsdwIgTM6Jbwu9bcLTftVPLW9VbsLvccRXf83WiX5rXr/M7wmMTzubd2hY si6b5gObTnNsjFOslu0seQxg3os7Z+7PR3d9Mwid7i5B9JigJkXLDTGaDtOAdbeZ9yFN p7yg== 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=LjYQi0+v1Gz3bnNu0ej5VXIh69X5CJjJWC5nav17cUU=; b=XV8rXOMglOv41TGsVutmzRVpnCpVrNY/UeQ3nMSNvLB4MASkqoojhiczy70cdM33I/ r6jj//i4ZqhfKAU/MNOacQSurWSLvryHkTPmgI1BJMGyg0/Hx4VZQL+mG/KNv0c8oe7H 7ASFFzwhnWqjDTA32PwFXXGjDsXH7w6oRuPM9FpjfyoHR6b1X4cc36w21+owlHMFiZbA OANYSLyfOLaSSG+p53QnvYK+zkrN1cdXKY93shs8C6IoAMOSjT0ZILvzWxtJE68xVRqb HWbMtEot5gH+vQr6opNwuXh9SlqIGtt+WHsCTMMZclnVjqOD43l62AMdMKnimom6aiLM jTXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=tLWkBtqU; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o7-20020a1709026b0700b001a288c5d34bsi4728495plk.85.2023.04.07.16.35.56; Fri, 07 Apr 2023 16:36:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=tLWkBtqU; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230237AbjDGXdR (ORCPT + 99 others); Fri, 7 Apr 2023 19:33:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55688 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230172AbjDGXdK (ORCPT ); Fri, 7 Apr 2023 19:33:10 -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 20E1CE181 for ; Fri, 7 Apr 2023 16:33:09 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-54c08e501d2so71530887b3.11 for ; Fri, 07 Apr 2023 16:33:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1680910388; 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=LjYQi0+v1Gz3bnNu0ej5VXIh69X5CJjJWC5nav17cUU=; b=tLWkBtqU7eXFk3IWVSj+vF5W2EMxUvN0O93ECEFffu0DjOJq8QI03R1Djfx5xUtiBs 6eR8jx3EpY9ditBySK/apDVrJ4rxBBFZDOfGqCijsurno0CzuK4JBQ1aNPWuXTLuGHnG nmxmKtSoKXMmz9pFXxSIu4N6Y06A/8GqIzjeo19AOEkhukjkt9MRVh8Islta60ImPhUE f/cPq8FKg1ki91AXJ6JQw/y2qVVo3jinOrLXZi3/Ai4ghEkaMy/1a9YE2K5ZNoBQkb/b 2niLpe7IvL/laZMt1SNE1l0hc3jggzp+LMevymcgugam8b3aHEo5sRU1P+nnDEYR6J+t YOzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680910388; 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=LjYQi0+v1Gz3bnNu0ej5VXIh69X5CJjJWC5nav17cUU=; b=lTeLBPxu/qSJUdAVNWCjtYkfqrPudG+pSu7O9S1tRAdb145ai2WTyYAN7eQUN0Ph79 V0gEGG/qQKXOajVRly8ip6GuyPufaksrGq4lLMmegD1CutSzmXv6khqaFD9i5uMKjmrZ zHL9+UL7BDAdmPOZY1U3kHKFc8x+zYYluTv56zpBL+fCVFJ9jcWEgqDj5m4RXBxiBfec gRADagVLD5nCI7pVY8zQy7L22hOJCgZpGXSEsxaYUDn8lpPkhr5x7zgO1NL7N4gUHTto Vfzf/giuDrXsRZEU9/9FJNS5Zg+CR0tW+dllPP6/kx1FXRrBn0ziB4zd/gIOsJAHotF3 tXcw== X-Gm-Message-State: AAQBX9f4Uu4vlPW68PvBBwWLwzDnAxU2n/ozX9SSKgsUuOxrI1Pv0Vd5 JY9LdcQ/hOiS5znKqjQimuCf6Bk8ot8= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:cf49:0:b0:b8b:fca4:7454 with SMTP id f70-20020a25cf49000000b00b8bfca47454mr2051230ybg.4.1680910388316; Fri, 07 Apr 2023 16:33:08 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 7 Apr 2023 16:32:54 -0700 In-Reply-To: <20230407233254.957013-1-seanjc@google.com> Mime-Version: 1.0 References: <20230407233254.957013-1-seanjc@google.com> X-Mailer: git-send-email 2.40.0.577.gac1e443424-goog Message-ID: <20230407233254.957013-7-seanjc@google.com> Subject: [PATCH v4 6/6] KVM: selftests: Test the PMU event "Instructions retired" From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Aaron Lewis , Sean Christopherson Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-7.7 required=5.0 tests=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 From: Aaron Lewis Add testing for the event "Instructions retired" (0xc0) in the PMU event filter on both Intel and AMD to ensure that the event doesn't count when it is disallowed. Unlike most of the other events, the event "Instructions retired" will be incremented by KVM when an instruction is emulated. Test that this case is being properly handled and that KVM doesn't increment the counter when that event is disallowed. Signed-off-by: Aaron Lewis Link: https://lore.kernel.org/r/20230307141400.1486314-6-aaronlewis@google.com Signed-off-by: Sean Christopherson --- .../kvm/x86_64/pmu_event_filter_test.c | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) 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 5112aece3f95..40507ed9fe8a 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 @@ -54,6 +54,21 @@ #define AMD_ZEN_BR_RETIRED EVENT(0xc2, 0) + +/* + * "Retired instructions", from Processor Programming Reference + * (PPR) for AMD Family 17h Model 01h, Revision B1 Processors, + * Preliminary Processor Programming Reference (PPR) for AMD Family + * 17h Model 31h, Revision B0 Processors, and Preliminary Processor + * Programming Reference (PPR) for AMD Family 19h Model 01h, Revision + * B1 Processors Volume 1 of 2. + * --- and --- + * "Instructions retired", from the Intel SDM, volume 3, + * "Pre-defined Architectural Performance Events." + */ + +#define INST_RETIRED EVENT(0xc0, 0) + /* * This event list comprises Intel's eight architectural events plus * AMD's "retired branch instructions" for Zen[123] (and possibly @@ -61,7 +76,7 @@ */ static const uint64_t event_list[] = { EVENT(0x3c, 0), - EVENT(0xc0, 0), + INST_RETIRED, EVENT(0x3c, 1), EVENT(0x2e, 0x4f), EVENT(0x2e, 0x41), @@ -76,6 +91,7 @@ struct { uint64_t stores; uint64_t loads_stores; uint64_t branches_retired; + uint64_t instructions_retired; } pmc_results; /* @@ -110,10 +126,12 @@ static void check_msr(uint32_t msr, uint64_t bits_to_flip) static void run_and_measure_loop(uint32_t msr_base) { const uint64_t branches_retired = rdmsr(msr_base + 0); + const uint64_t insn_retired = rdmsr(msr_base + 1); __asm__ __volatile__("loop ." : "+c"((int){NUM_BRANCHES})); pmc_results.branches_retired = rdmsr(msr_base + 0) - branches_retired; + pmc_results.instructions_retired = rdmsr(msr_base + 1) - insn_retired; } static void intel_guest_code(void) @@ -127,7 +145,9 @@ static void intel_guest_code(void) wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0); wrmsr(MSR_P6_EVNTSEL0, ARCH_PERFMON_EVENTSEL_ENABLE | ARCH_PERFMON_EVENTSEL_OS | INTEL_BR_RETIRED); - wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0x1); + wrmsr(MSR_P6_EVNTSEL1, ARCH_PERFMON_EVENTSEL_ENABLE | + ARCH_PERFMON_EVENTSEL_OS | INST_RETIRED); + wrmsr(MSR_CORE_PERF_GLOBAL_CTRL, 0x3); run_and_measure_loop(MSR_IA32_PMC0); GUEST_SYNC(0); @@ -149,6 +169,8 @@ static void amd_guest_code(void) wrmsr(MSR_K7_EVNTSEL0, 0); wrmsr(MSR_K7_EVNTSEL0, ARCH_PERFMON_EVENTSEL_ENABLE | ARCH_PERFMON_EVENTSEL_OS | AMD_ZEN_BR_RETIRED); + wrmsr(MSR_K7_EVNTSEL1, ARCH_PERFMON_EVENTSEL_ENABLE | + ARCH_PERFMON_EVENTSEL_OS | INST_RETIRED); run_and_measure_loop(MSR_K7_PERFCTR0); GUEST_SYNC(0); @@ -263,20 +285,26 @@ static struct kvm_pmu_event_filter *remove_event(struct kvm_pmu_event_filter *f, #define ASSERT_PMC_COUNTING_INSTRUCTIONS() \ do { \ uint64_t br = pmc_results.branches_retired; \ + uint64_t ir = pmc_results.instructions_retired; \ \ if (br && br != NUM_BRANCHES) \ pr_info("%s: Branch instructions retired = %lu (expected %u)\n", \ __func__, br, NUM_BRANCHES); \ TEST_ASSERT(br, "%s: Branch instructions retired = %lu (expected > 0)", \ __func__, br); \ + TEST_ASSERT(ir, "%s: Instructions retired = %lu (expected > 0)", \ + __func__, ir); \ } while (0) #define ASSERT_PMC_NOT_COUNTING_INSTRUCTIONS() \ do { \ uint64_t br = pmc_results.branches_retired; \ + uint64_t ir = pmc_results.instructions_retired; \ \ TEST_ASSERT(!br, "%s: Branch instructions retired = %lu (expected 0)", \ __func__, br); \ + TEST_ASSERT(!ir, "%s: Instructions retired = %lu (expected 0)", \ + __func__, ir); \ } while (0) static void test_without_filter(struct kvm_vcpu *vcpu) @@ -329,6 +357,7 @@ static void test_not_member_deny_list(struct kvm_vcpu *vcpu) { struct kvm_pmu_event_filter *f = event_filter(KVM_PMU_EVENT_DENY); + remove_event(f, INST_RETIRED); remove_event(f, INTEL_BR_RETIRED); remove_event(f, AMD_ZEN_BR_RETIRED); test_with_filter(vcpu, f); @@ -341,6 +370,7 @@ static void test_not_member_allow_list(struct kvm_vcpu *vcpu) { struct kvm_pmu_event_filter *f = event_filter(KVM_PMU_EVENT_ALLOW); + remove_event(f, INST_RETIRED); remove_event(f, INTEL_BR_RETIRED); remove_event(f, AMD_ZEN_BR_RETIRED); test_with_filter(vcpu, f); -- 2.40.0.577.gac1e443424-goog