Skip to content

Commit e4517b3

Browse files
Johan Almbladhborkmann
authored andcommitted
bpf, tests: Add tests for atomic operations
Tests for each atomic arithmetic operation and BPF_XCHG, derived from old BPF_XADD tests. The tests include BPF_W/DW and BPF_FETCH variants. Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20210809091829.810076-13-johan.almbladh@anyfinetworks.com
1 parent 53e33f9 commit e4517b3

File tree

1 file changed

+166
-86
lines changed

1 file changed

+166
-86
lines changed

lib/test_bpf.c

Lines changed: 166 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -5508,49 +5508,6 @@ static struct bpf_test tests[] = {
55085508
.stack_depth = 40,
55095509
},
55105510
/* BPF_STX | BPF_ATOMIC | BPF_W/DW */
5511-
{
5512-
"STX_XADD_W: Test: 0x12 + 0x10 = 0x22",
5513-
.u.insns_int = {
5514-
BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
5515-
BPF_ST_MEM(BPF_W, R10, -40, 0x10),
5516-
BPF_ATOMIC_OP(BPF_W, BPF_ADD, R10, R0, -40),
5517-
BPF_LDX_MEM(BPF_W, R0, R10, -40),
5518-
BPF_EXIT_INSN(),
5519-
},
5520-
INTERNAL,
5521-
{ },
5522-
{ { 0, 0x22 } },
5523-
.stack_depth = 40,
5524-
},
5525-
{
5526-
"STX_XADD_W: Test side-effects, r10: 0x12 + 0x10 = 0x22",
5527-
.u.insns_int = {
5528-
BPF_ALU64_REG(BPF_MOV, R1, R10),
5529-
BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
5530-
BPF_ST_MEM(BPF_W, R10, -40, 0x10),
5531-
BPF_ATOMIC_OP(BPF_W, BPF_ADD, R10, R0, -40),
5532-
BPF_ALU64_REG(BPF_MOV, R0, R10),
5533-
BPF_ALU64_REG(BPF_SUB, R0, R1),
5534-
BPF_EXIT_INSN(),
5535-
},
5536-
INTERNAL,
5537-
{ },
5538-
{ { 0, 0 } },
5539-
.stack_depth = 40,
5540-
},
5541-
{
5542-
"STX_XADD_W: Test side-effects, r0: 0x12 + 0x10 = 0x22",
5543-
.u.insns_int = {
5544-
BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
5545-
BPF_ST_MEM(BPF_W, R10, -40, 0x10),
5546-
BPF_ATOMIC_OP(BPF_W, BPF_ADD, R10, R0, -40),
5547-
BPF_EXIT_INSN(),
5548-
},
5549-
INTERNAL,
5550-
{ },
5551-
{ { 0, 0x12 } },
5552-
.stack_depth = 40,
5553-
},
55545511
{
55555512
"STX_XADD_W: X + 1 + 1 + 1 + ...",
55565513
{ },
@@ -5559,49 +5516,6 @@ static struct bpf_test tests[] = {
55595516
{ { 0, 4134 } },
55605517
.fill_helper = bpf_fill_stxw,
55615518
},
5562-
{
5563-
"STX_XADD_DW: Test: 0x12 + 0x10 = 0x22",
5564-
.u.insns_int = {
5565-
BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
5566-
BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
5567-
BPF_ATOMIC_OP(BPF_DW, BPF_ADD, R10, R0, -40),
5568-
BPF_LDX_MEM(BPF_DW, R0, R10, -40),
5569-
BPF_EXIT_INSN(),
5570-
},
5571-
INTERNAL,
5572-
{ },
5573-
{ { 0, 0x22 } },
5574-
.stack_depth = 40,
5575-
},
5576-
{
5577-
"STX_XADD_DW: Test side-effects, r10: 0x12 + 0x10 = 0x22",
5578-
.u.insns_int = {
5579-
BPF_ALU64_REG(BPF_MOV, R1, R10),
5580-
BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
5581-
BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
5582-
BPF_ATOMIC_OP(BPF_DW, BPF_ADD, R10, R0, -40),
5583-
BPF_ALU64_REG(BPF_MOV, R0, R10),
5584-
BPF_ALU64_REG(BPF_SUB, R0, R1),
5585-
BPF_EXIT_INSN(),
5586-
},
5587-
INTERNAL,
5588-
{ },
5589-
{ { 0, 0 } },
5590-
.stack_depth = 40,
5591-
},
5592-
{
5593-
"STX_XADD_DW: Test side-effects, r0: 0x12 + 0x10 = 0x22",
5594-
.u.insns_int = {
5595-
BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
5596-
BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
5597-
BPF_ATOMIC_OP(BPF_DW, BPF_ADD, R10, R0, -40),
5598-
BPF_EXIT_INSN(),
5599-
},
5600-
INTERNAL,
5601-
{ },
5602-
{ { 0, 0x12 } },
5603-
.stack_depth = 40,
5604-
},
56055519
{
56065520
"STX_XADD_DW: X + 1 + 1 + 1 + ...",
56075521
{ },
@@ -5610,6 +5524,172 @@ static struct bpf_test tests[] = {
56105524
{ { 0, 4134 } },
56115525
.fill_helper = bpf_fill_stxdw,
56125526
},
5527+
/*
5528+
* Exhaustive tests of atomic operation variants.
5529+
* Individual tests are expanded from template macros for all
5530+
* combinations of ALU operation, word size and fetching.
5531+
*/
5532+
#define BPF_ATOMIC_OP_TEST1(width, op, logic, old, update, result) \
5533+
{ \
5534+
"BPF_ATOMIC | " #width ", " #op ": Test: " \
5535+
#old " " #logic " " #update " = " #result, \
5536+
.u.insns_int = { \
5537+
BPF_ALU32_IMM(BPF_MOV, R5, update), \
5538+
BPF_ST_MEM(width, R10, -40, old), \
5539+
BPF_ATOMIC_OP(width, op, R10, R5, -40), \
5540+
BPF_LDX_MEM(width, R0, R10, -40), \
5541+
BPF_EXIT_INSN(), \
5542+
}, \
5543+
INTERNAL, \
5544+
{ }, \
5545+
{ { 0, result } }, \
5546+
.stack_depth = 40, \
5547+
}
5548+
#define BPF_ATOMIC_OP_TEST2(width, op, logic, old, update, result) \
5549+
{ \
5550+
"BPF_ATOMIC | " #width ", " #op ": Test side effects, r10: " \
5551+
#old " " #logic " " #update " = " #result, \
5552+
.u.insns_int = { \
5553+
BPF_ALU64_REG(BPF_MOV, R1, R10), \
5554+
BPF_ALU32_IMM(BPF_MOV, R0, update), \
5555+
BPF_ST_MEM(BPF_W, R10, -40, old), \
5556+
BPF_ATOMIC_OP(width, op, R10, R0, -40), \
5557+
BPF_ALU64_REG(BPF_MOV, R0, R10), \
5558+
BPF_ALU64_REG(BPF_SUB, R0, R1), \
5559+
BPF_EXIT_INSN(), \
5560+
}, \
5561+
INTERNAL, \
5562+
{ }, \
5563+
{ { 0, 0 } }, \
5564+
.stack_depth = 40, \
5565+
}
5566+
#define BPF_ATOMIC_OP_TEST3(width, op, logic, old, update, result) \
5567+
{ \
5568+
"BPF_ATOMIC | " #width ", " #op ": Test side effects, r0: " \
5569+
#old " " #logic " " #update " = " #result, \
5570+
.u.insns_int = { \
5571+
BPF_ALU64_REG(BPF_MOV, R0, R10), \
5572+
BPF_ALU32_IMM(BPF_MOV, R1, update), \
5573+
BPF_ST_MEM(width, R10, -40, old), \
5574+
BPF_ATOMIC_OP(width, op, R10, R1, -40), \
5575+
BPF_ALU64_REG(BPF_SUB, R0, R10), \
5576+
BPF_EXIT_INSN(), \
5577+
}, \
5578+
INTERNAL, \
5579+
{ }, \
5580+
{ { 0, 0 } }, \
5581+
.stack_depth = 40, \
5582+
}
5583+
#define BPF_ATOMIC_OP_TEST4(width, op, logic, old, update, result) \
5584+
{ \
5585+
"BPF_ATOMIC | " #width ", " #op ": Test fetch: " \
5586+
#old " " #logic " " #update " = " #result, \
5587+
.u.insns_int = { \
5588+
BPF_ALU32_IMM(BPF_MOV, R3, update), \
5589+
BPF_ST_MEM(width, R10, -40, old), \
5590+
BPF_ATOMIC_OP(width, op, R10, R3, -40), \
5591+
BPF_ALU64_REG(BPF_MOV, R0, R3), \
5592+
BPF_EXIT_INSN(), \
5593+
}, \
5594+
INTERNAL, \
5595+
{ }, \
5596+
{ { 0, (op) & BPF_FETCH ? old : update } }, \
5597+
.stack_depth = 40, \
5598+
}
5599+
/* BPF_ATOMIC | BPF_W: BPF_ADD */
5600+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
5601+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
5602+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
5603+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd),
5604+
/* BPF_ATOMIC | BPF_W: BPF_ADD | BPF_FETCH */
5605+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5606+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5607+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5608+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5609+
/* BPF_ATOMIC | BPF_DW: BPF_ADD */
5610+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
5611+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
5612+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
5613+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd),
5614+
/* BPF_ATOMIC | BPF_DW: BPF_ADD | BPF_FETCH */
5615+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5616+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5617+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5618+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd),
5619+
/* BPF_ATOMIC | BPF_W: BPF_AND */
5620+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
5621+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
5622+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
5623+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02),
5624+
/* BPF_ATOMIC | BPF_W: BPF_AND | BPF_FETCH */
5625+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5626+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5627+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5628+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5629+
/* BPF_ATOMIC | BPF_DW: BPF_AND */
5630+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
5631+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
5632+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
5633+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02),
5634+
/* BPF_ATOMIC | BPF_DW: BPF_AND | BPF_FETCH */
5635+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5636+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5637+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5638+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02),
5639+
/* BPF_ATOMIC | BPF_W: BPF_OR */
5640+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
5641+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
5642+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
5643+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb),
5644+
/* BPF_ATOMIC | BPF_W: BPF_OR | BPF_FETCH */
5645+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5646+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5647+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5648+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5649+
/* BPF_ATOMIC | BPF_DW: BPF_OR */
5650+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
5651+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
5652+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
5653+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb),
5654+
/* BPF_ATOMIC | BPF_DW: BPF_OR | BPF_FETCH */
5655+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5656+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5657+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5658+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb),
5659+
/* BPF_ATOMIC | BPF_W: BPF_XOR */
5660+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5661+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5662+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5663+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5664+
/* BPF_ATOMIC | BPF_W: BPF_XOR | BPF_FETCH */
5665+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5666+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5667+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5668+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5669+
/* BPF_ATOMIC | BPF_DW: BPF_XOR */
5670+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5671+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5672+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5673+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9),
5674+
/* BPF_ATOMIC | BPF_DW: BPF_XOR | BPF_FETCH */
5675+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5676+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5677+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5678+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9),
5679+
/* BPF_ATOMIC | BPF_W: BPF_XCHG */
5680+
BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5681+
BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5682+
BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5683+
BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5684+
/* BPF_ATOMIC | BPF_DW: BPF_XCHG */
5685+
BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5686+
BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5687+
BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5688+
BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab),
5689+
#undef BPF_ATOMIC_OP_TEST1
5690+
#undef BPF_ATOMIC_OP_TEST2
5691+
#undef BPF_ATOMIC_OP_TEST3
5692+
#undef BPF_ATOMIC_OP_TEST4
56135693
/* BPF_JMP32 | BPF_JEQ | BPF_K */
56145694
{
56155695
"JMP32_JEQ_K: Small immediate",

0 commit comments

Comments
 (0)