Received: by 10.213.65.68 with SMTP id h4csp885921imn; Wed, 4 Apr 2018 08:53:48 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/4AnDW5z8OlzbldpbxFYLcIbkrf/JIgZoZy5NvpoGwog5CyTKF4QTHBQXybqN/4j54JJQ8 X-Received: by 10.101.72.13 with SMTP id h13mr12264240pgs.420.1522857228403; Wed, 04 Apr 2018 08:53:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522857228; cv=none; d=google.com; s=arc-20160816; b=kuAqfXsmQGzrVe7fpUrHsciQ9Nv1iRdyc5V29ElUUXvMxXCvPw2Q7V9BwTsXQA5Rsp Ee14LUv0502p+zhOM874fR1OKfCQEnBAaMortHj4e3hsrkAx+Q/1KGi4EeaU2RnOJoZA eDbgAevgKWsrV8DDYJ5Ma6+Sq4Jclqc/+n6ypvw0mLSX/JRgt29vY5C65nklBJzb6a9D Tqghw6DWFHLXV5OHT4xnaUqltU4v6IZrBhFxSKH0/veB6F/xougcLtYk5fcdn4ULGF27 himf9cuHnffud5RvRFj92eA6Q8SzFAbaQ7/b+mvBJJ2OnCES1jXKFTTpKU0VdBRtjNbl u+6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dmarc-filter :dkim-signature:dkim-signature:arc-authentication-results; bh=GEKGeZKdd6ryoYW6a3SQIKvwxd4ygMqp6EUnc2RpKtA=; b=m8mIjindtKVK6K+ALVSC8neBAfmGqXU7568uPtRsfp0xjU6RCJJ30XZslv6yIMXS+S EDX0GrdvTe4nhHLMWkL1bu5+PZWzp56BpCx/Iojz8lUgOMvYtQbQKmaP++QJKaEyO0is huup66R1FmF7kLT7VhfNZJ9yjlr9/KWPDA1k45p3SlSu2eFbCkm00Hlzr0qZ5/JKq59Y OWWIGTYJqobh9KHUopu4huBcrAE4NEl/rWOPgQ9hVnyz0+YhqkPShOX/TdZCqaHFA/go 95Z7b1pZZi2+QGpjdPIDN6ZN2e8nlc7Kw6wGQtu91N8sCxAjoAbBjeNyAiXXk6zjtc5B NGwQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=Xd2wQWge; dkim=pass header.i=@codeaurora.org header.s=default header.b=A+4SfT9t; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y184si3826782pgb.120.2018.04.04.08.53.34; Wed, 04 Apr 2018 08:53:48 -0700 (PDT) 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=@codeaurora.org header.s=default header.b=Xd2wQWge; dkim=pass header.i=@codeaurora.org header.s=default header.b=A+4SfT9t; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752173AbeDDPw1 (ORCPT + 99 others); Wed, 4 Apr 2018 11:52:27 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:33762 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752020AbeDDPwX (ORCPT ); Wed, 4 Apr 2018 11:52:23 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 3384B607E5; Wed, 4 Apr 2018 15:52:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1522857143; bh=NMWU3O0G152eA3E4vzdqpH2oiVUOusDA372SGYfMpvk=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Xd2wQWge8RX3DqEir+uofAnqdceCumuwKY1YGcja+87lRlyLlxupdF8NKVM0ge8xv iKmfE8zOtBgZsYJTwzvzr1jJ87vsTqwr84m9+WxBJsSS7OGeIAbgKhM69k8kUQaKgf voMaNWkGiCdpkc1CDwBzmW6Fvh3R9IN+nwt2oulc= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from [10.235.228.150] (global_nat1_iad_fw.qualcomm.com [129.46.232.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: okaya@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 5321B607A2; Wed, 4 Apr 2018 15:52:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1522857142; bh=NMWU3O0G152eA3E4vzdqpH2oiVUOusDA372SGYfMpvk=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=A+4SfT9tqmh5FAo9MDaZHGAi4sls4qChi0lHOQkZIR824D/6KLwjSnMvS5hGVfOa0 4MiFKFF2BshAEyU01cLBQwglBpQ1dCk6ELQZ7adTZsSZHEIwEb7fcnRgL8tEhA8qA8 E4Cp9AmAxwraeGt8PNpGbwIocNO6yXVtKY9CUViY= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 5321B607A2 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=okaya@codeaurora.org Subject: Re: [PATCH v2 2/2] io: prevent compiler reordering on the default readX() implementation To: Palmer Dabbelt , Arnd Bergmann Cc: mark.rutland@arm.com, timur@codeaurora.org, sulrich@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org References: From: Sinan Kaya Message-ID: <691b903c-e97d-0a25-28c5-690318bb215a@codeaurora.org> Date: Wed, 4 Apr 2018 11:52:20 -0400 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 4/3/2018 6:29 PM, Palmer Dabbelt wrote: > On Tue, 03 Apr 2018 05:56:18 PDT (-0700), Arnd Bergmann wrote: >> On Tue, Apr 3, 2018 at 2:44 PM, Sinan Kaya wrote: >>> On 4/3/2018 7:13 AM, Arnd Bergmann wrote: >>>> On Tue, Apr 3, 2018 at 12:49 PM, Mark Rutland wrote: >>>>> Hi, >>>>> >>>>> On Fri, Mar 30, 2018 at 11:58:13AM -0400, Sinan Kaya wrote: >>>>>> The default implementation of mapping readX() to __raw_readX() is wrong. >>>>>> readX() has stronger ordering semantics. Compiler is allowed to reorder >>>>>> __raw_readX(). >>>>> >>>>> Could you please specify what the compiler is potentially reordering >>>>> __raw_readX() against, and why this would be wrong? >>>>> >>>>> e.g. do we care about prior normal memory accesses, subsequent normal >>>>> memory accesses, and/or other IO accesses? >>>>> >>>>> I assume that the asm-generic __raw_{read,write}X() implementations are >>>>> all ordered w.r.t. each other (at least for a specific device). >>>> >>>> I think that is correct: the compiler won't reorder those because of the >>>> 'volatile' pointer dereference, but it can reorder access to a normal >>>> pointer against a __raw_readl()/__raw_writel(), which breaks the scenario >>>> of using writel to trigger a DMA, or using a readl to see if a DMA has >>>> completed. >>> >>> Yes, we are worried about memory update vs. IO update ordering here. >>> That was the reason why barrier() was introduced in this patch. I'll try to >>> clarify that better in the commit text. >>> >>>> >>>> The question is whether we should use a stronger barrier such >>>> as rmb() amd wmb() here rather than a simple compiler barrier. >>>> >>>> I would assume that on complex architectures with write buffers and >>>> out-of-order prefetching, those are required, while on architectures >>>> without those features, the barriers are cheap. >>> >>> That's my reasoning too. I'm trying to follow the x86 example here where there >>> is a compiler barrier in writeX() and readX() family of functions. >> >> I think x86 is the special case here because it implicitly guarantees >> the strict ordering in the hardware, as long as the compiler gets it >> right. For the asm-generic version, it may be better to play safe and >> do the safest version, requiring architectures to override that barrier >> if they want to be faster. >> >> We could use the same macros that riscv has, using __io_br(), >> __io_ar(), __io_bw() and __io_aw() for before/after read/write. > > FWIW, when I wrote this I wasn't sure what the RISC-V memory model was going to be so I just picked something generic.  In other words, it's already a generic interface, just one that we're the only users of :). > Are we looking for something like this? diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index e8c2078..693a82f 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -101,6 +101,16 @@ static inline void __raw_writeq(u64 value, volatile void __iomem *addr) #endif #endif /* CONFIG_64BIT */ +#ifndef __io_br() +#define __io_br() do {} while (0) +#endif + +#ifdef rmb +#define __io_ar() rmb(); +#else +#define __io_ar() barrier(); +#endif + /* * {read,write}{b,w,l,q}() access little endian memory and return result in * native endianness. @@ -108,35 +118,46 @@ static inline void __raw_writeq(u64 value, volatile void __iomem *addr) #ifndef readb #define readb readb -static inline u8 readb(const volatile void __iomem *addr) -{ - return __raw_readb(addr); -} +#define readb(c) \ + ({ u8 __v; \ + __io_br(); \ + __v = __raw_readb(c); \ + __io_ar(); \ + __v; }) #endif #ifndef readw #define readw readw -static inline u16 readw(const volatile void __iomem *addr) -{ - return __le16_to_cpu(__raw_readw(addr)); -} +#define readw(c) \ + ({ u16 __v; \ + \ + __io_br(); \ + __v = __le16_to_cpu(__raw_readw(c)); \ + __io_ar(); \ + __v; }) #endif #ifndef readl #define readl readl -static inline u32 readl(const volatile void __iomem *addr) -{ - return __le32_to_cpu(__raw_readl(addr)); -} +#define readl(c) \ + ({ u32 __v; \ + \ + __io_br(); \ + __v = __le32_to_cpu(__raw_readl(c)); \ + __io_ar(); \ + __v; }) #endif #ifdef CONFIG_64BIT #ifndef readq #define readq readq -static inline u64 readq(const volatile void __iomem *addr) -{ - return __le64_to_cpu(__raw_readq(addr)); -} +#define readq(c) \ + ({ u64 __v; \ + \ + __io_br(); \ + __v = __le64_to_cpu(__raw_readq(c)); \ + __io_ar(); \ + __v; }) #endif #endif /* CONFIG_64BIT */ -- Sinan Kaya Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.