From patchwork Wed Sep 22 00:05:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12509137 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 198BDC433FE for ; Wed, 22 Sep 2021 00:06:17 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 986A861153 for ; Wed, 22 Sep 2021 00:06:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 986A861153 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:Reply-To:List-Subscribe:List-Help: List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject: Mime-Version:Message-Id:Date:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=A5SNPT95oSsXPiJkFr0rBOC/SvtjchMNLdM+udir/0I=; b=u9r KoVZNbzO+OGUmA/1Kdccm3Pr5OIUdZrcC01ruELbUvEleiS+a4kDP7dC3RXnSQ1DTLbL5Y1tpM3J8 xbkqS0oQTjlDbaQ2sZYu96EDSI3Bj92SVYamgD1Oajc+5zgWovoEOVGAiZ2aS5388wrq/Gs/wSPz+ uCPxeF3vmXwBt2rXFwFrbsvCuFFwXTpbcykHkp6r5SEV18hNGGLKgTCezSrtgQhPYFn2sg4twcg9W /Uoi4E9eB/vSFcjKN05+gv0dvPVb62+IJv7sq+i5Vt/Gjg4R8H2n7CCbCkENx6sFTob8f5jDhQ++c Twp8jBBq6MxD0xwoEMz2JKHABhl+ETg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mSpll-006HPx-5t; Wed, 22 Sep 2021 00:05:49 +0000 Received: from mail-qt1-x84a.google.com ([2607:f8b0:4864:20::84a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mSplh-006HO4-1c for linux-riscv@lists.infradead.org; Wed, 22 Sep 2021 00:05:46 +0000 Received: by mail-qt1-x84a.google.com with SMTP id a22-20020ac86116000000b002a1463f30ddso4659126qtm.17 for ; Tue, 21 Sep 2021 17:05:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:message-id:mime-version:subject:from:to:cc; bh=phOg6sfjUxaw2dev9sQjUWZF+Yytb7b5OFt6ForYj/8=; b=iUirf8Xy9HBHz1WXV3sP98cQFZc4uLbiWcks09YKieGNfFGG+gs0k72fDMm3HygsTL bTb1E9YXxvDETi2LPUmOcN81qVU8N8EHMfwEIhym5xr1GL4nuPP5VSQWu2ilOytZoTGS 29N5LX0Q1nAT/Yc19LBLlvpkIdDWZ9R0T+ikDFK/YvQdlOVrTR3jtpdXiFmTcxfOUu8s Y4Gz2V9KUWdc0VylyfjHYjfz7ZmN9V9G49FIJvjgEkSVzn9mYiMA4K/jF7NhytdmJ3F/ hUx1PUAps9mDw+Jed5eSqhmcHrheKl00VcwQxkkBJMKDmZCGnvuYJgWoF05Eip0DYKf0 Y9bA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:message-id:mime-version:subject :from:to:cc; bh=phOg6sfjUxaw2dev9sQjUWZF+Yytb7b5OFt6ForYj/8=; b=t7YgJamUaYeBrW9Ob9/UNtYvewM3vEUpbB7aG1HSIHsjIUmGni9DI0jOqCy/CgpCHx FNh/CcNyB3r84VzSQHrL2hMqA6W9tG6CYVI5DSafu/63YyObTMrSxWe9uLe5U3vmWvqJ B7FRz/2VlHcDQm8YsMC5i+9ZuUVHqcR7kcFuQ1wepc2vF5EVsbPWEfLl1cpND1EDdLxo pCFd4vuEuS3afl65O2zle6TdHSjI8o7vm6Xqm+ACKvovwKTycdnIw1Dj2cmtYJuI9NZP qEoqnNVQ7wFldEBjlPZ8j+Hzp7g8DNP4Remyrxp1fwXhV90ac80BbpeJAuFHKPxj0Z+P a/+g== X-Gm-Message-State: AOAM53178IPUDACAGJz1vbGKfr06ZCy1CV/5vSw/DhF+4YY+dlDdrMua Pr7otSjEbHXfIoiCRdDQl8pSSSDcThY= X-Google-Smtp-Source: ABdhPJwRFbj6xeEYgNbL67Zce9IIY/R6nA0AUChux2cSB+iV33dupsb1zwE380RUBsEvPw8un2YtVWvkUMY= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:90:200:b022:92d6:d37b:686c]) (user=seanjc job=sendgmr) by 2002:a25:598b:: with SMTP id n133mr40023097ybb.290.1632269143022; Tue, 21 Sep 2021 17:05:43 -0700 (PDT) Date: Tue, 21 Sep 2021 17:05:17 -0700 Message-Id: <20210922000533.713300-1-seanjc@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH v3 00/16] perf: KVM: Fix, optimize, and clean up callbacks From: Sean Christopherson To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Will Deacon , Mark Rutland , Marc Zyngier , Guo Ren , Nick Hu , Greentime Hu , Vincent Chen , Paul Walmsley , Palmer Dabbelt , Albert Ou , Paolo Bonzini , Boris Ostrovsky , Juergen Gross Cc: Alexander Shishkin , Jiri Olsa , Namhyung Kim , James Morse , Alexandru Elisei , Suzuki K Poulose , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Stefano Stabellini , linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, kvmarm@lists.cs.columbia.edu, linux-csky@vger.kernel.org, linux-riscv@lists.infradead.org, kvm@vger.kernel.org, xen-devel@lists.xenproject.org, Artem Kashkanov , Like Xu , Zhu Lingshan X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210921_170545_153043_0B740009 X-CRM114-Status: GOOD ( 19.29 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Sean Christopherson Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org Peter, I left the Intel PT mess as-is. Having to pass a NULL pointer from KVM arm64 seemed to be a lesser evil than more exports and multiple registration paths. This is a combination of ~2 series to fix bugs in the perf+KVM callbacks, optimize the callbacks by employing static_call, and do a variety of cleanup in both perf and KVM. Patch 1 fixes a mostly-theoretical bug where perf can deref a NULL pointer if KVM unregisters its callbacks while they're being accessed. In practice, compilers tend to avoid problematic reloads of the pointer and the PMI handler doesn't lose the race against module unloading, i.e doesn't hit a use-after-free. Patches 2 and 3 fix an Intel PT handling bug where KVM incorrectly eats PT interrupts when PT is supposed to be owned entirely by the host. Patches 4-9 clean up perf's callback infrastructure and switch to static_call for arm64 and x86 (the only survivors). Patches 10-16 clean up related KVM code and unify the arm64/x86 callbacks. Based on "git://git.kernel.org/pub/scm/virt/kvm/kvm.git queue", commit 680c7e3be6a3 ("KVM: x86: Exit to userspace ..."). v3: - Add wrappers for guest callbacks to that stubs can be provided when GUEST_PERF_EVENTS=n. - s/HAVE_GUEST_PERF_EVENTS/GUEST_PERF_EVENTS and select it from KVM and XEN_PV instead of from top-level arm64/x86. [Paolo] - Drop an unnecessary synchronize_rcu() when registering callbacks. [Peter] - Retain a WARN_ON_ONCE() when unregistering callbacks if the caller didn't provide the correct pointer. [Peter] - Rework the static_call patch to move it all to common perf. - Add a patch to drop the (un)register stubs, made possible after having KVM+XEN_PV select GUEST_PERF_EVENTS. - Split dropping guest callback "support" for arm, csky, etc... to a separate patch, to make introducing GUEST_PERF_EVENTS cleaner. v2 (relative to static_call v10): - Split the patch into the semantic change (multiplexed ->state) and introduction of static_call. - Don't use '0' for "not a guest RIP". - Handle unregister path. - Drop changes for architectures that can be culled entirely. v2 (relative to v1): - https://lkml.kernel.org/r/20210828003558.713983-6-seanjc@google.com - Drop per-cpu approach. [Peter] - Fix mostly-theoretical reload and use-after-free with READ_ONCE(), WRITE_ONCE(), and synchronize_rcu(). [Peter] - Avoid new exports like the plague. [Peter] v1: - https://lkml.kernel.org/r/20210827005718.585190-1-seanjc@google.com v10 static_call: - https://lkml.kernel.org/r/20210806133802.3528-2-lingshan.zhu@intel.com Like Xu (1): perf/core: Rework guest callbacks to prepare for static_call support Sean Christopherson (15): perf: Ensure perf_guest_cbs aren't reloaded between !NULL check and deref KVM: x86: Register perf callbacks after calling vendor's hardware_setup() KVM: x86: Register Processor Trace interrupt hook iff PT enabled in guest perf: Stop pretending that perf can handle multiple guest callbacks perf: Drop dead and useless guest "support" from arm, csky, nds32 and riscv perf: Add wrappers for invoking guest callbacks perf: Force architectures to opt-in to guest callbacks perf/core: Use static_call to optimize perf_guest_info_callbacks KVM: x86: Drop current_vcpu for kvm_running_vcpu + kvm_arch_vcpu variable KVM: x86: More precisely identify NMI from guest when handling PMI KVM: Move x86's perf guest info callbacks to generic KVM KVM: x86: Move Intel Processor Trace interrupt handler to vmx.c KVM: arm64: Convert to the generic perf callbacks KVM: arm64: Drop perf.c and fold its tiny bits of code into arm.c / pmu.c perf: Drop guest callback (un)register stubs arch/arm/kernel/perf_callchain.c | 28 ++------------ arch/arm64/include/asm/kvm_host.h | 9 ++++- arch/arm64/kernel/perf_callchain.c | 13 ++++--- arch/arm64/kvm/Kconfig | 1 + arch/arm64/kvm/Makefile | 2 +- arch/arm64/kvm/arm.c | 11 +++++- arch/arm64/kvm/perf.c | 62 ------------------------------ arch/arm64/kvm/pmu.c | 8 ++++ arch/csky/kernel/perf_callchain.c | 10 ----- arch/nds32/kernel/perf_event_cpu.c | 29 ++------------ arch/riscv/kernel/perf_callchain.c | 10 ----- arch/x86/events/core.c | 13 ++++--- arch/x86/events/intel/core.c | 5 +-- arch/x86/include/asm/kvm_host.h | 7 +++- arch/x86/kvm/Kconfig | 1 + arch/x86/kvm/pmu.c | 2 +- arch/x86/kvm/svm/svm.c | 2 +- arch/x86/kvm/vmx/vmx.c | 25 +++++++++++- arch/x86/kvm/x86.c | 58 +++++----------------------- arch/x86/kvm/x86.h | 17 ++++++-- arch/x86/xen/Kconfig | 1 + arch/x86/xen/pmu.c | 32 +++++++-------- include/kvm/arm_pmu.h | 1 + include/linux/kvm_host.h | 10 +++++ include/linux/perf_event.h | 41 ++++++++++++++------ init/Kconfig | 4 ++ kernel/events/core.c | 39 +++++++++++++------ virt/kvm/kvm_main.c | 44 +++++++++++++++++++++ 28 files changed, 235 insertions(+), 250 deletions(-) delete mode 100644 arch/arm64/kvm/perf.c