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=-5.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=no 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 1C80EC48BE0 for ; Mon, 7 Jun 2021 17:46:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F2A2D610A8 for ; Mon, 7 Jun 2021 17:46:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230212AbhFGRsX (ORCPT ); Mon, 7 Jun 2021 13:48:23 -0400 Received: from gate.crashing.org ([63.228.1.57]:58774 "EHLO gate.crashing.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230197AbhFGRsX (ORCPT ); Mon, 7 Jun 2021 13:48:23 -0400 Received: from gate.crashing.org (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id 157Hg905015041; Mon, 7 Jun 2021 12:42:09 -0500 Received: (from segher@localhost) by gate.crashing.org (8.14.1/8.14.1/Submit) id 157Hg6Fm015039; Mon, 7 Jun 2021 12:42:06 -0500 X-Authentication-Warning: gate.crashing.org: segher set sender to segher@kernel.crashing.org using -f Date: Mon, 7 Jun 2021 12:42:06 -0500 From: Segher Boessenkool To: Linus Torvalds Cc: Alexander Monakov , Jakub Jelinek , Alan Stern , "Paul E. McKenney" , Peter Zijlstra , Will Deacon , Andrea Parri , Boqun Feng , Nick Piggin , David Howells , Jade Alglave , Luc Maranget , Akira Yokosawa , Linux Kernel Mailing List , linux-toolchains@vger.kernel.org, linux-arch Subject: Re: [RFC] LKMM: Add volatile_if() Message-ID: <20210607174206.GF18427@gate.crashing.org> References: <20210604214010.GD4397@paulmck-ThinkPad-P17-Gen-1> <20210605145739.GB1712909@rowland.harvard.edu> <20210606001418.GH4397@paulmck-ThinkPad-P17-Gen-1> <20210606012903.GA1723421@rowland.harvard.edu> <20210606185922.GF7746@tucnak> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.3i Precedence: bulk List-ID: X-Mailing-List: linux-toolchains@vger.kernel.org On Sun, Jun 06, 2021 at 03:38:06PM -0700, Linus Torvalds wrote: > In the case of "volatile_if()", we actually would like to have not a > memory clobber, but a "memory read". IOW, it would be a barrier for > any writes taking place, but reads can move around it. > > I don't know of any way to express that to the compiler. We've used > hacks for it before (in gcc, BLKmode reads turn into that kind of > barrier in practice, so you can do something like make the memory > input to the asm be a big array). But that turned out to be fairly > unreliable, so now we use memory clobbers even if we just mean "reads > random memory". > > Example: variable_test_bit(), which generates a "bt" instruction, does > > : "m" (*(unsigned long *)addr), "Ir" (nr) : "memory"); > > and the memory clobber is obviously wrong: 'bt' only *reads* memory, > but since the whole reason we use it is that it's not just that word > at address 'addr', in order to make sure that any previous writes are > actually stable in memory, we use that "memory" clobber. You can split the "I" version from the "r" version, it does not need the memory clobber. If you know the actual maximum bit offset used you don't need the clobber for "r" either. Or you could even write "m"(((unsigned long *)addr)[nr/32]) That should work for all cases. > Anybody have ideas or suggestions for something like that? Is it useful in general for the kernel to have separate "read" and "write" clobbers in asm expressions? And for other applications? Segher