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-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html