Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753087AbYKGUhg (ORCPT ); Fri, 7 Nov 2008 15:37:36 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751121AbYKGUh1 (ORCPT ); Fri, 7 Nov 2008 15:37:27 -0500 Received: from relais.videotron.ca ([24.201.245.36]:44123 "EHLO relais.videotron.ca" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750911AbYKGUh0 (ORCPT ); Fri, 7 Nov 2008 15:37:26 -0500 MIME-version: 1.0 Content-transfer-encoding: 7BIT Content-type: TEXT/PLAIN; charset=US-ASCII Date: Fri, 07 Nov 2008 15:36:45 -0500 (EST) From: Nicolas Pitre X-X-Sender: nico@xanadu.home To: Mathieu Desnoyers Cc: David Howells , "Paul E. McKenney" , Linus Torvalds , akpm@linux-foundation.org, Ingo Molnar , Peter Zijlstra , lkml , Ralf Baechle , benh@kernel.crashing.org, paulus@samba.org, David Miller , Ingo Molnar , Thomas Gleixner , Steven Rostedt , linux-arch@vger.kernel.org Subject: Re: [RFC patch 08/18] cnt32_to_63 should use smp_rmb() In-reply-to: <20081107170902.GD22134@Krystal> Message-id: References: <20081107053349.861709786@polymtl.ca> <20081107052336.652868737@polymtl.ca> <25257.1226055312@redhat.com> <20081107170902.GD22134@Krystal> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2020 Lines: 50 On Fri, 7 Nov 2008, Mathieu Desnoyers wrote: > I want to make sure > > __m_cnt_hi > is read before > mmio cnt_lo read > > for the detailed reasons explained in my previous discussion with > Nicolas here : > http://lkml.org/lkml/2008/10/21/1 > > I use smp_rmb() to do this on SMP systems (hrm, actually, a rmb() could > be required so it works also on UP systems safely wrt interrupts). > > The write side is between the hardware counter, which is assumed to > increment monotonically between each read, and the value __m_cnt_hi > updated by the CPU. I don't see where we could put a wmb() there. > > Without barrier, the smp race looks as follow : > > > CPU A B > read hw cnt low (0xFFFFFFFA) > read __m_cnt_hi (0x80000000) > read hw cnt low (0x00000001) > (wrap detected : > (s32)(0x80000000 ^ 0x1) < 0) > write __m_cnt_hi = 0x00000001 > read __m_cnt_hi (0x00000001) > return 0x0000000100000001 > (wrap detected : > (s32)(0x00000001 ^ 0xFFFFFFFA) < 0) > write __m_cnt_hi = 0x80000001 > return 0x80000001FFFFFFFA > (time jumps) Could you have hardware doing such things? You would get a non cached and more expensive read on CPU B which is not in program order with the read that should have happened before, and before that second out of order read could be performed, you'd have a full sequence in program order performed on CPU A. Nicolas -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/