From nobody Tue Feb 10 03:44:48 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1636596510; cv=none; d=zohomail.com; s=zohoarc; b=Yorv/haDzpzGZpu/OXFNTzBFJxK5r43CWIQ2AwNk6emZwxodEys6+f9MvDGRn494ysAeR+vaW8D+RqqDGyd47n/PiM30I0WKGw8HKXb79UK88KgmYKindIZtCMu9HNAA82PvXWmyUtYwcY4CGGqwf4P6Doh7LJwud0kLC099dxs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1636596510; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=Apml5USbtNBNJWAvbbh8XFiyHgbDn3HxurxzTvY68aY=; b=I6T2RWcweyxuk/cPEqgH1mpXdIOF7zXGuOWtbRFBRuGKrJPUi0eev3nWH+XOJsYeiSlpLCFD5isXMSOrhrYMftgTHchhM1DPdlCc6GFN8j+WI/wHhxNq0UvQZHfV5wtxCVIhI22Ye0nEpuRrUjGLBE5POhc2XwnaBKa/eJmhh1g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1636596510690307.4828416751352; Wed, 10 Nov 2021 18:08:30 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.224512.387877 (Exim 4.92) (envelope-from ) id 1mkzVK-0005md-UZ; Thu, 11 Nov 2021 02:07:54 +0000 Received: by outflank-mailman (output) from mailman id 224512.387877; Thu, 11 Nov 2021 02:07:54 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mkzVK-0005ka-Ox; Thu, 11 Nov 2021 02:07:54 +0000 Received: by outflank-mailman (input) for mailman id 224512; Thu, 11 Nov 2021 02:07:53 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mkzVJ-0004E5-KJ for xen-devel@lists.xenproject.org; Thu, 11 Nov 2021 02:07:53 +0000 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [2607:f8b0:4864:20::449]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 2cc2701e-4294-11ec-9787-a32c541c8605; Thu, 11 Nov 2021 03:07:52 +0100 (CET) Received: by mail-pf1-x449.google.com with SMTP id c140-20020a624e92000000b0044d3de98438so3024268pfb.14 for ; Wed, 10 Nov 2021 18:07:52 -0800 (PST) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 2cc2701e-4294-11ec-9787-a32c541c8605 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=Apml5USbtNBNJWAvbbh8XFiyHgbDn3HxurxzTvY68aY=; b=rhYQ3kFE6KXMC4z2oCjpsBUhZh8QPd91Te2BBg6hppGmpAYWnod92usQwhqE1PHqNy Qld6bdflJylY5QfrRw78JqW10v6SrgdHXD0DLzzuo0mZQeGOKNMxrno8yrpJhT+8UcHm N53GcQhAbZkRVhoJpL+siLsuUbu94zleiKRSCPgYgDPDUTac0CjxivJw2PnvrQJGDbff QshPZ0fKvljsCWjx/ruRlMDS8ggjyVLQATeLToiTGYm4QnLcjqHseFr7Ub6IVui0++IH hRdPcpIVxGDM7LuWsGJsT3gyESzsSdVLxJN4KCqTV7xOr0X86Kr7ewQxn+1Z4UbDPFcB GnYw== 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:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=Apml5USbtNBNJWAvbbh8XFiyHgbDn3HxurxzTvY68aY=; b=nCwjTrmu4MVMuyEeoJQQO8okVj8DdU01mc3WWJPQL7n+ttj4PQvALPGV75xXSqWlNN BJstGARO6IOKg1ddxIsFexntTA9HeWxnyhcEwXgXqWubZE/7nRm3Jng16YtByAalCGLF y51bg4ah7KuTxLt6zk0OEz69dAphIhCrwMz6QqgP10jb1c2ySauyouax+g6DcLaEnqmN lR/f5OO/IRYlpNL1BPiKyotQ6CnkD3wQr6wlzoVDccFBTS8ZdL5b9WeVgMIsJDJbfg0a 4LbdxsQEDNtdH6bHARSqU0+cdE98tfiRlKzTvuCkEAfXOW0hPvkXGzRzonQimanJR4VL mRzQ== X-Gm-Message-State: AOAM531q2o9EkCPM0sxJ+nOgaCcxutWXkrmBL1HAAkKayb67Z/9MRDWo 08YjZC8PE2SWAqEiXmtBQ54w8cI5Jyg= X-Google-Smtp-Source: ABdhPJxBzNsPLY8AxAvZLIxLbhKZwdFhZqffL4IBnUtCd6ZihI2BNbkC+QMK4Jjyy7JxJSfimd7zSjX02Zg= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a17:90a:9dca:: with SMTP id x10mr22330561pjv.170.1636596470963; Wed, 10 Nov 2021 18:07:50 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 11 Nov 2021 02:07:27 +0000 In-Reply-To: <20211111020738.2512932-1-seanjc@google.com> Message-Id: <20211111020738.2512932-7-seanjc@google.com> Mime-Version: 1.0 References: <20211111020738.2512932-1-seanjc@google.com> X-Mailer: git-send-email 2.34.0.rc0.344.g81b53c2807-goog Subject: [PATCH v4 06/17] perf/core: Rework guest callbacks to prepare for static_call support From: Sean Christopherson To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Will Deacon , Mark Rutland , Russell King , Marc Zyngier , Catalin Marinas , Guo Ren , Nick Hu , Greentime Hu , Vincent Chen , Paul Walmsley , Palmer Dabbelt , Albert Ou , Thomas Gleixner , Borislav Petkov , Dave Hansen , x86@kernel.org, Paolo Bonzini , Boris Ostrovsky , Juergen Gross Cc: Alexander Shishkin , Jiri Olsa , Namhyung Kim , James Morse , Alexandru Elisei , Suzuki K Poulose , "H. Peter Anvin" , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Stefano Stabellini , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.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 , Like Xu , Zhu Lingshan X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1636596511776100008 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Like Xu To prepare for using static_calls to optimize perf's guest callbacks, replace ->is_in_guest and ->is_user_mode with a new multiplexed hook ->state, tweak ->handle_intel_pt_intr to play nice with being called when there is no active guest, and drop "guest" from ->get_guest_ip. Return '0' from ->state and ->handle_intel_pt_intr to indicate "not in guest" so that DEFINE_STATIC_CALL_RET0 can be used to define the static calls, i.e. no callback =3D=3D !guest. Suggested-by: Peter Zijlstra (Intel) Originally-by: Peter Zijlstra (Intel) Signed-off-by: Like Xu Signed-off-by: Zhu Lingshan [sean: extracted from static_call patch, fixed get_ip() bug, wrote changelo= g] Signed-off-by: Sean Christopherson Reviewed-by: Boris Ostrovsky Reviewed-by: Paolo Bonzini --- arch/arm64/kernel/perf_callchain.c | 13 +++++----- arch/arm64/kvm/perf.c | 35 +++++++++++--------------- arch/x86/events/core.c | 13 +++++----- arch/x86/events/intel/core.c | 5 +--- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kvm/pmu.c | 2 +- arch/x86/kvm/x86.c | 40 ++++++++++++++++-------------- arch/x86/xen/pmu.c | 32 ++++++++++-------------- include/linux/perf_event.h | 10 +++++--- 9 files changed, 73 insertions(+), 79 deletions(-) diff --git a/arch/arm64/kernel/perf_callchain.c b/arch/arm64/kernel/perf_ca= llchain.c index 86d9f2013172..274dc3e11b6d 100644 --- a/arch/arm64/kernel/perf_callchain.c +++ b/arch/arm64/kernel/perf_callchain.c @@ -104,7 +104,7 @@ void perf_callchain_user(struct perf_callchain_entry_ct= x *entry, { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); =20 - if (guest_cbs && guest_cbs->is_in_guest()) { + if (guest_cbs && guest_cbs->state()) { /* We don't support guest os callchain now */ return; } @@ -152,7 +152,7 @@ void perf_callchain_kernel(struct perf_callchain_entry_= ctx *entry, struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); struct stackframe frame; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { + if (guest_cbs && guest_cbs->state()) { /* We don't support guest os callchain now */ return; } @@ -165,8 +165,8 @@ unsigned long perf_instruction_pointer(struct pt_regs *= regs) { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); =20 - if (guest_cbs && guest_cbs->is_in_guest()) - return guest_cbs->get_guest_ip(); + if (guest_cbs && guest_cbs->state()) + return guest_cbs->get_ip(); =20 return instruction_pointer(regs); } @@ -174,10 +174,11 @@ unsigned long perf_instruction_pointer(struct pt_regs= *regs) unsigned long perf_misc_flags(struct pt_regs *regs) { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); + unsigned int guest_state =3D guest_cbs ? guest_cbs->state() : 0; int misc =3D 0; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { - if (guest_cbs->is_user_mode()) + if (guest_state) { + if (guest_state & PERF_GUEST_USER) misc |=3D PERF_RECORD_MISC_GUEST_USER; else misc |=3D PERF_RECORD_MISC_GUEST_KERNEL; diff --git a/arch/arm64/kvm/perf.c b/arch/arm64/kvm/perf.c index a0d660cf889e..dfa9bce8559e 100644 --- a/arch/arm64/kvm/perf.c +++ b/arch/arm64/kvm/perf.c @@ -13,39 +13,34 @@ =20 DEFINE_STATIC_KEY_FALSE(kvm_arm_pmu_available); =20 -static int kvm_is_in_guest(void) +static unsigned int kvm_guest_state(void) { - return kvm_get_running_vcpu() !=3D NULL; -} + struct kvm_vcpu *vcpu =3D kvm_get_running_vcpu(); + unsigned int state; =20 -static int kvm_is_user_mode(void) -{ - struct kvm_vcpu *vcpu; - - vcpu =3D kvm_get_running_vcpu(); + if (!vcpu) + return 0; =20 - if (vcpu) - return !vcpu_mode_priv(vcpu); + state =3D PERF_GUEST_ACTIVE; + if (!vcpu_mode_priv(vcpu)) + state |=3D PERF_GUEST_USER; =20 - return 0; + return state; } =20 static unsigned long kvm_get_guest_ip(void) { - struct kvm_vcpu *vcpu; + struct kvm_vcpu *vcpu =3D kvm_get_running_vcpu(); =20 - vcpu =3D kvm_get_running_vcpu(); + if (WARN_ON_ONCE(!vcpu)) + return 0; =20 - if (vcpu) - return *vcpu_pc(vcpu); - - return 0; + return *vcpu_pc(vcpu); } =20 static struct perf_guest_info_callbacks kvm_guest_cbs =3D { - .is_in_guest =3D kvm_is_in_guest, - .is_user_mode =3D kvm_is_user_mode, - .get_guest_ip =3D kvm_get_guest_ip, + .state =3D kvm_guest_state, + .get_ip =3D kvm_get_guest_ip, }; =20 void kvm_perf_init(void) diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c index 32cec290d3ad..e29312a1003a 100644 --- a/arch/x86/events/core.c +++ b/arch/x86/events/core.c @@ -2772,7 +2772,7 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx= *entry, struct pt_regs *re struct unwind_state state; unsigned long addr; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { + if (guest_cbs && guest_cbs->state()) { /* TODO: We don't support guest os callchain now */ return; } @@ -2876,7 +2876,7 @@ perf_callchain_user(struct perf_callchain_entry_ctx *= entry, struct pt_regs *regs struct stack_frame frame; const struct stack_frame __user *fp; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { + if (guest_cbs && guest_cbs->state()) { /* TODO: We don't support guest os callchain now */ return; } @@ -2955,8 +2955,8 @@ unsigned long perf_instruction_pointer(struct pt_regs= *regs) { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); =20 - if (guest_cbs && guest_cbs->is_in_guest()) - return guest_cbs->get_guest_ip(); + if (guest_cbs && guest_cbs->state()) + return guest_cbs->get_ip(); =20 return regs->ip + code_segment_base(regs); } @@ -2964,10 +2964,11 @@ unsigned long perf_instruction_pointer(struct pt_re= gs *regs) unsigned long perf_misc_flags(struct pt_regs *regs) { struct perf_guest_info_callbacks *guest_cbs =3D perf_get_guest_cbs(); + unsigned int guest_state =3D guest_cbs ? guest_cbs->state() : 0; int misc =3D 0; =20 - if (guest_cbs && guest_cbs->is_in_guest()) { - if (guest_cbs->is_user_mode()) + if (guest_state) { + if (guest_state & PERF_GUEST_USER) misc |=3D PERF_RECORD_MISC_GUEST_USER; else misc |=3D PERF_RECORD_MISC_GUEST_KERNEL; diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index cde29bd5bb53..24adbd6282d4 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -2906,10 +2906,7 @@ static int handle_pmi_common(struct pt_regs *regs, u= 64 status) handled++; =20 guest_cbs =3D perf_get_guest_cbs(); - if (unlikely(guest_cbs && guest_cbs->is_in_guest() && - guest_cbs->handle_intel_pt_intr)) - guest_cbs->handle_intel_pt_intr(); - else + if (likely(!guest_cbs || !guest_cbs->handle_intel_pt_intr())) intel_pt_interrupt(); } =20 diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index bf0a9ce53750..112ffb355552 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1893,7 +1893,7 @@ int kvm_skip_emulated_instruction(struct kvm_vcpu *vc= pu); int kvm_complete_insn_gp(struct kvm_vcpu *vcpu, int err); void __kvm_request_immediate_exit(struct kvm_vcpu *vcpu); =20 -int kvm_is_in_guest(void); +unsigned int kvm_guest_state(void); =20 void __user *__x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa, u32 size); diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index 0772bad9165c..5b68d4188de0 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -87,7 +87,7 @@ static void kvm_perf_overflow_intr(struct perf_event *per= f_event, * woken up. So we should wake it, but this is impossible from * NMI context. Do it from irq work instead. */ - if (!kvm_is_in_guest()) + if (!kvm_guest_state()) irq_work_queue(&pmc_to_pmu(pmc)->irq_work); else kvm_make_request(KVM_REQ_PMI, pmc->vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 021d3f5364b2..ceb09d78277e 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8413,44 +8413,48 @@ static void kvm_timer_init(void) DEFINE_PER_CPU(struct kvm_vcpu *, current_vcpu); EXPORT_PER_CPU_SYMBOL_GPL(current_vcpu); =20 -int kvm_is_in_guest(void) +unsigned int kvm_guest_state(void) { - return __this_cpu_read(current_vcpu) !=3D NULL; -} + struct kvm_vcpu *vcpu =3D __this_cpu_read(current_vcpu); + unsigned int state; =20 -static int kvm_is_user_mode(void) -{ - int user_mode =3D 3; + if (!vcpu) + return 0; =20 - if (__this_cpu_read(current_vcpu)) - user_mode =3D static_call(kvm_x86_get_cpl)(__this_cpu_read(current_vcpu)= ); + state =3D PERF_GUEST_ACTIVE; + if (static_call(kvm_x86_get_cpl)(vcpu)) + state |=3D PERF_GUEST_USER; =20 - return user_mode !=3D 0; + return state; } =20 -static unsigned long kvm_get_guest_ip(void) +static unsigned long kvm_guest_get_ip(void) { - unsigned long ip =3D 0; + struct kvm_vcpu *vcpu =3D __this_cpu_read(current_vcpu); =20 - if (__this_cpu_read(current_vcpu)) - ip =3D kvm_rip_read(__this_cpu_read(current_vcpu)); + if (WARN_ON_ONCE(!vcpu)) + return 0; =20 - return ip; + return kvm_rip_read(vcpu); } =20 -static void kvm_handle_intel_pt_intr(void) +static unsigned int kvm_handle_intel_pt_intr(void) { struct kvm_vcpu *vcpu =3D __this_cpu_read(current_vcpu); =20 + /* '0' on failure so that the !PT case can use a RET0 static call. */ + if (!vcpu) + return 0; + kvm_make_request(KVM_REQ_PMI, vcpu); __set_bit(MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI_BIT, (unsigned long *)&vcpu->arch.pmu.global_status); + return 1; } =20 static struct perf_guest_info_callbacks kvm_guest_cbs =3D { - .is_in_guest =3D kvm_is_in_guest, - .is_user_mode =3D kvm_is_user_mode, - .get_guest_ip =3D kvm_get_guest_ip, + .state =3D kvm_guest_state, + .get_ip =3D kvm_guest_get_ip, .handle_intel_pt_intr =3D NULL, }; =20 diff --git a/arch/x86/xen/pmu.c b/arch/x86/xen/pmu.c index e13b0b49fcdf..89dd6b1708b0 100644 --- a/arch/x86/xen/pmu.c +++ b/arch/x86/xen/pmu.c @@ -413,34 +413,29 @@ int pmu_apic_update(uint32_t val) } =20 /* perf callbacks */ -static int xen_is_in_guest(void) +static unsigned int xen_guest_state(void) { const struct xen_pmu_data *xenpmu_data =3D get_xenpmu_data(); + unsigned int state =3D 0; =20 if (!xenpmu_data) { pr_warn_once("%s: pmudata not initialized\n", __func__); - return 0; + return state; } =20 if (!xen_initial_domain() || (xenpmu_data->domain_id >=3D DOMID_SELF)) - return 0; + return state; =20 - return 1; -} + state |=3D PERF_GUEST_ACTIVE; =20 -static int xen_is_user_mode(void) -{ - const struct xen_pmu_data *xenpmu_data =3D get_xenpmu_data(); - - if (!xenpmu_data) { - pr_warn_once("%s: pmudata not initialized\n", __func__); - return 0; + if (xenpmu_data->pmu.pmu_flags & PMU_SAMPLE_PV) { + if (xenpmu_data->pmu.pmu_flags & PMU_SAMPLE_USER) + state |=3D PERF_GUEST_USER; + } else if (xenpmu_data->pmu.r.regs.cpl & 3) { + state |=3D PERF_GUEST_USER; } =20 - if (xenpmu_data->pmu.pmu_flags & PMU_SAMPLE_PV) - return (xenpmu_data->pmu.pmu_flags & PMU_SAMPLE_USER); - else - return !!(xenpmu_data->pmu.r.regs.cpl & 3); + return state; } =20 static unsigned long xen_get_guest_ip(void) @@ -456,9 +451,8 @@ static unsigned long xen_get_guest_ip(void) } =20 static struct perf_guest_info_callbacks xen_guest_cbs =3D { - .is_in_guest =3D xen_is_in_guest, - .is_user_mode =3D xen_is_user_mode, - .get_guest_ip =3D xen_get_guest_ip, + .state =3D xen_guest_state, + .get_ip =3D xen_get_guest_ip, }; =20 /* Convert registers from Xen's format to Linux' */ diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 98c204488496..5e6b346d62a7 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -26,11 +26,13 @@ # include #endif =20 +#define PERF_GUEST_ACTIVE 0x01 +#define PERF_GUEST_USER 0x02 + struct perf_guest_info_callbacks { - int (*is_in_guest)(void); - int (*is_user_mode)(void); - unsigned long (*get_guest_ip)(void); - void (*handle_intel_pt_intr)(void); + unsigned int (*state)(void); + unsigned long (*get_ip)(void); + unsigned int (*handle_intel_pt_intr)(void); }; =20 #ifdef CONFIG_HAVE_HW_BREAKPOINT --=20 2.34.0.rc0.344.g81b53c2807-goog