kasan: use IS_ALIGNED in memory_is_poisoned_8()
Subsystems (2)
PATCH 1/1 kasan: use IS_ALIGNED in memory_is_poisoned_8()
Use IS_ALIGNED() to determine whether the shadow span two bytes. It generates less code and more readable.
--- mm/kasan/kasan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/kasan/kasan.c +1 -1
@@ -120,7 +120,7 @@ static __always_inline bool memory_is_poisoned_8(unsigned long addr)if (memory_is_poisoned_1 (addr +7 ))return true; -if (likely (((addr +7 ) &KASAN_SHADOW_MASK ) >=7 )) +if (likely (IS_ALIGNED (addr,8 )))return false;return unlikely (*(u8 *)shadow_addr);
Signature · 1 line
2.0.0
Andrew Morton
maintainerQuoted 3 lines · On Fri, 11 Sep 2015 10:02:29 +0800 Xishi Qiu <[email protected]> wrote:
Use
IS_ALIGNED()to determine whether the shadow span two bytes. It generates less code and more readable.
Please cc Andrey Ryabinin on kasan patches.
mm/kasan/kasan.c static __always_inline bool memory_is_poisoned_8(unsigned long addr) · line 124
Quoted 9 lines
mm/kasan/kasan.c +1
-1@@ -120,7 +120,7 @@ static __always_inline bool memory_is_poisoned_8(unsigned long addr)if (memory_is_poisoned_1 (addr +7 ))return true; -if (likely (((addr +7 ) &KASAN_SHADOW_MASK ) >=7 )) +if (likely (IS_ALIGNED (addr,8 )))return false;
Wouldn't IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE) be more appropriate?
But I'm not really sure what the original code is trying to do.
if ((addr + 7) & 7) >= 7)
can only evaluate true if ((addr + 7) & 7) equals 7, so the ">=" could be "==".
I think. The code looks a bit weird. A code comment would help.
And how come memory_is_poisoned_16() does IS_ALIGNED(addr, 8)? Should it be 16?
Quoted 7 lines · Andrew Morton
Quoted 3 lines · On Fri, 11 Sep 2015 10:02:29 +0800 Xishi Qiu <[email protected]> wrote:
Use
IS_ALIGNED()to determine whether the shadow span two bytes. It generates less code and more readable.Please cc Andrey Ryabinin on kasan patches.
Sorry, my mistake.
Quoted 7 lines
Quoted 7 lines
mm/kasan/kasan.c +0
-0@@ -120,7 +120,7 @@ static __always_inline bool memory_is_poisoned_8(unsigned long addr)if (memory_is_poisoned_1 (addr +7 ))return true;
Quoted 6 lines
mm/kasan/kasan.c static __always_inline bool memory_is_poisoned_8(unsigned long addr) · line 124
Quoted 3 lines
mm/kasan/kasan.c +1
-1-if (likely (((addr +7 ) &KASAN_SHADOW_MASK ) >=7 )) +if (likely (IS_ALIGNED (addr,8 )))return false;Wouldn't
IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE)be more appropriate?
OK, I'll send V2.
Quoted 7 lines
But I'm not really sure what the original code is trying to do.
if ((addr + 7) & 7) >= 7)can only evaluate true if ((addr + 7) & 7) equals 7, so the ">=" could be "==".
I think it should be "==", the value will not "> 7"
Quoted 4 lines
I think. The code looks a bit weird. A code comment would help.
And how come
memory_is_poisoned_16()doesIS_ALIGNED(addr, 8)? Should it be 16?
No, it is to determine whether the shadow span two bytes(8 bytes, not 16).
Thanks,
Xishi Qiu
Quoted 4 lines
.
Andrey Ryabinin
maintainer2015-09-12 1:47 GMT+03:00 Andrew Morton <[email protected]>:
Quoted 9 lines · On Fri, 11 Sep 2015 10:02:29 +0800 Xishi Qiu <[email protected]> wrote:
mm/kasan/kasan.c static __always_inline bool memory_is_poisoned_8(unsigned long addr) · line 124
Quoted 3 lines
mm/kasan/kasan.c +1
-1-if (likely (((addr +7 ) &KASAN_SHADOW_MASK ) >=7 )) +if (likely (IS_ALIGNED (addr,8 )))return false;Wouldn't
IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE)be more appropriate?But I'm not really sure what the original code is trying to do.
Original code is trying to estimate whether we should check 2 shadow bytes or just 1 should be enough.
Quoted 5 lines
if ((addr + 7) & 7) >= 7)can only evaluate true if ((addr + 7) & 7) equals 7, so the ">=" could be "==".
Yes, it could be "==".
">=" is just for consistency with similar code in memory_is_poisoned_2/4.
If I'm not mistaken generic formula for such check looks like this:
((addr + size - 1) & KASAN_SHADOW_MASK) >= ((size - 1) &
KASAN_SHADOW_MASK)
But when size >= KASAN_SHADOW_SCALE_SIZE we could just check for alignment.
Quoted 5 lines
I think. The code looks a bit weird. A code comment would help.
And how come
memory_is_poisoned_16()doesIS_ALIGNED(addr, 8)? Should it be 16?
No, If 16 bytes are 8-byte aligned, then shadow is 2-bytes.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>