Messages in this thread | | | Date | Wed, 14 Feb 2024 17:24:13 -0800 | Subject | Re: [PATCH v8 2/2] lib: checksum: Use aligned accesses for ip_fast_csum and csum_ipv6_magic tests | From | Guenter Roeck <> |
| |
On 2/14/24 13:41, Charlie Jenkins wrote: > The test cases for ip_fast_csum and csum_ipv6_magic were failing on a > variety of architectures that are big endian or do not support > misalgined accesses. Both of these test cases are changed to support big > and little endian architectures. > > The test for ip_fast_csum is changed to align the data along (14 + > NET_IP_ALIGN) bytes which is the alignment of an IP header. The test for > csum_ipv6_magic aligns the data using a struct. An extra padding field > is added to the struct to ensure that the size of the struct is the same > on all architectures (44 bytes). > > The test for csum_ipv6_magic somewhat arbitrarily aligned saddr and > daddr. This would fail on parisc64 due to the following code snippet in > arch/parisc/include/asm/checksum.h: > > add %4, %0, %0\n" > ldd,ma 8(%1), %6\n" > ldd,ma 8(%2), %7\n" > add,dc %5, %0, %0\n" > > The second add is expecting carry flags from the first add. Normally, > a double word load (ldd) does not modify the carry flags. However, > because saddr and daddr may be misaligned, ldd triggers a misalignment > trap that gets handled in arch/parisc/kernel/unaligned.c. This causes > many additional instructions to be executed between the two adds. This > can be easily solved by adding the carry into %0 before executing the > ldd. > > However, that is not necessary since ipv6 headers should always be > aligned on a 16-byte boundary on parisc since NET_IP_ALIGN is set to 2 > and the ethernet header size is 14. > > Architectures that set NET_IP_ALIGN to 0 must support misaligned saddr > and daddr, but that is not tested here. > > Fixes: 6f4c45cbcb00 ("kunit: Add tests for csum_ipv6_magic and ip_fast_csum") > Signed-off-by: Charlie Jenkins <charlie@rivosinc.com>
Reviewed-and-Tested-by: Guenter Roeck <linux@roeck-us.net>
Guenter
| |