Messages in this thread Patch in this message | | | Subject | Re: [PATCH] MIPS: Check __clang__ to avoid performance influence with GCC in csum_tcpudp_nofold() | From | Tiezhu Yang <> | Date | Tue, 9 Mar 2021 10:22:49 +0800 |
| |
On 03/09/2021 12:52 AM, David Laight wrote: > From: Tiezhu Yang >> Sent: 08 March 2021 12:50 >> >> The asm code in csum_tcpudp_nofold() is performance-critical, I am sorry >> for the poorly considered implementation about the performance influence >> with GCC in the commit 198688edbf77 ("MIPS: Fix inline asm input/output >> type mismatch in checksum.h used with Clang"). >> >> With this patch, we can build successfully by both GCC and Clang, >> at the same time, we can avoid the potential performance influence >> with GCC. >> >> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> >> --- >> arch/mips/include/asm/checksum.h | 10 ++++++++++ >> 1 file changed, 10 insertions(+) >> >> diff --git a/arch/mips/include/asm/checksum.h b/arch/mips/include/asm/checksum.h >> index 1e6c135..64d353e 100644 >> --- a/arch/mips/include/asm/checksum.h >> +++ b/arch/mips/include/asm/checksum.h >> @@ -130,7 +130,9 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, >> __u32 len, __u8 proto, >> __wsum sum) >> { >> +#ifdef __clang__ >> unsigned long tmp = (__force unsigned long)sum; >> +#endif > What happens if you make the above: > #ifdef __clang__ > unsigned long tmp = (__force unsigned long)sum; > #else > __wsum tmp = sum; > #endif > > and then leave the rest of the function the same for both compilers. > Maybe do s/sum/sum_in/,s/tmp/sum/ to reduce the changes.
Hi David,
Thank you very much.
As you suggested, the following changes looks much better, I will test it and then send v2 later.
diff --git a/arch/mips/include/asm/checksum.h b/arch/mips/include/asm/checksum.h index 1e6c135..80eddd4 100644 --- a/arch/mips/include/asm/checksum.h +++ b/arch/mips/include/asm/checksum.h @@ -128,9 +128,13 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len, __u8 proto, - __wsum sum) + __wsum sum_in) { - unsigned long tmp = (__force unsigned long)sum; +#ifdef __clang__ + unsigned long sum = (__force unsigned long)sum_in; +#else + __wsum sum = sum_in; +#endif
__asm__( " .set push # csum_tcpudp_nofold\n" @@ -159,7 +163,7 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, " addu %0, $1 \n" #endif " .set pop" - : "=r" (tmp) + : "=r" (sum) : "0" ((__force unsigned long)daddr), "r" ((__force unsigned long)saddr), #ifdef __MIPSEL__ @@ -169,7 +173,7 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, #endif "r" ((__force unsigned long)sum));
- return (__force __wsum)tmp; + return (__force __wsum)sum; } #define csum_tcpudp_nofold csum_tcpudp_nofold
Thanks, Tiezhu > > David > > - > Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK > Registration No: 1397386 (Wales)
| |