On Thu, 2018-01-04 at 11:22 -0500, Neil Horman wrote: > On Thu, Jan 04, 2018 at 03:42:09PM +0000, Radu Rendec wrote: > > I believe the aligned() attribute cannot be used here because the whole > > ismt_priv structure is dynamically allocated (the allocation is done at > > the beginning of the ismt_probe() function). > > > > Even with a statically allocated structure, aligning the whole > > structure does not guarantee the alignment of the dma_buffer field, > > because the field offset within the structure can change (e.g. if other > > fields are added, removed, moved around etc.). > > For reference, you can do it like this: > > #include <stdlib.h> > #include <stdio.h> > > > struct buffer_type { char b[3]; }; > struct ubuffer_type { char b[3]; } __attribute__((aligned(16))); > > struct s1 { > char foo; > struct buffer_type bar; > }; > > struct s2 { > char foo; > struct ubuffer_type bar; > }; > > int main(int argc, char **argv) > { > struct s1 *p1; > struct s2 *p2; > > p1 = malloc(sizeof(struct s1)); > p2 = malloc(sizeof(struct s2)); > > printf("addr of p1->bar = %p\n", &p1->bar); > printf("addr of p2->bar = %p\n", &p2->bar); > > free(p1); > free(p2); > > return 0; > } Hmm... I just tried this on my workstation (x86, 32bit): [rrendec@rrendec ~]$ gcc -o align align.c [rrendec@rrendec ~]$ ./align addr of p1->bar = 0x9358009 addr of p2->bar = 0x9358028 [rrendec@rrendec ~]$ ./align addr of p1->bar = 0x856b009 addr of p2->bar = 0x856b028 The most significant 4 digits are always different (probably due to address randomization), but the least significant 3 are consistently 0x009 and 0x028, neither of which is 16 byte aligned. But I think this is normal, because malloc() gets just a size parameter and has no knowledge of the intended data type of the memory area that it allocates. It's probably the same with kmalloc() and friends. > Though as I look at that, you're probably right, using PTR_ALIGN would probably > be prettier. I'd be ok with that approach That's great. I'll prepare an updated patch with PTR_ALIGN and post it shortly. Thanks, Radu