On 03/29/17 03:22, Masahiro Yamada wrote: > We often check if a pointer has a specific alignment. Because the > '&' (bitwise AND) operator cannot take a pointer for the operand, > so we need a cast like, IS_ALIGNED((unsigned long)p, a). > > IS_PTR_ALIGNED will be useful as a shorthand. > > Signed-off-by: Masahiro Yamada <yamada.masah...@socionext.com> > --- > > include/linux/kernel.h | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/include/linux/kernel.h b/include/linux/kernel.h > index e5edd55..a810e4b 100644 > --- a/include/linux/kernel.h > +++ b/include/linux/kernel.h > @@ -50,6 +50,7 @@ > #define __ALIGN_MASK(x, mask) __ALIGN_KERNEL_MASK((x), (mask)) > #define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), > (a))) > #define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0) > +#define IS_PTR_ALIGNED(p, a) (IS_ALIGNED((unsigned long)p, a)) >
No need for two macros; make one work for both. You could move the __inttype() macro from arch/x86/include/asm/uaccess.h into this file and replace typeof(x) with __inttype(x) in the above macro. Attached is a set of slightly improved (safer and a bit more generalized) versions of the same macro that might be more appropriate to include in <linux/kernel.h>. -hpa
/* * These are types: corresponding to the smallest unsigned/signed * integer type no smaller than int or long, respectively, capable of * holding the argument (which can be anything that can be validly * passed to sizeof().) * * If the size is too large even for a long long, they return an * unnamed structure type with the right sizeof(), which if used for a * cast will generate the error message: * * error: conversion to non-scalar type requested */ #define __uinttype(x) \ __typeof__(__builtin_choose_expr(sizeof(x) <= sizeof(0U), 0U, \ __builtin_choose_expr(sizeof(x) <= sizeof(0UL), 0UL, \ __builtin_choose_expr(sizeof(x) <= sizeof(0ULL), 0ULL, \ ({ struct { unsigned char __bad[sizeof(x)]; } __bad = {{0}}; \ __bad; }))))) #define __sinttype(x) \ __typeof__(__builtin_choose_expr(sizeof(x) <= sizeof(0), 0, \ __builtin_choose_expr(sizeof(x) <= sizeof(0L), 0L, \ __builtin_choose_expr(sizeof(x) <= sizeof(0LL), 0LL, \ ({ struct { signed char __bad[sizeof(x)]; } __bad = {{0}}; \ __bad; }))))) #define __ulongtype(x) \ __typeof__(__builtin_choose_expr(sizeof(x) <= sizeof(0UL), 0UL, \ __builtin_choose_expr(sizeof(x) <= sizeof(0ULL), 0ULL, \ ({ struct { unsigned char __bad[sizeof(x)]; } __bad = {{0}}; \ __bad; })))) #define __slongtype(x) \ __typeof__(__builtin_choose_expr(sizeof(x) <= sizeof(0L), 0L, \ __builtin_choose_expr(sizeof(x) <= sizeof(0LL), 0LL, \ ({ struct { signed char __bad[sizeof(x)]; } __bad = {{0}}; \ __bad; })))))