2002-07-12 06:17:53

by Rusty Russell

[permalink] [raw]
Subject: per-cpu data...

IIUC, __per_cpu_data is insufficient for Alpha as stands, to use
thread-specific gcc tricks (__thread prepended to the decl, even
though they had a perfectly good __attribute__ extension already).

So, I guess we're stuck with something like:

DECLARE_PER_CPU(int x);

If we're going to do this, we can also mangle the name as well to
avoid accidental "direct" accesses:

eg:
#define DECLARE_PER_CPU(var)
var##__percpu __attribute__((section(".percpu")))

/* If not SMP: */
#define per_cpu(var) var##__percpu

(From my reading, ## on "int x" and "__per_cpu" is well-defined).

Thoughts?
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.


2002-07-12 08:18:48

by Richard Henderson

[permalink] [raw]
Subject: Re: per-cpu data...

On Fri, Jul 12, 2002 at 04:01:52PM +1000, Rusty Russell wrote:
> (__thread prepended to the decl, even
> though they had a perfectly good __attribute__ extension already).

Sorry, not our extension. I just copied it.

> (From my reading, ## on "int x" and "__per_cpu" is well-defined).

Yep.

> Thoughts?

Seems ok, though you really ought to differentiate between
DECLARE and DEFINE. Otherwise I can see getting screwed again.


r~

2002-07-24 12:28:44

by Jamie Lokier

[permalink] [raw]
Subject: Re: per-cpu data...

Rusty Russell wrote:
> (From my reading, ## on "int x" and "__per_cpu" is well-defined).

DECLARE_PER_CPU (int x[3]);

doesn't work, although you can always do

typedef int three_ints_t[3];
DECLARE_PER_CPU (three_ints_t x);

I encountered the same thing while doing a user-space
`MAKE_THREAD_SPECIFIC' macro. The solution I went for looks like this:

#define DECLARE_PER_CPU(type, name) \
__attribute__ ((__section (".percpu"))) __typeof__ (type) name##__per_cpu

enjoy,
-- Jamie

2002-07-25 00:36:05

by Rusty Russell

[permalink] [raw]
Subject: Re: per-cpu data...

In message <[email protected]> you write:
> Rusty Russell wrote:
> > (From my reading, ## on "int x" and "__per_cpu" is well-defined).
>
> DECLARE_PER_CPU (int x[3]);
>
> doesn't work, although you can always do
>
> typedef int three_ints_t[3];
> DECLARE_PER_CPU (three_ints_t x);
>
> I encountered the same thing while doing a user-space
> `MAKE_THREAD_SPECIFIC' macro. The solution I went for looks like this:
>
> #define DECLARE_PER_CPU(type, name) \
> __attribute__ ((__section (".percpu"))) __typeof__ (type) name##__per_cpu

Hmmm.... Yeah, might as well go the whole way.

Thanks!
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.