Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp1254398ybt; Thu, 2 Jul 2020 00:23:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzmBvZSnVuNb5HuGZeGjqDUSZFDVAV6chESJr+TLW+5f1PjwaFo3UdWh+DZ1+Meap+5UPa/ X-Received: by 2002:a17:906:33c5:: with SMTP id w5mr26097835eja.275.1593674632593; Thu, 02 Jul 2020 00:23:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593674632; cv=none; d=google.com; s=arc-20160816; b=vcLfxpTPtG/COCrCp0afmDrxrUnR39nTic87hKaJ4nTRlcRdgCgyWU6btgCdNBaiGk Srgx/m7liRDEv00EkNSeqquZbTh7L1myOFtHCz4Jyub9faOgaYmvKUNIFAEu/V0hNH+c CV3+PPtdmLCd1URW86N6Y5Wk2ganhCnLmi1sklbBmoacm93a5n2RbogKYn9Ae/4Lqq2j zeX2vbEtrGBI4eU7OGMVNZK36vz+eGDz0sUdRsah1Q7w7oFkIR6rIhjVYRIS4NpVboaA v/RgFAkzgJPl7EgZv5OKSi8FYoVSbPqNrXyFdP3dnET0xEGjJa9TVIpjSwv9lumCfLH5 tDSg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=T7Y0j63oWobYj4YcOSk57+MHnD8chuOWhfi8s1ZWmEw=; b=PUCZz9P6WJsLA2sMrVZgLWYmO+8BSPAjwN3YtaL9ARG0zk/n6d/wAmCHJSQjJy8QwK hJdSUgDvcY1yS8vAjd5Fl8WjcQrAzZEtpVW1jL26mz2fF819HFmDtVAgqrjDYgjLBnFP 78OsXP/Bq0iwPVx/vcCt5tVqqUm/0Wad6AqKU1V8tTW8gL9A58ny/BxkUeQcuI+h2a+D PF7p7bLu5c8Djt8BsrHiA1a3Rczb4bS8s2t2G2aRoJ34I5mQqVYv4mUb7MkOmOOamlkO ymRTEuY7sQzU7q78aKNKMCT6rZ6Ry7c5uQ3bp+f3fswzcUULQwmZB7KJxq7s6W4MFoTQ RkCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=kuS2Mmhm; 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=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jp14si5316098ejb.93.2020.07.02.00.23.29; Thu, 02 Jul 2020 00:23:52 -0700 (PDT) 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=@kernel.org header.s=default header.b=kuS2Mmhm; 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=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727921AbgGBHXJ (ORCPT + 99 others); Thu, 2 Jul 2020 03:23:09 -0400 Received: from mail.kernel.org ([198.145.29.99]:55862 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726362AbgGBHXJ (ORCPT ); Thu, 2 Jul 2020 03:23:09 -0400 Received: from willie-the-truck (236.31.169.217.in-addr.arpa [217.169.31.236]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3B3D42073E; Thu, 2 Jul 2020 07:23:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593674588; bh=Re61RwD/CyQqWBiQskwnaPfGr1o4kLsu1CWsfLls+hM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=kuS2Mmhm+7c/+nST2Wi4JbOT82ZSobqK5KFCdbVqQXwCGLZBy7/LpmgMb7Pq85t1G a6m6BrCh5id96wu1KUG0opwCahVKpnhDfkXuSg9AMslVdZ1XMgtrIMFp1PT5EHGsL9 n0XlU4lEskbMa3Pt2IwRkzphNfPJu+6WmVYkG9DQ= Date: Thu, 2 Jul 2020 08:23:02 +0100 From: Will Deacon To: Dave P Martin Cc: linux-kernel@vger.kernel.org, Mark Rutland , "Michael S. Tsirkin" , Peter Zijlstra , Catalin Marinas , Jason Wang , virtualization@lists.linux-foundation.org, Arnd Bergmann , Alan Stern , Sami Tolvanen , Matt Turner , kernel-team@android.com, Marco Elver , Kees Cook , "Paul E. McKenney" , Boqun Feng , Josh Triplett , Ivan Kokshaysky , linux-arm-kernel@lists.infradead.org, Richard Henderson , Nick Desaulniers , linux-alpha@vger.kernel.org Subject: Re: [PATCH 18/18] arm64: lto: Strengthen READ_ONCE() to acquire when CLANG_LTO=y Message-ID: <20200702072301.GA15963@willie-the-truck> References: <20200630173734.14057-1-will@kernel.org> <20200630173734.14057-19-will@kernel.org> <20200701170722.4rte5ssnmrn2uqzg@bakewell.cambridge.arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200701170722.4rte5ssnmrn2uqzg@bakewell.cambridge.arm.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jul 01, 2020 at 06:07:25PM +0100, Dave P Martin wrote: > On Tue, Jun 30, 2020 at 06:37:34PM +0100, Will Deacon wrote: > > When building with LTO, there is an increased risk of the compiler > > converting an address dependency headed by a READ_ONCE() invocation > > into a control dependency and consequently allowing for harmful > > reordering by the CPU. > > > > Ensure that such transformations are harmless by overriding the generic > > READ_ONCE() definition with one that provides acquire semantics when > > building with LTO. > > > > Signed-off-by: Will Deacon > > --- > > arch/arm64/include/asm/rwonce.h | 63 +++++++++++++++++++++++++++++++ > > arch/arm64/kernel/vdso/Makefile | 2 +- > > arch/arm64/kernel/vdso32/Makefile | 2 +- > > 3 files changed, 65 insertions(+), 2 deletions(-) > > create mode 100644 arch/arm64/include/asm/rwonce.h > > > > diff --git a/arch/arm64/include/asm/rwonce.h b/arch/arm64/include/asm/rwonce.h > > new file mode 100644 > > index 000000000000..515e360b01a1 > > --- /dev/null > > +++ b/arch/arm64/include/asm/rwonce.h > > @@ -0,0 +1,63 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +/* > > + * Copyright (C) 2020 Google LLC. > > + */ > > +#ifndef __ASM_RWONCE_H > > +#define __ASM_RWONCE_H > > + > > +#ifdef CONFIG_CLANG_LTO > > Don't we have a generic option for LTO that's not specific to Clang. /me looks at the LTO series some more Oh yeah, there's CONFIG_LTO which is selected by CONFIG_LTO_CLANG, which is the non-typoed version of the above. I can switch this to CONFIG_LTO. > Also, can you illustrate code that can only be unsafe with Clang LTO? I don't have a concrete example, but it's an ongoing concern over on the LTO thread [1], so I cooked this to show one way we could deal with it. The main concern is that the whole-program optimisations enabled by LTO may allow the compiler to enumerate possible values for a pointer at link time and replace an address dependency between two loads with a control dependency instead, defeating the dependency ordering within the CPU. We likely won't realise if/when this goes wrong, other than impossible to debug, subtle breakage that crops up seemingly randomly. Ideally, we'd be able to detect this sort of thing happening at build time, and perhaps even prevent it with compiler options or annotations, but none of that is close to being available and I'm keen to progress the LTO patches in the meantime because they are a requirement for CFI. Will [1] https://lore.kernel.org/r/20200624203200.78870-1-samitolvanen@google.com