Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1728015pxb; Thu, 4 Feb 2021 23:03:55 -0800 (PST) X-Google-Smtp-Source: ABdhPJxq4OSjE/K5sBR7eXu3C/EKhvZrvYTpONZpvJMPZ4LyvXHkP1BYbUxdZQjsv1W8Kk77mV+n X-Received: by 2002:a17:906:27d7:: with SMTP id k23mr2830572ejc.300.1612508634917; Thu, 04 Feb 2021 23:03:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612508634; cv=none; d=google.com; s=arc-20160816; b=t0Gnc1rWnZD+NACRSaAyYyXp6v1GKOWsETjrcZK7yYpm14XX/4sDs9AdluEsPUtSlA MSu6h5aMZ0SiSEWjKdToyu4ZuboJ+PAMUWXmft6S+aAyklwQn34R7QOzUYClTdADpoxL 6g/Pcs+8KoqCBpDY+qqeZmGXHq3+TkVHfOSxuJiqphAyJ9QFzEfZmvIqkvqUufP58S0N 4LhjIXi+nx1ZGpyipPcTKO9J/I5+I0+qAmx2zfB93Ggd89Pw2NALR4mKpXkSAKssdpJN 8x4r/7aB3qGws2zmjyS2lPk+S+MmRoNeXaqA00KJycatS17PRvj4dgQ06V7irgMlfaW7 Cybw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:organization:references:in-reply-to:date:cc:to:from :subject:message-id:dkim-signature; bh=XknozRzZUXK43pAz/ZEABzhId2YCplO4rf+QlAhTH1g=; b=GcXDOoCgKVjfp11D4hyqW1EfSQQXEoy6kjTbducBLqeM1IG5/oONIMSt8cU7YM4u9D uC4rJfCqG2ZnOFgzTLPLedgKkjVWZNzU8EcUqL0bBllgAunied6RngFoOjsWkVIFIaPK KHqh1YQkvpqvnDwxKaS85ZzXpwkVbHWSzqRBzlDQVu0DB79L9oEfMJWmqIZP1/Q3sEOa Q+li7DGtKk6QjSkeYN+l7pxbEcHxPxle5J3xObKqPvxXY9LVDMs4k5Qj+W1286qcLnCQ UaWG0TQ3noTSNEwICHn27GWJ1yb6vbC5Zte++11RwmJMokJ67ichHFiKXel8YOiX1YWi k9Ig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ch+EAbuB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m10si4694751edi.26.2021.02.04.23.03.29; Thu, 04 Feb 2021 23:03:54 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ch+EAbuB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231290AbhBEHCA (ORCPT + 99 others); Fri, 5 Feb 2021 02:02:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41662 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231283AbhBEHB5 (ORCPT ); Fri, 5 Feb 2021 02:01:57 -0500 Received: from mail-qk1-x72b.google.com (mail-qk1-x72b.google.com [IPv6:2607:f8b0:4864:20::72b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2710C0613D6; Thu, 4 Feb 2021 23:01:16 -0800 (PST) Received: by mail-qk1-x72b.google.com with SMTP id a7so5934894qkb.13; Thu, 04 Feb 2021 23:01:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:subject:from:to:cc:date:in-reply-to:references :organization:user-agent:mime-version:content-transfer-encoding; bh=XknozRzZUXK43pAz/ZEABzhId2YCplO4rf+QlAhTH1g=; b=ch+EAbuBqqWUq/KOQ3wFuIPk6FhxxRuFgr+oVOJUgEpMgZs+p9MCdyGiZ5cvP/OFMN 19tj3L0lgSMq296VU7xrbQvq94K9thyWQElBhs3lOCI1kKfIfvYutm9ISWlSVe9dZVHc MnODvT4YQWTFlW+suNVqqySSe77/m3I1DVMvv/B/srHqC0TnOmQOfNwJRl0aYzaHkTFb luOljWLlxmcDgmq1ldlT9wwbqGd1gOMdnLhxM7KnxM1cjflf/5YzTd5FrY+MehAZe4JT +r51+2VDYm7d4H7kLd7ryp+WPx9eAed0EBgBkZsSNRyS3iPP38XHRXrDOVgKbbnsMqCI AMMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=XknozRzZUXK43pAz/ZEABzhId2YCplO4rf+QlAhTH1g=; b=AiBrNt7Mh2g6VJhn9VrtnuWD83Hlzi9RGugcSuBkQjadS5W1UEzQfG0gAn5afHwGaH LAh7Ky5FF1hHs3KSZQPc+se6YFAsVcvh21zkZaDwb7znMx30Il5fcfVa97Jco3T17kWi MvjxSA1aJBtByyMyYMfFOrVRZ9B2ovhIhD+qkpwmk32Xdr14X25lHkDrI8b1oizdQfjj LgKlJt+JgKl5DwaniApxVkMpGbcCWXZx/x21EWdgTO0jePnxAHU+OmfUqzeIe5YIYvcG PCl4d6Z6rICrtNRC8dnR9eXYV7bKOPyj0wAOJR+Up0FrST85QGBaSUvRnf48gPW2f5qo l89w== X-Gm-Message-State: AOAM531dSY52HZC5Dzk5MUN4KZ9F3mTZHuYjfYA97wK4VmR4BzvzsZ7V 5Q+M9kr0GnZJl6arS/C3TlM= X-Received: by 2002:a05:620a:149b:: with SMTP id w27mr3047841qkj.64.1612508475899; Thu, 04 Feb 2021 23:01:15 -0800 (PST) Received: from li-908e0a4c-2250-11b2-a85c-f027e903211b.ibm.com (186-249-147-196.dynamic.desktop.com.br. [186.249.147.196]) by smtp.gmail.com with ESMTPSA id c14sm8026079qkl.18.2021.02.04.23.01.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Feb 2021 23:01:15 -0800 (PST) Message-ID: <7e231b91e41c3f3586ba2fd604c40f1716db228d.camel@gmail.com> Subject: Re: [PATCH v2 1/1] powerpc/kvm: Save Timebase Offset to fix sched_clock() while running guest code. From: Leonardo Bras To: Nicholas Piggin , "Aneesh Kumar K.V" , Athira Rajeev , Benjamin Herrenschmidt , Christophe Leroy , Frederic Weisbecker , Geert Uytterhoeven , Jordan Niethe , Michael Ellerman , Paul Mackerras , Thomas Gleixner Cc: kvm-ppc@vger.kernel.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Date: Fri, 05 Feb 2021 04:01:09 -0300 In-Reply-To: <1612506268.6rrvx34gzu.astroid@bobo.none> References: <20210205060643.233481-1-leobras.c@gmail.com> <1612506268.6rrvx34gzu.astroid@bobo.none> Organization: IBM Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.3 (3.38.3-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hey Nick, thanks for reviewing :) On Fri, 2021-02-05 at 16:28 +1000, Nicholas Piggin wrote: > Excerpts from Leonardo Bras's message of February 5, 2021 4:06 pm: > > Before guest entry, TBU40 register is changed to reflect guest timebase. > > After exitting guest, the register is reverted to it's original value. > > > > If one tries to get the timestamp from host between those changes, it > > will present an incorrect value. > > > > An example would be trying to add a tracepoint in > > kvmppc_guest_entry_inject_int(), which depending on last tracepoint > > acquired could actually cause the host to crash. > > > > Save the Timebase Offset to PACA and use it on sched_clock() to always > > get the correct timestamp. > > Ouch. Not sure how reasonable it is to half switch into guest registers > and expect to call into the wider kernel, fixing things up as we go. > What if mftb is used in other places? IIUC, the CPU is not supposed to call anything as host between guest entry and guest exit, except guest-related cases, like kvmppc_guest_entry_inject_int(), but anyway, if something calls mftb it will still get the same value as before. This is only supposed to change stuff that depends on sched_clock, like Tracepoints, that can happen in those exceptions. > Especially as it doesn't seem like there is a reason that function _has_ > to be called after the timebase is switched to guest, that's just how > the code is structured. Correct, but if called, like in rb routines, used by tracepoints, the difference between last tb and current (lower) tb may cause the CPU to trap PROGRAM exception, crashing host. > As a local hack to work out a bug okay. If you really need it upstream > could you put it under a debug config option? You mean something that is automatically selected whenever those configs are enabled? CONFIG_TRACEPOINT && CONFIG_KVM_BOOK3S_HANDLER && CONFIG_PPC_BOOK3S_64 Or something the user need to select himself in menuconfig? > > Thanks, > Nick > Thank you! Leonardo Bras > > Signed-off-by: Leonardo Bras > > Suggested-by: Paul Mackerras > > --- > > Changes since v1: > > - Subtracts offset only when CONFIG_KVM_BOOK3S_HANDLER and > >   CONFIG_PPC_BOOK3S_64 are defined. > > --- > >  arch/powerpc/include/asm/kvm_book3s_asm.h | 1 + > >  arch/powerpc/kernel/asm-offsets.c | 1 + > >  arch/powerpc/kernel/time.c | 8 +++++++- > >  arch/powerpc/kvm/book3s_hv.c | 2 ++ > >  arch/powerpc/kvm/book3s_hv_rmhandlers.S | 2 ++ > >  5 files changed, 13 insertions(+), 1 deletion(-) > > > > diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h > > index 078f4648ea27..e2c12a10eed2 100644 > > --- a/arch/powerpc/include/asm/kvm_book3s_asm.h > > +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h > > @@ -131,6 +131,7 @@ struct kvmppc_host_state { > >   u64 cfar; > >   u64 ppr; > >   u64 host_fscr; > > + u64 tb_offset; /* Timebase offset: keeps correct timebase while on guest */ > >  #endif > >  }; > >   > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > > index b12d7c049bfe..0beb8fdc6352 100644 > > --- a/arch/powerpc/kernel/asm-offsets.c > > +++ b/arch/powerpc/kernel/asm-offsets.c > > @@ -706,6 +706,7 @@ int main(void) > >   HSTATE_FIELD(HSTATE_CFAR, cfar); > >   HSTATE_FIELD(HSTATE_PPR, ppr); > >   HSTATE_FIELD(HSTATE_HOST_FSCR, host_fscr); > > + HSTATE_FIELD(HSTATE_TB_OFFSET, tb_offset); > >  #endif /* CONFIG_PPC_BOOK3S_64 */ > >   > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >  #else /* CONFIG_PPC_BOOK3S */ > > diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c > > index 67feb3524460..f27f0163792b 100644 > > --- a/arch/powerpc/kernel/time.c > > +++ b/arch/powerpc/kernel/time.c > > @@ -699,7 +699,13 @@ EXPORT_SYMBOL_GPL(tb_to_ns); > >   */ > >  notrace unsigned long long sched_clock(void) > >  { > > - return mulhdu(get_tb() - boot_tb, tb_to_ns_scale) << tb_to_ns_shift; > > + u64 tb = get_tb() - boot_tb; > > + > > +#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_KVM_BOOK3S_HANDLER) > > + tb -= local_paca->kvm_hstate.tb_offset; > > +#endif > > + > > + return mulhdu(tb, tb_to_ns_scale) << tb_to_ns_shift; > >  } > >   > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >   > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c > > index b3731572295e..c08593c63353 100644 > > --- a/arch/powerpc/kvm/book3s_hv.c > > +++ b/arch/powerpc/kvm/book3s_hv.c > > @@ -3491,6 +3491,7 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit, > >   if ((tb & 0xffffff) < (new_tb & 0xffffff)) > >   mtspr(SPRN_TBU40, new_tb + 0x1000000); > >   vc->tb_offset_applied = vc->tb_offset; > > + local_paca->kvm_hstate.tb_offset = vc->tb_offset; > >   } > >   > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >   if (vc->pcr) > > @@ -3594,6 +3595,7 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit, > >   if ((tb & 0xffffff) < (new_tb & 0xffffff)) > >   mtspr(SPRN_TBU40, new_tb + 0x1000000); > >   vc->tb_offset_applied = 0; > > + local_paca->kvm_hstate.tb_offset = 0; > >   } > >   > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >   mtspr(SPRN_HDEC, 0x7fffffff); > > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > > index b73140607875..8f7a9f7f4ee6 100644 > > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S > > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > > @@ -632,6 +632,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) > >   cmpdi r8,0 > >   beq 37f > >   std r8, VCORE_TB_OFFSET_APPL(r5) > > + std r8, HSTATE_TB_OFFSET(r13) > >   mftb r6 /* current host timebase */ > >   add r8,r8,r6 > >   mtspr SPRN_TBU40,r8 /* update upper 40 bits */ > > @@ -1907,6 +1908,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) > >   beq 17f > >   li r0, 0 > >   std r0, VCORE_TB_OFFSET_APPL(r5) > > + std r0, HSTATE_TB_OFFSET(r13) > >   mftb r6 /* current guest timebase */ > >   subf r8,r8,r6 > >   mtspr SPRN_TBU40,r8 /* update upper 40 bits */ > > -- > > 2.29.2 > > > >