2017-03-29 10:24:26

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro

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


2017-03-29 21:37:01

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro

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.

2017-03-29 21:38:57

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() 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


Attachments:
uinttype.c (1.56 kB)

2017-03-30 01:57:35

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro

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

2017-03-30 03:43:31

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro

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


2017-03-30 15:23:13

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH] kernel.h: add IS_PTR_ALIGNED() macro

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