We currently have a kernel internal type called aligned_u64 which aligns __u64's on 8 bytes boundaries even on systems which would normally align them on 4 byte boundaries. This patch creates a new type __aligned_u64 which does the same thing but which is exposed to userspace rather than being kernel internal. [akpm: merge early as both the net and audit trees want this] [akpm@linux-foundation.org: enhance the comment describing the reasons for using aligned_u64. Via Andreas and Andi.] Based-on-patch-by: Andreas Gruenbacher <agruen@suse.de> Signed-off-by: Eric Paris <eparis@redhat.com> Cc: Jan Engelhardt <jengelh@medozas.de> Cc: David Miller <davem@davemloft.net> Cc: Andi Kleen <andi@firstfloor.org> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing the changes to include/linux (1 of 1 file). Show all
Unified · Split
| @@ -121,7 +121,15 @@ typedef __u64 u_int64_t; · 120 unmodified lines | ||
| 121 | 121 | typedef __s64 int64_t; |
| 122 | 122 | #endif |
| 123 | 123 | |
| 124 | −/* this is a special 64bit data type that is 8-byte aligned */ | |
| 124 | +/* | |
| 125 | + * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid | |
| 126 | + * common 32/64-bit compat problems. | |
| 127 | + * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other | |
| 128 | + * architectures) and to 8-byte boundaries on 64-bit architetures. The new | |
| 129 | + * aligned_64 type enforces 8-byte alignment so that structs containing | |
| 130 | + * aligned_64 values have the same alignment on 32-bit and 64-bit architectures. | |
| 131 | + * No conversions are necessary between 32-bit user-space and a 64-bit kernel. | |
| 132 | + */ | |
| 125 | 133 | #define aligned_u64 __u64 __attribute__((aligned(8))) |
| 126 | 134 | #define aligned_be64 __be64 __attribute__((aligned(8))) |
| 127 | 135 | #define aligned_le64 __le64 __attribute__((aligned(8))) |
| @@ -178,6 +186,11 @@ typedef __u64 __bitwise __be64; · 50 unmodified lines | ||
| 178 | 186 | typedef __u16 __bitwise __sum16; |
| 179 | 187 | typedef __u32 __bitwise __wsum; |
| 180 | 188 | |
| 189 | +/* this is a special 64bit data type that is 8-byte aligned */ | |
| 190 | +#define __aligned_u64 __u64 __attribute__((aligned(8))) | |
| 191 | +#define __aligned_be64 __be64 __attribute__((aligned(8))) | |
| 192 | +#define __aligned_le64 __le64 __attribute__((aligned(8))) | |
| 193 | + | |
| 181 | 194 | #ifdef __KERNEL__ |
| 182 | 195 | typedef unsigned __bitwise__ gfp_t; |
| 183 | 196 | typedef unsigned __bitwise__ fmode_t; |