From mboxrd@z Thu Jan 1 00:00:00 1970 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=-10.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 A3AFAC433E0 for ; Fri, 5 Mar 2021 18:24:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 64FE6650A1 for ; Fri, 5 Mar 2021 18:24:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229978AbhCESYP (ORCPT ); Fri, 5 Mar 2021 13:24:15 -0500 Received: from gate.crashing.org ([63.228.1.57]:54749 "EHLO gate.crashing.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229631AbhCESYG (ORCPT ); Fri, 5 Mar 2021 13:24:06 -0500 Received: from gate.crashing.org (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id 125IGTa8026099; Fri, 5 Mar 2021 12:16:29 -0600 Received: (from segher@localhost) by gate.crashing.org (8.14.1/8.14.1/Submit) id 125IGS7W026098; Fri, 5 Mar 2021 12:16:28 -0600 X-Authentication-Warning: gate.crashing.org: segher set sender to segher@kernel.crashing.org using -f Date: Fri, 5 Mar 2021 12:16:28 -0600 From: Segher Boessenkool To: Christophe Leroy Cc: Nick Desaulniers , Mark Rutland , Marco Elver , Catalin Marinas , linuxppc-dev , LKML , kasan-dev , Mark Brown , Paul Mackerras , linux-toolchains@vger.kernel.org, Will Deacon , Linux ARM Subject: Re: [PATCH v1] powerpc: Include running function as first entry in save_stack_trace() and friends Message-ID: <20210305181628.GW29191@gate.crashing.org> References: <1802be3e-dc1a-52e0-1754-a40f0ea39658@csgroup.eu> <20210304145730.GC54534@C02TD0UTHF1T.local> <20210304165923.GA60457@C02TD0UTHF1T.local> <20210304192447.GT29191@gate.crashing.org> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.4.2.3i Precedence: bulk List-ID: X-Mailing-List: linux-toolchains@vger.kernel.org On Fri, Mar 05, 2021 at 07:38:25AM +0100, Christophe Leroy wrote: > Le 04/03/2021 à 20:24, Segher Boessenkool a écrit : > https://github.com/linuxppc/linux/commit/a9a3ed1eff36 > > > > >That is much heavier than needed (an mb()). You can just put an empty > >inline asm after a call before a return, and that call cannot be > >optimised to a sibling call: (the end of a function is an implicit > >return:) > In the commit mentionned at the top, it is said: > > The next attempt to prevent compilers from tail-call optimizing > the last function call cpu_startup_entry(), ... , was to add an empty > asm(""). > > This current solution was short and sweet, and reportedly, is supported > by both compilers but we didn't get very far this time: future (LTO?) > optimization passes could potentially eliminate this, This is simply not true. A volatile inline asm (like this is, all asm without outputs are) is always run on the reel machine exactly like on the abstract machine. LTO can not eliminate it, not more than any other optimisation can. The compiler makes no assumption about the constents of the template of an asm, empty or not. If you are really scared the compiler violates the rules of GCC inline asm and thinks it knows what "" means, you can write asm(";#"); (that is a comment on all supported archs). > which leads us > to the third attempt: having an actual memory barrier there which the > compiler cannot ignore or move around etc. Why would it not be allowed to delete this, and delete some other asm? And the compiler *can* move around asm like this. But the point is, it has to stay in order with other side effects, so there cannot be a sibling call here, the call has to remain: any call contains a sequence point, so side effects cannot be reordered over it, so the call (being before the asm) cannot be transformed to a tail call. Segher