Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1802469ybl; Sat, 11 Jan 2020 03:08:57 -0800 (PST) X-Google-Smtp-Source: APXvYqxhzMXFLTpUThN9mipq+JuXEekpg5mSg/+qd6umGP6e/1tUfRGnJ9RCVt5mcyyLqIeXxNcf X-Received: by 2002:a9d:7cd0:: with SMTP id r16mr6648396otn.50.1578740937685; Sat, 11 Jan 2020 03:08:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578740937; cv=none; d=google.com; s=arc-20160816; b=EXpN6cXEQeLpRqYWzXPCgsGNyMyWzjSEV8keuhW6TtRbXEygiXiSq5RC7+MxWYNGyi hhl1pOcQZeJ3+gRZMp69Po1uOA0RtcAgb8uDjK2zM7SvNPkUIMqF1VD9SfSAo7J75D8K 4Dlb+QVs7OTNiQ6W0k3Jy0ganFRs4AuWXtVJwxRCi/aoGex1hJTnGBn+RriFXhAkBPXd PW/c20S4e6LOI6dpnQOirV97U9T7Wqkj2+mSasTnGJbAF0dfyVX9Fh7MxbOyEy90sedJ /su5cgRas1pKy9/ym+erUF/aTRbewzkZxGz1OiPWzjYZA2ntFh3VOWj+j0tKc4CvgC8i 1/Nw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from; bh=/JK1y+/CAlKK/DDcR5GaML/gVhxNGP/7ATHPGjidCsY=; b=WvQhTVyiqimcqXuXTsW0L3pjLL2ko24HoOB1KGb9wlJ/HzEKIU1b4SGV8krNJFG8VW GROHuusk73Tg7WVv/cRop/f7y1+Z7kgAvdmPAwMbtkSJ48TIydVdiYPFRA8CQhnDGevq hteMi3SsZ6iH6ie3GYgYsQUSrE27y/NGDbKPSzJ0XdzUH+oAv/EzwZOg5eEheG4GVJmO M4pYMiKsdfAC8jvpMZWnJkj85eKbOI1tPA7rrDX5Lv9mXOakaSR9P/9mp44lFofVeTZt 6VGmfFtPptnq7RbjwGJ0iM0KOsf9K8+KhmBwbT1o7kq5cA+UwVPtgQFG03vEfX1aaFTl aoSA== ARC-Authentication-Results: i=1; mx.google.com; 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 c11si3205947oib.246.2020.01.11.03.08.46; Sat, 11 Jan 2020 03:08:57 -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; 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 S1729408AbgAKLHz (ORCPT + 99 others); Sat, 11 Jan 2020 06:07:55 -0500 Received: from Galois.linutronix.de ([193.142.43.55]:32947 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729302AbgAKLHy (ORCPT ); Sat, 11 Jan 2020 06:07:54 -0500 Received: from p5b06da22.dip0.t-ipconnect.de ([91.6.218.34] helo=nanos.tec.linutronix.de) by Galois.linutronix.de with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1iqEcB-0000Ef-0n; Sat, 11 Jan 2020 12:07:35 +0100 Received: by nanos.tec.linutronix.de (Postfix, from userid 1000) id 45B3D100C52; Sat, 11 Jan 2020 12:07:34 +0100 (CET) From: Thomas Gleixner To: Christophe Leroy , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , arnd@arndb.de, vincenzo.frascino@arm.com, luto@kernel.org Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, linux-mips@vger.kernel.org, x86@kernel.org Subject: Re: [RFC PATCH v2 07/10] lib: vdso: don't use READ_ONCE() in __c_kernel_time() In-Reply-To: References: <87lfqfrp7d.fsf@nanos.tec.linutronix.de> Date: Sat, 11 Jan 2020 12:07:34 +0100 Message-ID: <878smes13d.fsf@nanos.tec.linutronix.de> MIME-Version: 1.0 Content-Type: text/plain X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Christophe Leroy writes: > > With READ_ONCE() the 64 bits are being read: > > Without the READ_ONCE() only 32 bits are read. That's the most optimal. > > Without READ_ONCE() but with a barrier() after the read, we should get > the same result but GCC (GCC 8.1) does less good: > > Assuming both part of the 64 bits data will fall into a single > cacheline, the second read is in the noise. They definitely are in the same cacheline. > So agreed to drop this change. We could be smart about this and force the compiler to issue a 32bit read for 32bit builds. See below. Not sure whether it's worth it, but OTOH it will take quite a while until the 32bit time interfaces die completely. Thanks, tglx 8<------------ --- a/include/vdso/datapage.h +++ b/include/vdso/datapage.h @@ -21,6 +21,18 @@ #define CS_RAW 1 #define CS_BASES (CS_RAW + 1) +#ifdef __LITTLE_ENDIAN +struct sec_hl { + u32 sec_l; + u32 sec_h; +}; +#else +struct sec_hl { + u32 sec_h; + u32 sec_l; +}; +#endif + /** * struct vdso_timestamp - basetime per clock_id * @sec: seconds @@ -35,7 +47,10 @@ * vdso_data.cs[x].shift. */ struct vdso_timestamp { - u64 sec; + union { + u64 sec; + struct sec_hl sec_hl; + }; u64 nsec; }; --- a/lib/vdso/gettimeofday.c +++ b/lib/vdso/gettimeofday.c @@ -165,8 +165,13 @@ static __maybe_unused int static __maybe_unused __kernel_old_time_t __cvdso_time(__kernel_old_time_t *time) { const struct vdso_data *vd = __arch_get_vdso_data(); - __kernel_old_time_t t = READ_ONCE(vd[CS_HRES_COARSE].basetime[CLOCK_REALTIME].sec); + __kernel_old_time_t t; +#if BITS_PER_LONG == 32 + t = READ_ONCE(vd[CS_HRES_COARSE].basetime[CLOCK_REALTIME].sec_hl.sec_l); +#else + t = READ_ONCE(vd[CS_HRES_COARSE].basetime[CLOCK_REALTIME].sec); +#endif if (time) *time = t;