kasan: use IS_ALIGNED in memory_is_poisoned_8()
Subsystems (2)
PATCH v2 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. Add some comments in shadow check functions.
Please apply "kasan: fix last shadow judgement in memory_is_poisoned_16()" first.
--- mm/kasan/kasan.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
mm/kasan/kasan.c +19 -2
@@ -86,6 +86,10 @@ static __always_inline bool memory_is_poisoned_2(unsigned long addr)if (memory_is_poisoned_1 (addr +1 ))return true; +/* +* If the shadow spans two bytes, the first byte should +* be zero. +*/ if (likely (((addr +1 ) &KASAN_SHADOW_MASK ) !=0 ))return false;
@@ -103,6 +107,10 @@ static __always_inline bool memory_is_poisoned_4(unsigned long addr)if (memory_is_poisoned_1 (addr +3 ))return true; +/* +* If the shadow spans two bytes, the first byte should +* be zero. +*/ if (likely (((addr +3 ) &KASAN_SHADOW_MASK ) >=3 ))return false;
@@ -120,7 +128,11 @@ 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 the shadow spans two bytes, the first byte should +* be zero. +*/ +if (likely (IS_ALIGNED (addr,KASAN_SHADOW_SCALE_SIZE )))return false;return unlikely (*(u8 *)shadow_addr);
@@ -139,7 +151,12 @@ static __always_inline bool memory_is_poisoned_16(unsigned long addr)if (unlikely (shadow_first_bytes))return true; -if (likely (IS_ALIGNED (addr,8 ))) +/* +* If the shadow spans three bytes, we should continue to +* check the last byte. The first two bytes which we +* checked above should always be zero. +*/ +if (likely (IS_ALIGNED (addr,KASAN_SHADOW_SCALE_SIZE )))return false;return memory_is_poisoned_1 (addr +15 );
Signature · 1 line
2.0.0
Andrey Ryabinin
maintainer2015-09-14 5:09 GMT+03:00 Xishi Qiu <[email protected]>:
Quoted 17 lines
Use
IS_ALIGNED()to determine whether the shadow span two bytes. It generates less code and more readable. Add some comments in shadow check functions.Please apply "kasan: fix last shadow judgement in
memory_is_poisoned_16()" first.Signed-off-by Xishi Qiu <[email protected]>--- mm/kasan/kasan.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)mm/kasan/kasan.c +0
-0
mm/kasan/kasan.c static __always_inline bool memory_is_poisoned_2(unsigned long addr) · line 91
Quoted 6 lines
mm/kasan/kasan.c +3
-0@@ -86,6 +86,10 @@ static __always_inline bool memory_is_poisoned_2(unsigned long addr)if (memory_is_poisoned_1 (addr +1 ))return true; +/* +* If the shadow spans two bytes, the first byte should +* be zero.
Hmm.. I found this comment a bit odd.
How about this:
/*
* If single shadow byte covers 2-byte access,
* we don't need to do anything more.
* Otherwise, test the first shadow byte.
*/
?
--
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>
PATCH v3 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. Also add some comments in shadow check functions.
Please apply "kasan: fix last shadow judgement in memory_is_poisoned_16()" first.
--- mm/kasan/kasan.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)
mm/kasan/kasan.c +22 -2
@@ -86,6 +86,11 @@ static __always_inline bool memory_is_poisoned_2(unsigned long addr)if (memory_is_poisoned_1 (addr +1 ))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 ))return false;
@@ -103,6 +108,11 @@ static __always_inline bool memory_is_poisoned_4(unsigned long addr)if (memory_is_poisoned_1 (addr +3 ))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 ))return false;
@@ -120,7 +130,12 @@ 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 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 unlikely (*(u8 *)shadow_addr);
@@ -139,7 +154,12 @@ static __always_inline bool memory_is_poisoned_16(unsigned long addr)if (unlikely (shadow_first_bytes))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 memory_is_poisoned_1 (addr +15 );
Signature · 1 line
2.0.0
Quoted 8 lines · Xishi Qiu
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.Please apply "kasan: fix last shadow judgement in
memory_is_poisoned_16()" first.Signed-off-by Xishi Qiu <[email protected]>
--
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>