Skip to content

Commit 79b5dc0

Browse files
eparistorvalds
authored andcommitted
types.h: define __aligned_u64 and expose to userspace
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>
1 parent e3c6cf6 commit 79b5dc0

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

include/linux/types.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,15 @@ typedef __u64 u_int64_t;
121121
typedef __s64 int64_t;
122122
#endif
123123

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+
*/
125133
#define aligned_u64 __u64 __attribute__((aligned(8)))
126134
#define aligned_be64 __be64 __attribute__((aligned(8)))
127135
#define aligned_le64 __le64 __attribute__((aligned(8)))
@@ -178,6 +186,11 @@ typedef __u64 __bitwise __be64;
178186
typedef __u16 __bitwise __sum16;
179187
typedef __u32 __bitwise __wsum;
180188

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+
181194
#ifdef __KERNEL__
182195
typedef unsigned __bitwise__ gfp_t;
183196
typedef unsigned __bitwise__ fmode_t;

0 commit comments

Comments
 (0)