From: Andy Isaacson <adi@hexapodia.org>
To: moreau francis <francis_moreau2000@yahoo.fr>
Cc: "linux-os (Dick Johnson)" <linux-os@analogic.com>,
linux-kernel@vger.kernel.org, alan@lxorguk.ukuu.org.uk
Subject: Re: question on memory barrier
Date: Thu, 25 Aug 2005 07:54:45 -0700 [thread overview]
Message-ID: <20050825145445.GD7319@hexapodia.org> (raw)
In-Reply-To: <20050825091403.6380.qmail@web25805.mail.ukl.yahoo.com>
On Thu, Aug 25, 2005 at 11:14:03AM +0200, moreau francis wrote:
> --- Andy Isaacson <adi@hexapodia.org> a écrit :
> > The first register write will be completed before the second register
> > write because you use writel, which is defined to have the semantics you
> > want. (It uses a platform-specific method to guarantee this, possibly
> > "volatile" or "asm("eieio")" or whatever method your platform requires.)
>
> I'm compiling Linux kernel for a MIPS32 cpu.
Funny, me too. (Well, mostly MIPS64, but some MIPS32.)
> On my platform, writel seems
> expand to:
>
> static inline writel(u32 val, volatile void __iomem *mem)
> {
> volatile u32 *__mem;
> u32 __val;
>
> __mem = (void *)((unsigned long)(mem));
> __val = val;
>
> *__mem = __val;
> }
>
> I don't see the magic in it since "volatile" keyword do not handle memory
> ordering constraints...Linus wrote on volatile keyword, see
> http://www.ussg.iu.edu/hypermail/linux/kernel/0401.0/1387.html
Did you *read* the post?
# The _only_ acceptable use of "volatile" is basically:
#
# - in _code_ (not data structures), where we might mark a place as making
# a special type of access. For example, in the PCI MMIO read functions,
# rather than use inline assembly to force the particular access (which
# would work equally well), we can force the pointer to a volatile type.
That's *exactly* what the writel you quote above does!
The thing that Linus is railing against is stupidity like
struct my_dev_regs {
volatile u8 reg0;
};
That "volatile" does not do what you might think it would do.
To return to the point directly at hand - on MIPS architectures to date,
simply doing your memory access through a "volatile u32 *" is sufficient
to ensure that the IO hits the bus (assuming that your pointer points to
kseg1, not kseg0, or is otherwise uncached), because 'volatile' forces
gcc to generate a "sw" for each store, and all MIPS so far have been
designed so that multiple uncached writes to mmio locations do generate
multiple bus transactions.
I'm not an architect, but I think it would be possible to build a MIPS
where this was not the case, and require additional contortions from
users. Such a MIPS would suck to program and would probably fail in the
marketplace, and there's no compelling benefit to doing so; ergo, I
would expect "volatile" to continue to be sufficient on MIPS.
> make drivers/mydev.i should do the job
Thanks for the pointer!
> but preprocessor doesn't expand inline
> functions. So I won't be able to see the expanded writel function.
But you can simply search backwards in the .i file! The whole point of
inline functions is that they're present in the postprocessed text. The
vim command "#" is useful for this.
-andy
next prev parent reply other threads:[~2005-08-25 14:54 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-24 12:43 question on memory barrier moreau francis
2005-08-24 13:04 ` linux-os (Dick Johnson)
2005-08-24 17:31 ` moreau francis
2005-08-24 18:22 ` linux-os (Dick Johnson)
2005-08-24 19:32 ` Oliver Neukum
2005-08-24 19:47 ` linux-os (Dick Johnson)
2005-08-24 19:55 ` Oliver Neukum
2005-08-24 19:48 ` Andy Isaacson
2005-08-24 19:53 ` Jesse Barnes
2005-08-24 21:45 ` Alan Cox
2005-08-24 21:22 ` Jesse Barnes
2005-08-24 20:03 ` linux-os (Dick Johnson)
2005-08-24 20:21 ` Oliver Neukum
2005-08-25 2:25 ` David Schwartz
2005-08-25 8:49 ` Denis Vlasenko
2005-08-25 9:14 ` moreau francis
2005-08-25 10:07 ` Alan Cox
2005-08-25 14:54 ` Andy Isaacson [this message]
2005-08-26 7:21 ` moreau francis
2005-08-26 10:37 ` Maciej W. Rozycki
2005-08-25 10:32 ` Maciej W. Rozycki
2005-08-24 21:57 ` Alan Cox
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=20050825145445.GD7319@hexapodia.org \
--to=adi@hexapodia.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=francis_moreau2000@yahoo.fr \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-os@analogic.com \
/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