Skip to content

Commit b38460b

Browse files
chleroydavem330
authored andcommitted
kunit: Fix checksum tests on big endian CPUs
On powerpc64le checksum kunit tests work: [ 2.011457][ T1] KTAP version 1 [ 2.011662][ T1] # Subtest: checksum [ 2.011848][ T1] 1..3 [ 2.034710][ T1] ok 1 test_csum_fixed_random_inputs [ 2.079325][ T1] ok 2 test_csum_all_carry_inputs [ 2.127102][ T1] ok 3 test_csum_no_carry_inputs [ 2.127202][ T1] # checksum: pass:3 fail:0 skip:0 total:3 [ 2.127533][ T1] # Totals: pass:3 fail:0 skip:0 total:3 [ 2.127956][ T1] ok 1 checksum But on powerpc64 and powerpc32 they fail: [ 1.859890][ T1] KTAP version 1 [ 1.860041][ T1] # Subtest: checksum [ 1.860201][ T1] 1..3 [ 1.861927][ T58] # test_csum_fixed_random_inputs: ASSERTION FAILED at lib/checksum_kunit.c:243 [ 1.861927][ T58] Expected result == expec, but [ 1.861927][ T58] result == 54991 (0xd6cf) [ 1.861927][ T58] expec == 33316 (0x8224) [ 1.863742][ T1] not ok 1 test_csum_fixed_random_inputs [ 1.864520][ T60] # test_csum_all_carry_inputs: ASSERTION FAILED at lib/checksum_kunit.c:267 [ 1.864520][ T60] Expected result == expec, but [ 1.864520][ T60] result == 255 (0xff) [ 1.864520][ T60] expec == 65280 (0xff00) [ 1.868820][ T1] not ok 2 test_csum_all_carry_inputs [ 1.869977][ T62] # test_csum_no_carry_inputs: ASSERTION FAILED at lib/checksum_kunit.c:306 [ 1.869977][ T62] Expected result == expec, but [ 1.869977][ T62] result == 64515 (0xfc03) [ 1.869977][ T62] expec == 0 (0x0) [ 1.872060][ T1] not ok 3 test_csum_no_carry_inputs [ 1.872102][ T1] # checksum: pass:0 fail:3 skip:0 total:3 [ 1.872458][ T1] # Totals: pass:0 fail:3 skip:0 total:3 [ 1.872791][ T1] not ok 3 checksum This is because all expected values were calculated for X86 which is little endian. On big endian systems all precalculated 16 bits halves must be byte swapped. And this is confirmed by a huge amount of sparse errors when building with C=2 So fix all sparse errors and it will naturally work on all endianness. Fixes: 688eb81 ("x86/csum: Improve performance of `csum_partial`") Signed-off-by: Christophe Leroy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9540329 commit b38460b

File tree

1 file changed

+38
-16
lines changed

1 file changed

+38
-16
lines changed

lib/checksum_kunit.c

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
#define MAX_ALIGN 64
1111
#define TEST_BUFLEN (MAX_LEN + MAX_ALIGN)
1212

13-
static const __wsum random_init_sum = 0x2847aab;
13+
/* Values for a little endian CPU. Byte swap each half on big endian CPU. */
14+
static const u32 random_init_sum = 0x2847aab;
1415
static const u8 random_buf[] = {
1516
0xac, 0xd7, 0x76, 0x69, 0x6e, 0xf2, 0x93, 0x2c, 0x1f, 0xe0, 0xde, 0x86,
1617
0x8f, 0x54, 0x33, 0x90, 0x95, 0xbf, 0xff, 0xb9, 0xea, 0x62, 0x6e, 0xb5,
@@ -56,7 +57,9 @@ static const u8 random_buf[] = {
5657
0xe1, 0xdf, 0x4b, 0xe1, 0x81, 0xe2, 0x17, 0x02, 0x7b, 0x58, 0x8b, 0x92,
5758
0x1a, 0xac, 0x46, 0xdd, 0x2e, 0xce, 0x40, 0x09
5859
};
59-
static const __sum16 expected_results[] = {
60+
61+
/* Values for a little endian CPU. Byte swap on big endian CPU. */
62+
static const u16 expected_results[] = {
6063
0x82d0, 0x8224, 0xab23, 0xaaad, 0x41ad, 0x413f, 0x4f3e, 0x4eab, 0x22ab,
6164
0x228c, 0x428b, 0x41ad, 0xbbac, 0xbb1d, 0x671d, 0x66ea, 0xd6e9, 0xd654,
6265
0x1754, 0x1655, 0x5d54, 0x5c6a, 0xfa69, 0xf9fb, 0x44fb, 0x4428, 0xf527,
@@ -115,7 +118,9 @@ static const __sum16 expected_results[] = {
115118
0x1d47, 0x3c46, 0x3bc5, 0x59c4, 0x59ad, 0x57ad, 0x5732, 0xff31, 0xfea6,
116119
0x6ca6, 0x6c8c, 0xc08b, 0xc045, 0xe344, 0xe316, 0x1516, 0x14d6,
117120
};
118-
static const __wsum init_sums_no_overflow[] = {
121+
122+
/* Values for a little endian CPU. Byte swap each half on big endian CPU. */
123+
static const u32 init_sums_no_overflow[] = {
119124
0xffffffff, 0xfffffffb, 0xfffffbfb, 0xfffffbf7, 0xfffff7f7, 0xfffff7f3,
120125
0xfffff3f3, 0xfffff3ef, 0xffffefef, 0xffffefeb, 0xffffebeb, 0xffffebe7,
121126
0xffffe7e7, 0xffffe7e3, 0xffffe3e3, 0xffffe3df, 0xffffdfdf, 0xffffdfdb,
@@ -208,7 +213,21 @@ static u8 tmp_buf[TEST_BUFLEN];
208213

209214
#define full_csum(buff, len, sum) csum_fold(csum_partial(buff, len, sum))
210215

211-
#define CHECK_EQ(lhs, rhs) KUNIT_ASSERT_EQ(test, lhs, rhs)
216+
#define CHECK_EQ(lhs, rhs) KUNIT_ASSERT_EQ(test, (__force u64)lhs, (__force u64)rhs)
217+
218+
static __sum16 to_sum16(u16 x)
219+
{
220+
return (__force __sum16)le16_to_cpu((__force __le16)x);
221+
}
222+
223+
/* This function swaps the bytes inside each half of a __wsum */
224+
static __wsum to_wsum(u32 x)
225+
{
226+
u16 hi = le16_to_cpu((__force __le16)(x >> 16));
227+
u16 lo = le16_to_cpu((__force __le16)x);
228+
229+
return (__force __wsum)((hi << 16) | lo);
230+
}
212231

213232
static void assert_setup_correct(struct kunit *test)
214233
{
@@ -226,7 +245,8 @@ static void assert_setup_correct(struct kunit *test)
226245
static void test_csum_fixed_random_inputs(struct kunit *test)
227246
{
228247
int len, align;
229-
__wsum result, expec, sum;
248+
__wsum sum;
249+
__sum16 result, expec;
230250

231251
assert_setup_correct(test);
232252
for (align = 0; align < TEST_BUFLEN; ++align) {
@@ -237,9 +257,9 @@ static void test_csum_fixed_random_inputs(struct kunit *test)
237257
/*
238258
* Test the precomputed random input.
239259
*/
240-
sum = random_init_sum;
260+
sum = to_wsum(random_init_sum);
241261
result = full_csum(&tmp_buf[align], len, sum);
242-
expec = expected_results[len];
262+
expec = to_sum16(expected_results[len]);
243263
CHECK_EQ(result, expec);
244264
}
245265
}
@@ -251,7 +271,8 @@ static void test_csum_fixed_random_inputs(struct kunit *test)
251271
static void test_csum_all_carry_inputs(struct kunit *test)
252272
{
253273
int len, align;
254-
__wsum result, expec, sum;
274+
__wsum sum;
275+
__sum16 result, expec;
255276

256277
assert_setup_correct(test);
257278
memset(tmp_buf, 0xff, TEST_BUFLEN);
@@ -261,9 +282,9 @@ static void test_csum_all_carry_inputs(struct kunit *test)
261282
/*
262283
* All carries from input and initial sum.
263284
*/
264-
sum = 0xffffffff;
285+
sum = to_wsum(0xffffffff);
265286
result = full_csum(&tmp_buf[align], len, sum);
266-
expec = (len & 1) ? 0xff00 : 0;
287+
expec = to_sum16((len & 1) ? 0xff00 : 0);
267288
CHECK_EQ(result, expec);
268289

269290
/*
@@ -272,11 +293,11 @@ static void test_csum_all_carry_inputs(struct kunit *test)
272293
sum = 0;
273294
result = full_csum(&tmp_buf[align], len, sum);
274295
if (len & 1)
275-
expec = 0xff00;
296+
expec = to_sum16(0xff00);
276297
else if (len)
277298
expec = 0;
278299
else
279-
expec = 0xffff;
300+
expec = to_sum16(0xffff);
280301
CHECK_EQ(result, expec);
281302
}
282303
}
@@ -290,7 +311,8 @@ static void test_csum_all_carry_inputs(struct kunit *test)
290311
static void test_csum_no_carry_inputs(struct kunit *test)
291312
{
292313
int len, align;
293-
__wsum result, expec, sum;
314+
__wsum sum;
315+
__sum16 result, expec;
294316

295317
assert_setup_correct(test);
296318
memset(tmp_buf, 0x4, TEST_BUFLEN);
@@ -300,17 +322,17 @@ static void test_csum_no_carry_inputs(struct kunit *test)
300322
/*
301323
* Expect no carries.
302324
*/
303-
sum = init_sums_no_overflow[len];
325+
sum = to_wsum(init_sums_no_overflow[len]);
304326
result = full_csum(&tmp_buf[align], len, sum);
305327
expec = 0;
306328
CHECK_EQ(result, expec);
307329

308330
/*
309331
* Expect one carry.
310332
*/
311-
sum = init_sums_no_overflow[len] + 1;
333+
sum = to_wsum(init_sums_no_overflow[len] + 1);
312334
result = full_csum(&tmp_buf[align], len, sum);
313-
expec = len ? 0xfffe : 0xffff;
335+
expec = to_sum16(len ? 0xfffe : 0xffff);
314336
CHECK_EQ(result, expec);
315337
}
316338
}

0 commit comments

Comments
 (0)