linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Alan Cox <alan@redhat.com>
To: David Howells <dhowells@redhat.com>
Cc: Alan Cox <alan@redhat.com>,
	torvalds@osdl.org, akpm@osdl.org, mingo@redhat.com,
	linux-arch@vger.kernel.org, linuxppc64-dev@ozlabs.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Document Linux's memory barriers [try #2]
Date: Wed, 8 Mar 2006 13:45:00 -0500	[thread overview]
Message-ID: <20060308184500.GA17716@devserv.devel.redhat.com> (raw)
In-Reply-To: <11922.1141842907@warthog.cambridge.redhat.com>

On Wed, Mar 08, 2006 at 06:35:07PM +0000, David Howells wrote:
> Alan Cox <alan@redhat.com> wrote:
> 
> > spin_unlock ensures that local CPU writes before the lock are visible
> > to all processors before the lock is dropped but it has no effect on 
> > I/O ordering. Just a need for clarity.
> 
> So I can't use spinlocks in my driver to make sure two different CPUs don't
> interfere with each other when trying to communicate with a device because the
> spinlocks don't guarantee that I/O operations will stay in effect within the
> locking section?

If you have 

CPU #0

	spin_lock(&foo->lock)
	writel(0, &foo->regnum)
	writel(1, &foo->data);
	spin_unlock(&foo->lock);

					CPU #1
						spin_lock(&foo->lock);
						writel(4, &foo->regnum);
						writel(5, &foo->data);
						spin_unlock(&foo->lock);

then on some NUMA infrastructures the order may not be as you expect. The
CPU will execute writel 0, writel 1 and the second CPU later will execute
writel 4 writel 5, but the order they hit the PCI bridge may not be the
same order. Usually such things don't matter but in a register windowed
case getting 0/4/1/5 might be rather unfortunate.

See Documentation/DocBook/deviceiobook.tmpl (or its output)

The following case is safe

	spin_lock(&foo->lock);
	writel(0, &foo->regnum);
	reg = readl(&foo->data);
	spin_unlock(&foo->lock);

as the real must complete and it forces the write to complete. The pure write
case used above should be implemented as

	spin_lock(&foo->lock);
	writel(0, &foo->regnum);
	writel(1, &foo->data);
	mmiowb();
	spin_unlock(&foo->lock);

The mmiowb ensures that the writels will occur before the writel from another
CPU then taking the lock and issuing a writel.

Welcome to the wonderful world of NUMA

Alan


  reply	other threads:[~2006-03-08 18:45 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-03-07 17:40 [PATCH] Document Linux's memory barriers David Howells
2006-03-07 10:34 ` Andi Kleen
2006-03-07 17:47 ` Stephen Hemminger
2006-03-07 18:30 ` David Howells
2006-03-07 11:13   ` Andi Kleen
2006-03-07 18:46   ` Jesse Barnes
2006-03-07 19:23   ` Bryan O'Sullivan
2006-03-07 11:57     ` Andi Kleen
2006-03-07 20:01       ` Jesse Barnes
2006-03-07 21:14       ` Bryan O'Sullivan
2006-03-07 21:24         ` Andi Kleen
2006-03-08  0:36           ` Alan Cox
2006-03-08  0:35       ` Alan Cox
2006-03-07 19:24   ` David Howells
2006-03-07 19:46     ` Stephen Hemminger
2006-03-07 18:40 ` Alan Cox
2006-03-07 18:54   ` linux-os (Dick Johnson)
2006-03-07 19:06     ` Matthew Wilcox
2006-03-07 19:15       ` linux-os (Dick Johnson)
2006-03-09 11:26         ` Sergei Organov
2006-03-07 19:33     ` Alan Cox
2006-03-07 20:09 ` David Howells
2006-03-08  0:32   ` Alan Cox
2006-03-08  8:25   ` Duncan Sands
2006-03-08 22:06     ` Paul Mackerras
2006-03-08 22:24       ` David S. Miller
2006-03-08 22:31         ` Linus Torvalds
2006-03-08 22:42       ` Alan Cox
2006-03-08  2:07 ` Nick Piggin
2006-03-08  3:10 ` Paul Mackerras
2006-03-08  3:30   ` Linus Torvalds
2006-03-08  7:41   ` Nick Piggin
2006-03-08 12:34   ` David Howells
2006-03-08 16:40     ` Bryan O'Sullivan
2006-03-08 13:19 ` David Howells
2006-03-08 21:49   ` Paul Mackerras
2006-03-08 22:05     ` Alan Cox
2006-03-10  0:49   ` H. Peter Anvin
2006-03-08 14:37 ` [PATCH] Document Linux's memory barriers [try #2] David Howells
2006-03-08 14:55   ` Alan Cox
2006-03-08 15:41     ` Matthew Wilcox
2006-03-08 17:19     ` David Howells
2006-03-08 22:10       ` Paul Mackerras
2006-03-08 23:08         ` Ivan Kokshaysky
2006-03-09  1:01           ` Paul Mackerras
2006-03-09 16:02             ` Ivan Kokshaysky
2006-03-08 22:01     ` Paul Mackerras
2006-03-08 22:23       ` David S. Miller
2006-03-08 17:04   ` David Howells
2006-03-08 17:36     ` Alan Cox
2006-03-08 18:35     ` David Howells
2006-03-08 18:45       ` Alan Cox [this message]
2006-03-08 18:59       ` David Howells
2006-03-08 11:38         ` Andi Kleen
2006-03-08 19:08       ` David Howells
2006-03-08 19:26         ` Linus Torvalds
2006-03-08 19:40           ` Matthew Wilcox
2006-03-09  0:37             ` Paul Mackerras
2006-03-09  0:59               ` Jesse Barnes
2006-03-09  1:36                 ` Paul Mackerras
2006-03-09  4:18                   ` Jesse Barnes
2006-03-08 19:54           ` Jesse Barnes
2006-03-08 20:02           ` Alan Cox
2006-03-08 19:31         ` David Howells
2006-03-09  0:35           ` Paul Mackerras
2006-03-09  0:54             ` Linus Torvalds
2006-03-09  1:08               ` Paul Mackerras
2006-03-09  1:27                 ` Linus Torvalds
2006-03-09  2:38                   ` Nick Piggin
2006-03-09  3:45                   ` Paul Mackerras
2006-03-09  4:36                     ` Jesse Barnes
2006-03-09  7:41                       ` Paul Mackerras
2006-03-09  5:38                     ` Linus Torvalds
2006-03-09 11:44                     ` Michael Buesch
2006-03-09 12:27                     ` David Howells
2006-03-09  4:34                   ` Jesse Barnes
2006-03-09  4:43                     ` Paul Mackerras
2006-03-09 10:05                       ` Jes Sorensen
2006-03-09  0:55             ` Jesse Barnes
2006-03-09  1:57               ` Paul Mackerras
2006-03-09  4:26                 ` Jesse Barnes
2006-03-09 12:02   ` Sergei Organov
2006-03-08 16:18 ` [PATCH] Document Linux's memory barriers Pavel Machek
2006-03-08 16:26 ` Christoph Lameter
2006-03-08 17:35 ` David Howells
2006-03-08 17:46   ` Christoph Lameter
2006-03-08 17:59     ` Alan Cox
2006-03-08 19:37 ` [PATCH] Document Linux's memory barriers [try #3] David Howells
2006-03-08 20:16 ` [PATCH] Document Linux's memory barriers David Howells
2006-03-08 22:01   ` Alan Cox
2006-03-09 11:41   ` David Howells
2006-03-09 12:28     ` Alan Cox
2006-03-09 13:02     ` David Howells
2006-03-09 16:32     ` Linus Torvalds
2006-03-09 17:39     ` David Howells
2006-03-09 17:54       ` Linus Torvalds
2006-03-09 17:56         ` Linus Torvalds
2006-03-09 14:01 ` [PATCH] Document Linux's memory barriers [try #3] David Howells

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060308184500.GA17716@devserv.devel.redhat.com \
    --to=alan@redhat.com \
    --cc=akpm@osdl.org \
    --cc=dhowells@redhat.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc64-dev@ozlabs.org \
    --cc=mingo@redhat.com \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).