Skip to content

Commit e9c7ddb

Browse files
rmurphy-armctmarinas
authored andcommitted
arm64: csum: Optimise IPv6 header checksum
Throwing our __uint128_t idioms at csum_ipv6_magic() makes it about 1.3x-2x faster across a range of microarchitecture/compiler combinations. Not much in absolute terms, but every little helps. Signed-off-by: Robin Murphy <[email protected]> Signed-off-by: Catalin Marinas <[email protected]>
1 parent 27afb23 commit e9c7ddb

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

arch/arm64/include/asm/checksum.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55
#ifndef __ASM_CHECKSUM_H
66
#define __ASM_CHECKSUM_H
77

8-
#include <linux/types.h>
8+
#include <linux/in6.h>
9+
10+
#define _HAVE_ARCH_IPV6_CSUM
11+
__sum16 csum_ipv6_magic(const struct in6_addr *saddr,
12+
const struct in6_addr *daddr,
13+
__u32 len, __u8 proto, __wsum sum);
914

1015
static inline __sum16 csum_fold(__wsum csum)
1116
{

arch/arm64/lib/csum.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,30 @@ unsigned int do_csum(const unsigned char *buff, int len)
124124

125125
return sum >> 16;
126126
}
127+
128+
__sum16 csum_ipv6_magic(const struct in6_addr *saddr,
129+
const struct in6_addr *daddr,
130+
__u32 len, __u8 proto, __wsum csum)
131+
{
132+
__uint128_t src, dst;
133+
u64 sum = (__force u64)csum;
134+
135+
src = *(const __uint128_t *)saddr->s6_addr;
136+
dst = *(const __uint128_t *)daddr->s6_addr;
137+
138+
sum += (__force u32)htonl(len);
139+
#ifdef __LITTLE_ENDIAN
140+
sum += (u32)proto << 24;
141+
#else
142+
sum += proto;
143+
#endif
144+
src += (src >> 64) | (src << 64);
145+
dst += (dst >> 64) | (dst << 64);
146+
147+
sum = accumulate(sum, src >> 64);
148+
sum = accumulate(sum, dst >> 64);
149+
150+
sum += ((sum >> 32) | (sum << 32));
151+
return csum_fold((__force __wsum)(sum >> 32));
152+
}
153+
EXPORT_SYMBOL(csum_ipv6_magic);

0 commit comments

Comments
 (0)