Re: [parisc-linux] [patch 15/23] Add cmpxchg_local to parisc



On Tue, Aug 28, 2007 at 07:50:18AM -0400, Mathieu Desnoyers wrote:
...
A few questions/nits:
o Did you attempt quantify how many places in the kernel could use this?
I'm just trying to get a feel for how useful this really is vs just
using existing mechanisms (that people understand) to implement a
non-SMP-safe counter that protects updates (writes) against interrupts.
If you did, adding some referencs to local_ops.txt would be helpful
so folks could look for examples of "correct usage".


Good question. Since it is useful to implement fast, interrupt
reentrant, counters of any kind without disabling interrupts, I think it
could be vastely used in the kernel. I also use it in my LTTng kernel
tracer implementation to provide very fast buffer management. It is used
in LTTng, but could be used for most kind of buffering management too;
meaning that we could manage buffers without disabling interrupts.

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?

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.


o How can a local_t counter protect updates (writes) against interrupts
but not preemption?
I always thought preemption required some sort of interrupt or trap.
Maybe the local_ops.txt explains that and I just missed it.


"Local atomic operations only guarantee variable modification atomicity
wrt the CPU which owns the data. Therefore, care must taken to make sure
that only one CPU writes to the local_t data. This is done by using per
cpu data and making sure that we modify it from within a preemption safe
context." -> therefore, preemption must be disabled around local ops
usage. This is required to be pinned to one CPU anyway.

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.

DaveM explained updates "in flight" would not be visible to interrupts
and I suspect that's the answer to my question....but then I don't "feel
good" the local_ops are safe to update in interrupts _and_ the process
context kernel. Maybe the relationship between local_ops, preemption,
and interrupts could be explained more carefully in local_ops.txt.


Does the paragraph above explain it enough or should I add some more
explanation ?

Please add a bit more detail. If DaveM is correct (he normally is), then
there must be limits on how the local_t can be used in the kernel process
and interrupt contexts. I'd like those rules spelled out very clearly
since it's easy to get wrong and tracking down such a bug is quite painful.

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.

o OK to add a reference for local_ops.txt to atomic_ops.txt?
They are obviously related and anyone "discovering" one of the docs
should be made aware of the other.
Patch+log entry appended below. Please sign-off if that's ok with you.


I'm perfectly ok with the idea, but suggest a small modification. See
below.

Looks fine to me. Add your "Signed-off-by" and submit to DaveM
since he seems to be the maintainer of atomic_ops.txt.

cheers,
grant



thanks,
grant

Diff+Commit entry against 2.6.22.5:

local_t is a variant of atomic_t and has related ops to match.
Add reference for local_t documentation to atomic_ops.txt.

Signed-off-by: Grant Grundler <grundler@xxxxxxxxxxxxxxxx>


--- 2.6.22.5-ORIG/Documentation/atomic_ops.txt 2007-08-27 22:50:27.000000000 -0700
+++ 2.6.22.5-ggg/Documentation/atomic_ops.txt 2007-08-27 22:54:44.000000000 -0700
@@ -14,6 +14,10 @@

typedef struct { volatile int counter; } atomic_t;

+local_t is very similar to atomic_t. 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 first operations to implement for atomic_t's are the
initializers and plain reads.


The text snippet is good, but I am not sure it belongs between the
description of atomic_t type and its initializers. What if we do
something like: (with context, I tried to explain the distinction
between atomic_t and local_t some more)


Semantics and Behavior of Atomic and
Bitmask Operations

David S. Miller

This document is intended to serve as a guide to Linux port
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
suffice:


Mathieu

--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: irqbalance mandatory on SMP kernels?
    ... compile your own kernel. ... utilization letting one CPU take them all. ... "Ooh, interrupts are hurting one ... Maybe the scheduler's load balancer ...
    (Linux-Kernel)
  • Re: Interrupt using all the CPU
    ... In cases where interrupts reach 25%, the load is very easily noticable, ... is false, you wouldn't be able to log in to the box, the kernel itself ... would have trouble doing something, ... Display either cpu or io statistics. ...
    (freebsd-questions)
  • Re: [parisc-linux] [patch 15/23] Add cmpxchg_local to parisc
    ... non-SMP-safe counter that protects updates against interrupts. ... I'd like to suggest "by the owner CPU". ... I always thought preemption required some sort of interrupt or trap. ... "Local atomic operations only guarantee variable modification atomicity ...
    (Linux-Kernel)
  • Re: Although CONFIG_IRQBALANCE is enabled IRQs dont seem to be balanced very well
    ... Probably kernel is optimizing this even with CONFIG option enabled. ... For a UDP bandwidth lower than 23 Mbps the interrupt rate at the receiver interface was lower than 2000 interrupts per second. ... In this case all interrupts were distributed to CPU 0. ...
    (Linux-Kernel)
  • Re: Interrupt using all the CPU
    ... Yes i suspected a bug when i first saw this because of what you say. ... 100% CPU usage should be noticed. ... In cases where interrupts reach 25%, the load is very easily noticable, ... is false, you wouldn't be able to log in to the box, the kernel itself would have trouble doing something, but interrupt handling. ...
    (freebsd-questions)