Commit 10f70262 authored by Xishi Qiu's avatar Xishi Qiu Committed by Linus Torvalds

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.  Also add some comments in shadow
check functions.
Signed-off-by: default avatarXishi Qiu <qiuxishi@huawei.com>
Acked-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Andrey Konovalov <adech.fo@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e0d57714
...@@ -86,6 +86,11 @@ static __always_inline bool memory_is_poisoned_2(unsigned long addr) ...@@ -86,6 +86,11 @@ static __always_inline bool memory_is_poisoned_2(unsigned long addr)
if (memory_is_poisoned_1(addr + 1)) if (memory_is_poisoned_1(addr + 1))
return true; return true;
/*
* If single shadow byte covers 2-byte access, we don't
* need to do anything more. Otherwise, test the first
* shadow byte.
*/
if (likely(((addr + 1) & KASAN_SHADOW_MASK) != 0)) if (likely(((addr + 1) & KASAN_SHADOW_MASK) != 0))
return false; return false;
...@@ -103,6 +108,11 @@ static __always_inline bool memory_is_poisoned_4(unsigned long addr) ...@@ -103,6 +108,11 @@ static __always_inline bool memory_is_poisoned_4(unsigned long addr)
if (memory_is_poisoned_1(addr + 3)) if (memory_is_poisoned_1(addr + 3))
return true; return true;
/*
* If single shadow byte covers 4-byte access, we don't
* need to do anything more. Otherwise, test the first
* shadow byte.
*/
if (likely(((addr + 3) & KASAN_SHADOW_MASK) >= 3)) if (likely(((addr + 3) & KASAN_SHADOW_MASK) >= 3))
return false; return false;
...@@ -120,7 +130,12 @@ static __always_inline bool memory_is_poisoned_8(unsigned long addr) ...@@ -120,7 +130,12 @@ static __always_inline bool memory_is_poisoned_8(unsigned long addr)
if (memory_is_poisoned_1(addr + 7)) if (memory_is_poisoned_1(addr + 7))
return true; return true;
if (likely(((addr + 7) & KASAN_SHADOW_MASK) >= 7)) /*
* If single shadow byte covers 8-byte access, we don't
* need to do anything more. Otherwise, test the first
* shadow byte.
*/
if (likely(IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE)))
return false; return false;
return unlikely(*(u8 *)shadow_addr); return unlikely(*(u8 *)shadow_addr);
...@@ -139,7 +154,12 @@ static __always_inline bool memory_is_poisoned_16(unsigned long addr) ...@@ -139,7 +154,12 @@ static __always_inline bool memory_is_poisoned_16(unsigned long addr)
if (unlikely(shadow_first_bytes)) if (unlikely(shadow_first_bytes))
return true; return true;
if (likely(IS_ALIGNED(addr, 8))) /*
* If two shadow bytes covers 16-byte access, we don't
* need to do anything more. Otherwise, test the last
* shadow byte.
*/
if (likely(IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE)))
return false; return false;
return memory_is_poisoned_1(addr + 15); return memory_is_poisoned_1(addr + 15);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment