* [PATCH] kernel.h: add IS_PTR_ALIGNED() macro @ 2017-03-29 10:22 Masahiro Yamada 2017-03-29 21:24 ` H. Peter Anvin 2017-03-29 21:36 ` Andrew Morton 0 siblings, 2 replies; 6+ messages in thread From: Masahiro Yamada @ 2017-03-29 10:22 UTC (permalink / raw) To: Andrew Morton Cc: Masahiro Yamada, Niklas Söderlund, Jessica Yu, Johannes Berg, Petr Mladek, Larry Finger, linux-kernel, Gustavo Padovan, Rasmus Villemoes, Peter Zijlstra, Luis de Bethencourt, Josh Triplett 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.masahiro@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)) /* generic data direction definitions */ #define READ 0 -- 2.7.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro 2017-03-29 10:22 [PATCH] kernel.h: add IS_PTR_ALIGNED() macro Masahiro Yamada @ 2017-03-29 21:24 ` H. Peter Anvin 2017-03-30 1:57 ` Masahiro Yamada 2017-03-29 21:36 ` Andrew Morton 1 sibling, 1 reply; 6+ messages in thread From: H. Peter Anvin @ 2017-03-29 21:24 UTC (permalink / raw) To: Masahiro Yamada, Andrew Morton Cc: Niklas Söderlund, Jessica Yu, Johannes Berg, Petr Mladek, Larry Finger, linux-kernel, Gustavo Padovan, Rasmus Villemoes, Peter Zijlstra, Luis de Bethencourt, Josh Triplett [-- Attachment #1: Type: text/plain, Size: 1256 bytes --] 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.masahiro@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 [-- Attachment #2: uinttype.c --] [-- Type: text/plain, Size: 1602 bytes --] /* * 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; }))))) ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro 2017-03-29 21:24 ` H. Peter Anvin @ 2017-03-30 1:57 ` Masahiro Yamada 2017-03-30 3:29 ` H. Peter Anvin 0 siblings, 1 reply; 6+ messages in thread From: Masahiro Yamada @ 2017-03-30 1:57 UTC (permalink / raw) To: H. Peter Anvin Cc: Andrew Morton, Niklas Söderlund, Jessica Yu, Johannes Berg, Petr Mladek, Larry Finger, Linux Kernel Mailing List, Gustavo Padovan, Rasmus Villemoes, Peter Zijlstra, Luis de Bethencourt, Josh Triplett Hi. 2017-03-30 6:24 GMT+09:00 H. Peter Anvin <hpa@zytor.com>: > 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.masahiro@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 Could you care to send a patch? Perhaps, ALIGN and PTR_ALIGN can be merged as well? -- Best Regards Masahiro Yamada ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro 2017-03-30 1:57 ` Masahiro Yamada @ 2017-03-30 3:29 ` H. Peter Anvin 2017-03-30 15:22 ` Masahiro Yamada 0 siblings, 1 reply; 6+ messages in thread From: H. Peter Anvin @ 2017-03-30 3:29 UTC (permalink / raw) To: Masahiro Yamada Cc: Andrew Morton, Niklas Söderlund, Jessica Yu, Johannes Berg, Petr Mladek, Larry Finger, Linux Kernel Mailing List, Gustavo Padovan, Rasmus Villemoes, Peter Zijlstra, Luis de Bethencourt, Josh Triplett On 03/29/17 18:57, Masahiro Yamada wrote: > > Could you care to send a patch? > > Perhaps, ALIGN and PTR_ALIGN can be merged as well? > Can't promise when I'd get around to it... -hpa ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro 2017-03-30 3:29 ` H. Peter Anvin @ 2017-03-30 15:22 ` Masahiro Yamada 0 siblings, 0 replies; 6+ messages in thread From: Masahiro Yamada @ 2017-03-30 15:22 UTC (permalink / raw) To: H. Peter Anvin, Andrew Morton Cc: Niklas Söderlund, Jessica Yu, Johannes Berg, Petr Mladek, Larry Finger, Linux Kernel Mailing List, Gustavo Padovan, Rasmus Villemoes, Peter Zijlstra, Luis de Bethencourt, Josh Triplett Hi. 2017-03-30 12:29 GMT+09:00 H. Peter Anvin <hpa@zytor.com>: > On 03/29/17 18:57, Masahiro Yamada wrote: >> >> Could you care to send a patch? >> >> Perhaps, ALIGN and PTR_ALIGN can be merged as well? >> > > Can't promise when I'd get around to it... > > -hpa OK. No need to rush now. Please take a look when you find some time. Andrew, Maybe, we should drop my patch for now, and take our time for better implementation? -- Best Regards Masahiro Yamada ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro 2017-03-29 10:22 [PATCH] kernel.h: add IS_PTR_ALIGNED() macro Masahiro Yamada 2017-03-29 21:24 ` H. Peter Anvin @ 2017-03-29 21:36 ` Andrew Morton 1 sibling, 0 replies; 6+ messages in thread From: Andrew Morton @ 2017-03-29 21:36 UTC (permalink / raw) To: Masahiro Yamada Cc: Niklas Söderlund, Jessica Yu, Johannes Berg, Petr Mladek, Larry Finger, linux-kernel, Gustavo Padovan, Rasmus Villemoes, Peter Zijlstra, Luis de Bethencourt, Josh Triplett On Wed, 29 Mar 2017 19:22:10 +0900 Masahiro Yamada <yamada.masahiro@socionext.com> 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. > > ... > > --- 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)) > > /* generic data direction definitions */ > #define READ 0 It would be nice to see some conversions which actually use this new macro. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-03-30 15:23 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-03-29 10:22 [PATCH] kernel.h: add IS_PTR_ALIGNED() macro Masahiro Yamada 2017-03-29 21:24 ` H. Peter Anvin 2017-03-30 1:57 ` Masahiro Yamada 2017-03-30 3:29 ` H. Peter Anvin 2017-03-30 15:22 ` Masahiro Yamada 2017-03-29 21:36 ` Andrew Morton
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®