Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1224769ybl; Thu, 12 Dec 2019 11:34:54 -0800 (PST) X-Google-Smtp-Source: APXvYqzOneMHSwczu97WeHSrQutMnRbL+06gsx1we2zCn1z301PX2MTvZndy8E82fjzXd04p6LI9 X-Received: by 2002:a9d:7586:: with SMTP id s6mr9815706otk.342.1576179293920; Thu, 12 Dec 2019 11:34:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576179293; cv=none; d=google.com; s=arc-20160816; b=RYwBD2mLApxBwVC72iwHrouY0wJVt3LPnuckKKJSfSPJ8E1l+ep7Y5LoAjDEBIoepZ 2XRESBJD4R+k9zHLsCmBwBdm1vm4Z8smn1VuU0gri+Hs6wd9nSLUeTHOkuhNw+lLwziH sUiphBdnlOABA+7DDVm8ZsEek8GGnIjS1x9n/EYd8CehPC9WQdz8t/yE5fsamroQEkoZ 2vDtH/+rP5C71TwwNH0yc98VA+/a0h9Ac8kiFeZ0RzbmhZvJ3jic/bkkrN2eLgy4ciS6 9X503HH70KkrU4RZYxTJXgrb6o7GOtXpm860OgnvMuwnx5zxjSeOKSgnfDw2ddb7DlH1 CCPQ== 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=ObagCCNa9Qz19q4sLFObWdGiQIw5wCLXavVzyTjkWQA=; b=sUmsvfJeNEupuzkTWKUZ7KRZhxJMkrFjkM7UYekJlNJoq3R2eE7jYGsnAzZE/omK2W 1/82Bx9rpWT5U4VeHBmYmkrx65AyGxtQdMPjhuSHWKuMWmynZFtCocUZ1EonoevfU0SO Xi6+XNUkxsPpRE8MIm87Bq7k8VBWrfKvxX1xT4K6O7ZB2VeYtVA4dXlh9yS53IVIGzG9 nJhAgKsFhk3eNz9hFQEXv+qtGEQrjzXRDBZivNLsWo8Hv5wH3OrV4Wan3eFnnrTPf2RK 39snb+n9l6ghNe0bibdJx8e3jXKkNg+088oZ6acewRawdk3RybFDUuE+pw4Da32wXJiA kn0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=bagGZkrK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id n14si4029519otk.179.2019.12.12.11.34.40; Thu, 12 Dec 2019 11:34:53 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=bagGZkrK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1730548AbfLLTeJ (ORCPT + 99 others); Thu, 12 Dec 2019 14:34:09 -0500 Received: from mail.kernel.org ([198.145.29.99]:41978 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730284AbfLLTeI (ORCPT ); Thu, 12 Dec 2019 14:34:08 -0500 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 4714C21556; Thu, 12 Dec 2019 19:34:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1576179247; bh=DSjzqa57tXjDkk2/y8MiZfkoGkXE5LuVpeVYvGkAzAw=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=bagGZkrK6wzLHJnf7BiRRpPhzPo5i+riIBOcS9DBGw4Oq1ZBQzyhZGBHdGOlcaaTg WGFTIePbWzElznEfxHo/Qop3TWvFTUmiuMWZ2jloSXdTrYnKxApvRPSNaFF+bcowVa 2obC/XfXaO4qVL9xjg4eYXE4cX3X0COaAkN7hatc= Date: Thu, 12 Dec 2019 19:34:01 +0000 From: Will Deacon To: Linus Torvalds Cc: Peter Zijlstra , Michael Ellerman , dja@axtens.net, Linux Kernel Mailing List , linuxppc-dev@lists.ozlabs.org, Christophe Leroy , linux-arch , Mark Rutland , Segher Boessenkool , Arnd Bergmann , Christian Borntraeger Subject: Re: READ_ONCE() + STACKPROTECTOR_STRONG == :/ (was Re: [GIT PULL] Please pull powerpc/linux.git powerpc-5.5-2 tag (topic/kasan-bitops)) Message-ID: <20191212193401.GB19020@willie-the-truck> References: <87blslei5o.fsf@mpe.ellerman.id.au> <20191206131650.GM2827@hirez.programming.kicks-ass.net> <875zimp0ay.fsf@mpe.ellerman.id.au> <20191212080105.GV2844@hirez.programming.kicks-ass.net> <20191212100756.GA11317@willie-the-truck> <20191212104610.GW2827@hirez.programming.kicks-ass.net> <20191212180634.GA19020@willie-the-truck> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: 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 Hi Linus, On Thu, Dec 12, 2019 at 10:43:05AM -0800, Linus Torvalds wrote: > On Thu, Dec 12, 2019 at 10:06 AM Will Deacon wrote: > > > > I'm currently trying to solve the issue by removing volatile from the bitop > > function signatures > > I really think that's the wrong thing to do. > > The bitop signature really should be "volatile" (and it should be > "const volatile" for test_bit, but I'm not sure anybody cares). Agreed on the "const" part, although I do think the "volatile" aspect has nasty side-effects despite being a visual indicator that we're eliding locks. More below. > Exactly because it's simply valid to say "hey, my data is volatile, > but do an atomic test of this bit". So it might be volatile in the > caller. That's fair, although the cases I've run into so far for the bitops are usually just that the functions have been wrapped, and volatile could easily be dropped from the caller as well (e.g. assign_bit(), __node_clear(), linkmode_test_bit()). > Now, I generally frown on actual volatile data structures - because > the data structure volatility often depends on _context_. The same > data might be volatile in one context (when you do some optimistic > test on it without locking), but 100% stable in another (when you do > have a lock). There are cases in driver code where it looks as though data members are being declared volatile specifically because of the bitops type signatures (e.g. 'wrapped' in 'struct mdp5_mdss', 'context_flag' in 'struct drm_device', 'state' in 'struct s2io_nic'). Yeah, it's bogus, but I think that having the modifier in the function signature is still leading people astray. > So I don't want to see "volatile" on data definitions ("jiffies" being > the one traditional exception), but marking things volatile in code > (because you know you're working with unlocked data) and then passing > them down to various helper functions - including the bitops ones - is > quite traditional and accepted. > > In other words, 'volatile" should be treated the same way "const" is > largely treated in C. > > A pointer to "const" data doesn't mean that the data is read-only, or > that it cannot be modified _elsewhere_, it means that within this > particular context and this copy of the pointer we promise not to > write to it. > > Similarly, a pointer to "volatile" data doesn't mean that the data > might not be stable once you take a lock, for example. So it's ok to > have volatile pointers even if the data declaration itself isn't > volatile - you're stating something about the context, not something > fundamental about the data. > > And in the context of the bit operations, "volatile" is the correct thing > to do. The root of my concern in all of this, and what started me looking at it in the first place, is the interaction with 'typeof()'. Inheriting 'volatile' for a pointer means that local variables in macros declared using typeof() suddenly start generating *hideous* code, particularly when pointless stack spills get stackprotector all excited. Even if we simplify READ_ONCE() back to its old incantation, the acquire/release accessors will have the exact same issues on architectures that implement them. For example, consider this code on arm64: void ool_store_release(unsigned long *ptr, unsigned long val) { smp_store_release(ptr, val); } This compiles to a single instruction plus return, which is what we want: 0000000000000000 : 0: c89ffc01 stlr x1, [x0] 4: d65f03c0 ret Now, see what happens if we make the 'ptr' argument volatile: void ool_store_release(volatile unsigned long *ptr, unsigned long val) { smp_store_release(ptr, val); } 0000000000000000 : 0: a9be7bfd stp x29, x30, [sp, #-32]! 4: 90000002 adrp x2, 0 <__stack_chk_guard> 8: 91000042 add x2, x2, #0x0 c: 910003fd mov x29, sp 10: f9400043 ldr x3, [x2] 14: f9000fa3 str x3, [x29, #24] 18: d2800003 mov x3, #0x0 // #0 1c: c89ffc01 stlr x1, [x0] 20: f9400fa1 ldr x1, [x29, #24] 24: f9400040 ldr x0, [x2] 28: ca000020 eor x0, x1, x0 2c: b5000060 cbnz x0, 38 30: a8c27bfd ldp x29, x30, [sp], #32 34: d65f03c0 ret 38: 94000000 bl 0 <__stack_chk_fail> It's a mess, and fixing READ_ONCE() doesn't help this case, which is why I was looking at getting rid of volatile where it's not strictly needed. I'm certainly open to other suggestions, I just haven't managed to think of anything else. Will