linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH 1/7] 2 1-byte checks more safer for memory_is_poisoned_16
@ 2018-03-19  1:02 Liuwenliang (Abbott Liu)
  0 siblings, 0 replies; 3+ messages in thread
From: Liuwenliang (Abbott Liu) @ 2018-03-19  1:02 UTC (permalink / raw)
  To: Russell King - ARM Linux
  Cc: aryabinin, marc.zyngier, kstewart, gregkh, f.fainelli, akpm,
	afzal.mohd.ma, alexander.levin, glider, dvyukov,
	christoffer.dall, linux, mawilcox, pombredanne, ard.biesheuvel,
	vladimir.murzin, nicolas.pitre, tglx, thgarnie, dhowells,
	keescook, arnd, geert, tixy, mark.rutland, james.morse,
	zhichao.huang, jinb.park7, labbott, philip, grygorii.strashko,
	catalin.marinas, opendmb, kirill.shutemov, linux-arm-kernel,
	linux-kernel, kasan-dev, kvmarm, linux-mm

On Sun, Mar 18, 2018 at 21:21:20PM +0800, Russell King wrote:
>On Sun, Mar 18, 2018 at 08:53:36PM +0800, Abbott Liu wrote:
>> Because in some architecture(eg. arm) instruction set, non-aligned
>> access support is not very well, so 2 1-byte checks is more
>> safer than 1 2-byte check. The impact on performance is small
>> because 16-byte accesses are not too common.
>
>This is unnecessary:
>
>1. a load of a 16-bit quantity will work as desired on modern ARMs.
>2. Networking already relies on unaligned loads to work as per x86
>   (iow, an unaligned 32-bit load loads the 32-bits at the address
>   even if it's not naturally aligned, and that also goes for 16-bit
>   accesses.)
>
>If these are rare (which you say above - "not too common") then it's
>much better to leave the code as-is, because it will most likely be
>faster on modern CPUs, and the impact for older generation CPUs is
>likely to be low.

Thanks for your review.
OK, I am going to remove this patch in the next version.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/7] 2 1-byte checks more safer for memory_is_poisoned_16
  2018-03-18 12:53 ` [PATCH 1/7] 2 1-byte checks more safer for memory_is_poisoned_16 Abbott Liu
@ 2018-03-18 13:21   ` Russell King - ARM Linux
  0 siblings, 0 replies; 3+ messages in thread
From: Russell King - ARM Linux @ 2018-03-18 13:21 UTC (permalink / raw)
  To: Abbott Liu
  Cc: aryabinin, marc.zyngier, kstewart, gregkh, f.fainelli, akpm,
	afzal.mohd.ma, alexander.levin, glider, dvyukov,
	christoffer.dall, linux, mawilcox, pombredanne, ard.biesheuvel,
	vladimir.murzin, nicolas.pitre, tglx, thgarnie, dhowells,
	keescook, arnd, geert, tixy, mark.rutland, james.morse,
	zhichao.huang, jinb.park7, labbott, philip, grygorii.strashko,
	catalin.marinas, opendmb, kirill.shutemov, linux-arm-kernel,
	linux-kernel, kasan-dev, kvmarm, linux-mm

On Sun, Mar 18, 2018 at 08:53:36PM +0800, Abbott Liu wrote:
> Because in some architecture(eg. arm) instruction set, non-aligned
> access support is not very well, so 2 1-byte checks is more
> safer than 1 2-byte check. The impact on performance is small
> because 16-byte accesses are not too common.

This is unnecessary:

1. a load of a 16-bit quantity will work as desired on modern ARMs.
2. Networking already relies on unaligned loads to work as per x86
   (iow, an unaligned 32-bit load loads the 32-bits at the address
   even if it's not naturally aligned, and that also goes for 16-bit
   accesses.)

If these are rare (which you say above - "not too common") then it's
much better to leave the code as-is, because it will most likely be
faster on modern CPUs, and the impact for older generation CPUs is
likely to be low.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line in suburbia: sync at 8.8Mbps down 630kbps up
According to speedtest.net: 8.21Mbps down 510kbps up

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/7] 2 1-byte checks more safer for memory_is_poisoned_16
  2018-03-18 12:53 [PATCH v2 0/7] KASan for arm Abbott Liu
@ 2018-03-18 12:53 ` Abbott Liu
  2018-03-18 13:21   ` Russell King - ARM Linux
  0 siblings, 1 reply; 3+ messages in thread
From: Abbott Liu @ 2018-03-18 12:53 UTC (permalink / raw)
  To: linux, aryabinin, marc.zyngier, kstewart, gregkh, f.fainelli,
	liuwenliang, akpm, afzal.mohd.ma, alexander.levin
  Cc: glider, dvyukov, christoffer.dall, linux, mawilcox, pombredanne,
	ard.biesheuvel, vladimir.murzin, nicolas.pitre, tglx, thgarnie,
	dhowells, keescook, arnd, geert, tixy, mark.rutland, james.morse,
	zhichao.huang, jinb.park7, labbott, philip, grygorii.strashko,
	catalin.marinas, opendmb, kirill.shutemov, linux-arm-kernel,
	linux-kernel, kasan-dev, kvmarm, linux-mm

Because in some architecture(eg. arm) instruction set, non-aligned
access support is not very well, so 2 1-byte checks is more
safer than 1 2-byte check. The impact on performance is small
because 16-byte accesses are not too common.

Cc: Andrey Ryabinin <a.ryabinin@samsung.com>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Russell King - ARM Linux <linux@armlinux.org.uk>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Acked-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Abbott Liu <liuwenliang@huawei.com>
---
 mm/kasan/kasan.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c
index e13d911..104839a 100644
--- a/mm/kasan/kasan.c
+++ b/mm/kasan/kasan.c
@@ -151,13 +151,20 @@ static __always_inline bool memory_is_poisoned_2_4_8(unsigned long addr,
 
 static __always_inline bool memory_is_poisoned_16(unsigned long addr)
 {
-	u16 *shadow_addr = (u16 *)kasan_mem_to_shadow((void *)addr);
-
-	/* Unaligned 16-bytes access maps into 3 shadow bytes. */
-	if (unlikely(!IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE)))
-		return *shadow_addr || memory_is_poisoned_1(addr + 15);
+	u8 *shadow_addr = (u8 *)kasan_mem_to_shadow((void *)addr);
 
-	return *shadow_addr;
+	if (unlikely(shadow_addr[0] || shadow_addr[1])) {
+		return true;
+	} else if (likely(IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE))) {
+		/*
+		 * If two shadow bytes covers 16-byte access, we don't
+		 * need to do anything more. Otherwise, test the last
+		 * shadow byte.
+		 */
+		return false;
+	} else {
+		return memory_is_poisoned_1(addr + 15);
+	}
 }
 
 static __always_inline unsigned long bytes_is_nonzero(const u8 *start,
-- 
2.9.0

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-03-19  1:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-19  1:02 [PATCH 1/7] 2 1-byte checks more safer for memory_is_poisoned_16 Liuwenliang (Abbott Liu)
  -- strict thread matches above, loose matches on Subject: below --
2018-03-18 12:53 [PATCH v2 0/7] KASan for arm Abbott Liu
2018-03-18 12:53 ` [PATCH 1/7] 2 1-byte checks more safer for memory_is_poisoned_16 Abbott Liu
2018-03-18 13:21   ` Russell King - ARM Linux

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox