Skip to contentSkip to conversation

kasan: use IS_ALIGNED in memory_is_poisoned_8()

PATCH Superseded Xishi Qiu 2 participants 4 messages Sep 14, 2015 – Sep 15, 2015

Subsystems (2)
lore
Share & tools
lore

Xishi Qiu

author
#0 lore raw

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
index 8da2114..00d5605 100644
@@ -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
maintainer
#1 lore raw

2015-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.

---
 mm/kasan/kasan.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)
mm/kasan/kasan.c +0 -0
index 8da2114..00d5605 100644

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>

author
#2 lore raw

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
index 8da2114..d0a3af8 100644
@@ -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
maintainer Acked-by on v3 1/1
#3 lore raw
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.

--
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>