From: Grant Grundler <grundler@parisc-linux.org>
To: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Grant Grundler <grundler@parisc-linux.org>,
akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
parisc-linux@parisc-linux.org,
Christoph Lameter <clameter@sgi.com>
Subject: Re: [parisc-linux] [patch 15/23] Add cmpxchg_local to parisc
Date: Tue, 28 Aug 2007 23:59:55 -0600 [thread overview]
Message-ID: <20070829055955.GA24358@colo.lackof.org> (raw)
In-Reply-To: <20070828183835.GB1280@Krystal>
[davem: patch for you at the bottom to Documentation/atomic_ops.txt ]
On Tue, Aug 28, 2007 at 02:38:35PM -0400, Mathieu Desnoyers wrote:
> * Grant Grundler (grundler@parisc-linux.org) wrote:
> > On Tue, Aug 28, 2007 at 07:50:18AM -0400, Mathieu Desnoyers wrote:
...
> > > So I don't expect to come with an "upper bound" about where it can be
> > > used...
> >
> > Ok...so I'll try to find one in 2.6.22.5:
> > grundler <1855>find -name \*.c | xargs fgrep DEFINE_PER_CPU | fgrep atomic_t
> > ./arch/s390/kernel/time.c:static DEFINE_PER_CPU(atomic_t, etr_sync_word);
> > grundler <1856>find -name \*.c | xargs fgrep DEFINE_PER_CPU | fgrep local_t
> > ./arch/x86_64/kernel/nmi.c:static DEFINE_PER_CPU(local_t, alert_counter);
> >
> > uhm, I was expecting more than that. Maybe there is some other systemic
> > problem with how PER_CPU stuff is used/declared?
>
> the local ops has just been standardized in 2.6.22 though a patchset I
> did. I would not expect the code to start using them this quickly. Or
> maybe is it just that I am doing a terrible marketing job ;)
Yeah, I didn't expect many users of local_t.
The search for atomic_t usage in DEFINE_PER_CPU was an attempt to
find other potential candidates which could be local_t.
Is there any other programmatic way we could look for code which
could (or should) be using local_t?
> > In any case, some references to LTT usage would be quite helpful.
> > E.g. a list of file and variable names at the end of local_ops.txt file.
> >
>
> LTT is not mainlined (yet!) ;)
Ok...probably not such a good example then. :)
...
> > Sorry...the quoted text doesn't answer my question. It's a definition
> > of semantics, not an explanation of the "mechanics".
> >
> > I want to know what happens when (if?) an interrupt occurs in the
> > middle of a read/modify/write sequence that isn't prefixed with LOCK
> > (or something similar for other arches like "store locked conditional" ops).
> >
> > Stating the semantics is a good thing - but not a substitution for
> > describing how it works for a given architecture. Either in the code
> > or in local_ops.txt. Otherwise people like me won't use it because
> > we don't believe that (or understand how) it really works.
> >
>
> Quoting Intel 64 and IA-32 Architectures Software Developer's Manual
>
> 3.2 Instructions
> LOCK - Assert LOCK# Signal Prefix
...
I've read this before and understand how LOCK works. This isn't helpful
since I want a description of the behavior without LOCK.
> And if we take a look at some of the atomic primitives which are used in
> i386 local.h:
>
> add (for inc/dec/add/sub)
> xadd
> cmpxchg
>
> All these instructions, just like any other, can be interrupted by an
> external interrupt or cause a trap, exception, or fault. Interrupt
> handler are executing between instructions and traps/exceptions/faults
> will either execute instead of the faulty instruction or after is has
> been executed. In all these cases, each instruction can be seen as
> executing atomically wrt the local CPU. This is exactly what permits
> asm-i386/local.h to define out the LOCK prefix for UP kernels.
I think what I'm looking for but don't know if it's true:
The cmpxchg (for example) at the kernel process context will not
clobber or be clobbered by a cmpxchg done to the same local_t
performed at the kernel interrupt context by the same CPU.
If that's not true, then it would be good to add that as another
restriction to usage.
> I use the same trick UP kernel are using, but I deploy it in SMP
> context, but I require the CPU to be the only one to access the memory
> locations written to by the local ops.
>
> Basically, since the memory location is _not_ shared across CPUs for
> writing, we can safely write to it without holding the LOCK signal.
ok.
...
> > Note: I already missed the one critical sentence about only the "owning"
> > CPU can write the value....there seem to be other limitations as well
> > with respect to interrupts.
> >
>
> Ok, let's give a try at a clear statement:
>
> - Variables touched by local ops must be per cpu variables.
> - _Only_ the CPU owner of these variables must write to them.
> - This CPU can use local ops from any context (process, irq, softirq, nmi, ...)
> to update its local_t variables.
> - Preemption (or interrupts) must be disabled when using local ops in
> process context to make sure the process won't be migrated to a
> different CPU between getting the per-cpu variable and doing the
> actual local op.
> - When using local ops in interrupt context, no special care must be
> taken on a mainline kernel, since they will run on the local CPU with
> preemption already disabled. I suggest, however, to explicitly
> disable preemption anyway to make sure it will still work correctly on
> -rt kernels.
> - Reading the local cpu variable will provide the current copy of the
> variable.
> - Reads of these variables can be done from any CPU, because updates to
> "long", aligned, variables are always atomic. Since no memory
> synchronization is done by the writer CPU, an outdated copy of the
> variable can be read when reading some _other_ cpu's variables.
Perfect! Ship it! ;)
Can you submit a patch to add the above to Documentation/local_ops.txt ?
...
> > Looks fine to me. Add your "Signed-off-by" and submit to DaveM
> > since he seems to be the maintainer of atomic_ops.txt.
>
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
heh...I think DaveM will want it in git or universal patch form. :)
Patch appended below.
thanks!
grant
Add document reference and simple use example of local_t.
Signed-off-by: Grant Grundler <grundler@parisc-linux.org>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
--- linux-2.6.22.5-ORIG/Documentation/atomic_ops.txt 2007-08-22 16:23:54.000000000 -0700
+++ linux-2.6.22.5-ggg/Documentation/atomic_ops.txt 2007-08-28 22:57:26.000000000 -0700
@@ -7,6 +7,11 @@
maintainers on how to implement atomic counter, bitops, and spinlock
interfaces properly.
+ atomic_t should be used to provide a type with update primitives
+executed atomically from any CPU. If the counter is per CPU and only
+updated by one CPU, local_t is probably more appropriate. Please see
+Documentation/local_ops.txt for the semantics of local_t.
+
The atomic_t type should be defined as a signed integer.
Also, it should be made opaque such that any kind of cast to a normal
C integer type will fail. Something like the following should
next prev parent reply other threads:[~2007-08-29 6:00 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-12 14:54 [patch 00/23] Atomic operations updates: add cmpxchg_local Mathieu Desnoyers
2007-08-12 14:54 ` [patch 01/23] Fall back on interrupt disable in cmpxchg8b on 80386 and 80486 Mathieu Desnoyers
2007-08-12 15:51 ` Jan Engelhardt
2007-08-12 16:23 ` Mathieu Desnoyers
2007-08-12 14:54 ` [patch 02/23] Add cmpxchg_local to asm-generic for per cpu atomic operations Mathieu Desnoyers
2007-08-12 14:54 ` [patch 03/23] Add cmpxchg_local to arm Mathieu Desnoyers
2007-08-12 14:54 ` [patch 04/23] Add cmpxchg_local to avr32 Mathieu Desnoyers
2007-08-13 14:57 ` Haavard Skinnemoen
2007-08-12 14:54 ` [patch 05/23] Add cmpxchg_local to blackfin, replace __cmpxchg by generic cmpxchg Mathieu Desnoyers
2007-08-12 14:54 ` [patch 06/23] Add cmpxchg_local to cris Mathieu Desnoyers
2007-08-12 14:54 ` [patch 07/23] Add cmpxchg_local to frv Mathieu Desnoyers
2007-08-12 14:54 ` [patch 08/23] Add cmpxchg_local to h8300 Mathieu Desnoyers
2007-08-12 14:54 ` [patch 09/23] Add cmpxchg_local, cmpxchg64 and cmpxchg64_local to ia64 Mathieu Desnoyers
2007-08-12 18:59 ` Keith Owens
2007-08-12 19:12 ` [patch 09/23] Add cmpxchg_local, cmpxchg64 and cmpxchg64_local to ia64 (revised) Mathieu Desnoyers
2007-08-12 14:54 ` [patch 10/23] New cmpxchg_local (optimized for UP case) for m32r Mathieu Desnoyers
2007-08-12 14:54 ` [patch 11/23] Fix m32r __xchg Mathieu Desnoyers
2007-08-18 20:40 ` Adrian Bunk
2007-08-19 11:12 ` [PATCH] Fix m32r __xchg (revised) Mathieu Desnoyers
2007-08-12 14:54 ` [patch 12/23] local_t m32r use architecture specific cmpxchg_local Mathieu Desnoyers
2007-08-12 14:54 ` [patch 13/23] Add cmpxchg_local to m86k Mathieu Desnoyers
2007-08-12 14:54 ` [patch 14/23] Add cmpxchg_local to m68knommu Mathieu Desnoyers
2007-08-12 14:54 ` [patch 15/23] Add cmpxchg_local to parisc Mathieu Desnoyers
2007-08-27 21:04 ` [parisc-linux] " Grant Grundler
2007-08-27 21:11 ` Mathieu Desnoyers
2007-08-28 6:39 ` Grant Grundler
2007-08-28 11:50 ` Mathieu Desnoyers
2007-08-28 17:27 ` Grant Grundler
2007-08-28 18:38 ` Mathieu Desnoyers
2007-08-29 5:59 ` Grant Grundler [this message]
2007-08-29 8:25 ` David Miller
2007-08-29 12:08 ` Mathieu Desnoyers
2007-08-27 21:20 ` David Miller
2007-08-12 14:54 ` [patch 16/23] Add cmpxchg_local to ppc Mathieu Desnoyers
2007-08-12 14:54 ` [patch 17/23] Add cmpxchg_local to s390 Mathieu Desnoyers
2007-08-13 8:35 ` Heiko Carstens
2007-08-13 13:43 ` Mathieu Desnoyers
2007-08-12 14:54 ` [patch 18/23] Add cmpxchg_local to sh, use generic cmpxchg() instead of cmpxchg_u32 Mathieu Desnoyers
2007-08-12 14:54 ` [patch 19/23] Add cmpxchg_local to sh64 Mathieu Desnoyers
2007-08-12 14:54 ` [patch 20/23] Add cmpxchg_local to sparc, move __cmpxchg to system.h Mathieu Desnoyers
2007-08-12 14:54 ` [patch 21/23] Add cmpxchg_local to sparc64 Mathieu Desnoyers
2007-08-12 14:54 ` [patch 22/23] Add cmpxchg_local to v850 Mathieu Desnoyers
2007-08-12 14:54 ` [patch 23/23] Add cmpxchg_local to xtensa Mathieu Desnoyers
2007-08-12 15:03 ` [patch 00/23] Atomic operations updates: add cmpxchg_local Mathieu Desnoyers
2007-08-13 21:15 ` Christoph Lameter
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=20070829055955.GA24358@colo.lackof.org \
--to=grundler@parisc-linux.org \
--cc=akpm@linux-foundation.org \
--cc=clameter@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=parisc-linux@parisc-linux.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