Dmitry Torokhov <dtor@xxxxxxxxxx> writes:
But why is it aligned on 2-byte boundary and why m64k is not happy with module_version_attribute but is happy with kernel_param which is also aligned similarly?
struct kernel_parm doesn't contain internal padding on 32 bit architectures (it does on 64bit architectures though).
If we unroll module_version_attribute it woud look like this: struct module_version_attribute { struct module_attribute { struct attribute { const char *name; mode_t mode; } attr; ... } mattr; const char *module_name; const char *version; }; So I would expect it be aligned on (char *) boundary which should be the same as (void *).
mode_t is a 16 bit type, thus any following member becomes aligned on an odd 2 byte boundary. On 32bit architectures with 4 byte alignment and 16 bit mode_t struct attribute contains 2 bytes of internal padding. (64bit architectures typically have a 32bit mode_t, and there are 4 bytes of padding.)
Will it help if we rearrange module_version_attribute definition to explicitly have first field being a pointer so it is more like kernel_param, like this: struct module_version_attribute { const char *module_name; const char *version; struct module_attribute mattr; };
That won't change the total size of the structure. Andreas. -- Andreas Schwab, schwab@xxxxxxxxxxxxxx GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." -- To unsubscribe from this list: send the line "unsubscribe linux-m68k" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html