
On Friday 20 July 2012 07:31:47 Marek Vasut wrote:
Dear Mike Frysinger,
On Saturday 07 July 2012 23:08:14 Marek Vasut wrote:
+/* DEFINE_CACHE_ALIGN_BUFFER() is similar to ALLOC_CACHE_ALIGN_BUFFER, but it's purpose is to allow allocating aligned buffers outside of function scope. Usage of this macro shall be avoided or used with extreme care! */ +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)
- static char __##name[roundup(size * sizeof(type), ARCH_DMA_MINALIGN)]
__aligned(ARCH_DMA_MINALIGN);
- static type *name = (type *)__##name;
how is this any different from doing: static __u8 foo[1234] __aligned(ARCH_DMA_MINALIGN);
Does __aligned() align both start of the buffer downwards and end of it upwards ?
it guarantees the start is aligned. i don't believe it does any tail padding.
that said, you've added just 1 consumer, but it uses in function scope, so i don't see why you had to define a new helper in the first place. the existing one would work fine shouldn't it ?
you should probably add a const to the 2nd part so gcc is more likely to optimize away the storage: static type * const name = (type *)__##name; otherwise older gcc versions will create a pointer to go through rather than having things directly access the buffer.
w/out const: $ readelf -s a.out | grep foo 11: 00000000004005d0 8 OBJECT LOCAL DEFAULT 13 foo.1592 12: 0000000000402080 96 OBJECT LOCAL DEFAULT 25 __foo.1591 w/const: $ readelf -s a.out | grep foo 11: 0000000000402080 96 OBJECT LOCAL DEFAULT 25 __foo.1591 -mike