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 <[email protected]>
---
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
On Wed, 29 Mar 2017 19:22:10 +0900 Masahiro Yamada <[email protected]> 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.
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 <[email protected]>
> ---
>
> 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
Hi.
2017-03-30 6:24 GMT+09:00 H. Peter Anvin <[email protected]>:
> 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 <[email protected]>
>> ---
>>
>> 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
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
Hi.
2017-03-30 12:29 GMT+09:00 H. Peter Anvin <[email protected]>:
> 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