[PATCH] powerpc/64: Fix checksum folding in csum_add

Subsystems: linux for powerpc (32-bit and 64-bit), the rest

STALE3053d

6 messages, 4 authors, 2018-03-29 · open the first message on its own page

[PATCH] powerpc/64: Fix checksum folding in csum_add

From: Shile Zhang <hidden>
Date: 2017-02-04 09:04:08

fix the missed point in Paul's patch:
"powerpc/64: Fix checksum folding in csum_tcpudp_nofold and
ip_fast_csum_nofold"

Signed-off-by: Shile Zhang <redacted>
---
 arch/powerpc/include/asm/checksum.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/powerpc/include/asm/checksum.h b/arch/powerpc/include/asm/checksum.h
index 5b1a6e3..430d038 100644
--- a/arch/powerpc/include/asm/checksum.h
+++ b/arch/powerpc/include/asm/checksum.h
@@ -108,7 +108,7 @@ static inline __wsum csum_add(__wsum csum, __wsum addend)
 
 #ifdef __powerpc64__
 	res += (__force u64)addend;
-	return (__force __wsum)((u32)res + (res >> 32));
+	return (__force __wsum) from64to32(res);
 #else
 	asm("addc %0,%0,%1;"
 	    "addze %0,%0;"
-- 
2.6.2

Re: [PATCH] powerpc/64: Fix checksum folding in csum_add

From: Paul Mackerras <hidden>
Date: 2017-03-03 03:50:42

On Sat, Feb 04, 2017 at 05:03:40PM +0800, Shile Zhang wrote:
fix the missed point in Paul's patch:
"powerpc/64: Fix checksum folding in csum_tcpudp_nofold and
ip_fast_csum_nofold"

Signed-off-by: Shile Zhang <redacted>
Acked-by: Paul Mackerras <redacted>

Re: powerpc/64: Fix checksum folding in csum_add

From: Michael Ellerman <hidden>
Date: 2017-03-08 07:25:47

On Sat, 2017-02-04 at 09:03:40 UTC, Shile Zhang wrote:
fix the missed point in Paul's patch:
"powerpc/64: Fix checksum folding in csum_tcpudp_nofold and
ip_fast_csum_nofold"

Signed-off-by: Shile Zhang <redacted>
Acked-by: Paul Mackerras <redacted>
Applied to powerpc fixes, thanks.

https://git.kernel.org/powerpc/c/6ad966d7303b70165228dba1ee8da1

cheers

Re: [PATCH] powerpc/64: Fix checksum folding in csum_add

From: LEROY Christophe <hidden>
Date: 2018-03-27 15:22:51

Shile Zhang [off-list ref] a =C3=A9crit=C2=A0:
quoted hunk
fix the missed point in Paul's patch:
"powerpc/64: Fix checksum folding in csum_tcpudp_nofold and
ip_fast_csum_nofold"

Signed-off-by: Shile Zhang <redacted>
---
 arch/powerpc/include/asm/checksum.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/powerpc/include/asm/checksum.h=20=20
=20b/arch/powerpc/include/asm/checksum.h
index 5b1a6e3..430d038 100644
--- a/arch/powerpc/include/asm/checksum.h
+++ b/arch/powerpc/include/asm/checksum.h
@@ -108,7 +108,7 @@ static inline __wsum csum_add(__wsum csum, __wsum add=
end)
 #ifdef __powerpc64__
 	res +=3D (__force u64)addend;
-	return (__force __wsum)((u32)res + (res >> 32));
+	return (__force __wsum) from64to32(res);
Did you encounter a bug due to that ?
As far as i understand, csum and addend are 32 bits so can't exceed 0xfffff=
fff
Then their sum won't exceed 0x1fffffffe. So the sum of upper and lower=20=
=20
part=20won't carry

Christophe
 #else
 	asm("addc %0,%0,%1;"
 	    "addze %0,%0;"
--
2.6.2

Re: [PATCH] powerpc/64: Fix checksum folding in csum_add

From: Paul Mackerras <hidden>
Date: 2018-03-28 20:40:31

On Tue, Mar 27, 2018 at 05:22:32PM +0200, LEROY Christophe wrote:
Shile Zhang [off-list ref] a écrit :
quoted
fix the missed point in Paul's patch:
"powerpc/64: Fix checksum folding in csum_tcpudp_nofold and
ip_fast_csum_nofold"

Signed-off-by: Shile Zhang <redacted>
---
arch/powerpc/include/asm/checksum.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/powerpc/include/asm/checksum.h
b/arch/powerpc/include/asm/checksum.h
index 5b1a6e3..430d038 100644
--- a/arch/powerpc/include/asm/checksum.h
+++ b/arch/powerpc/include/asm/checksum.h
@@ -108,7 +108,7 @@ static inline __wsum csum_add(__wsum csum, __wsum addend)
#ifdef __powerpc64__
	res += (__force u64)addend;
-	return (__force __wsum)((u32)res + (res >> 32));
+	return (__force __wsum) from64to32(res);
Did you encounter a bug due to that ?
As far as i understand, csum and addend are 32 bits so can't exceed 0xffffffff
Then their sum won't exceed 0x1fffffffe. So the sum of upper and lower part
won't carry
If the sum of the two halves was 0x1fffffffe, then that previously got
truncated to 32 bits and returned as 0xfffffffe, which is wrong - the
result should be 0xffffffff.

Paul.

Re: [PATCH] powerpc/64: Fix checksum folding in csum_add

From: LEROY Christophe <hidden>
Date: 2018-03-29 15:36:47

Paul Mackerras [off-list ref] a =C3=A9crit=C2=A0:
On Tue, Mar 27, 2018 at 05:22:32PM +0200, LEROY Christophe wrote:
quoted
Shile Zhang [off-list ref] a =C3=A9crit=C2=A0:
quoted
fix the missed point in Paul's patch:
"powerpc/64: Fix checksum folding in csum_tcpudp_nofold and
ip_fast_csum_nofold"

Signed-off-by: Shile Zhang <redacted>
---
arch/powerpc/include/asm/checksum.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/powerpc/include/asm/checksum.h
b/arch/powerpc/include/asm/checksum.h
index 5b1a6e3..430d038 100644
--- a/arch/powerpc/include/asm/checksum.h
+++ b/arch/powerpc/include/asm/checksum.h
@@ -108,7 +108,7 @@ static inline __wsum csum_add(__wsum csum,=20=20
=20__wsum addend)
quoted
#ifdef __powerpc64__
	res +=3D (__force u64)addend;
-	return (__force __wsum)((u32)res + (res >> 32));
+	return (__force __wsum) from64to32(res);
Did you encounter a bug due to that ?
As far as i understand, csum and addend are 32 bits so can't exceed=20=
=20
quoted
=200xffffffff
Then their sum won't exceed 0x1fffffffe. So the sum of upper and lower p=
art
quoted
won't carry
If the sum of the two halves was 0x1fffffffe, then that previously got
truncated to 32 bits and returned as 0xfffffffe, which is wrong - the
result should be 0xffffffff.
It is the sum of the two arguments of csum_add() which can't exceed=20=20
0x1fffffffe
So=20the sum of the two halves will be 0xffffffff which is the expected res=
ult.

The issue would start with res =3D 0x1ffffffff, in that case the sum of=20=
=20
the=20two halves would be 0x100000000 which would have been truncated to=20=
=20
0=20whereas we expect the result to be 1 in that case.
But in order to obtain res =3D 0x1ffffffff or higher, you have to sum at=20=
=20
least=20three 32 bits numbers. You can't obtain such a value with a sum=20=
=20
of=20two 32 bits numbers.

Christophe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help