|
18 | 18 | #include <linux/init.h>
|
19 | 19 | #include <linux/module.h>
|
20 | 20 | #include <linux/filter.h>
|
| 21 | +#include <linux/bpf.h> |
21 | 22 | #include <linux/skbuff.h>
|
22 | 23 | #include <linux/netdevice.h>
|
23 | 24 | #include <linux/if_vlan.h>
|
@@ -355,6 +356,81 @@ static int bpf_fill_ja(struct bpf_test *self)
|
355 | 356 | return __bpf_fill_ja(self, 12, 9);
|
356 | 357 | }
|
357 | 358 |
|
| 359 | +static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self) |
| 360 | +{ |
| 361 | + unsigned int len = BPF_MAXINSNS; |
| 362 | + struct sock_filter *insn; |
| 363 | + int i; |
| 364 | + |
| 365 | + insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); |
| 366 | + if (!insn) |
| 367 | + return -ENOMEM; |
| 368 | + |
| 369 | + for (i = 0; i < len - 1; i += 2) { |
| 370 | + insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0); |
| 371 | + insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, |
| 372 | + SKF_AD_OFF + SKF_AD_CPU); |
| 373 | + } |
| 374 | + |
| 375 | + insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee); |
| 376 | + |
| 377 | + self->u.ptr.insns = insn; |
| 378 | + self->u.ptr.len = len; |
| 379 | + |
| 380 | + return 0; |
| 381 | +} |
| 382 | + |
| 383 | +#define PUSH_CNT 68 |
| 384 | +/* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */ |
| 385 | +static int bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self) |
| 386 | +{ |
| 387 | + unsigned int len = BPF_MAXINSNS; |
| 388 | + struct bpf_insn *insn; |
| 389 | + int i = 0, j, k = 0; |
| 390 | + |
| 391 | + insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); |
| 392 | + if (!insn) |
| 393 | + return -ENOMEM; |
| 394 | + |
| 395 | + insn[i++] = BPF_MOV64_REG(R6, R1); |
| 396 | +loop: |
| 397 | + for (j = 0; j < PUSH_CNT; j++) { |
| 398 | + insn[i++] = BPF_LD_ABS(BPF_B, 0); |
| 399 | + insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2); |
| 400 | + i++; |
| 401 | + insn[i++] = BPF_MOV64_REG(R1, R6); |
| 402 | + insn[i++] = BPF_MOV64_IMM(R2, 1); |
| 403 | + insn[i++] = BPF_MOV64_IMM(R3, 2); |
| 404 | + insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 405 | + bpf_skb_vlan_push_proto.func - __bpf_call_base); |
| 406 | + insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2); |
| 407 | + i++; |
| 408 | + } |
| 409 | + |
| 410 | + for (j = 0; j < PUSH_CNT; j++) { |
| 411 | + insn[i++] = BPF_LD_ABS(BPF_B, 0); |
| 412 | + insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2); |
| 413 | + i++; |
| 414 | + insn[i++] = BPF_MOV64_REG(R1, R6); |
| 415 | + insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 416 | + bpf_skb_vlan_pop_proto.func - __bpf_call_base); |
| 417 | + insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2); |
| 418 | + i++; |
| 419 | + } |
| 420 | + if (++k < 5) |
| 421 | + goto loop; |
| 422 | + |
| 423 | + for (; i < len - 1; i++) |
| 424 | + insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xbef); |
| 425 | + |
| 426 | + insn[len - 1] = BPF_EXIT_INSN(); |
| 427 | + |
| 428 | + self->u.ptr.insns = insn; |
| 429 | + self->u.ptr.len = len; |
| 430 | + |
| 431 | + return 0; |
| 432 | +} |
| 433 | + |
358 | 434 | static struct bpf_test tests[] = {
|
359 | 435 | {
|
360 | 436 | "TAX",
|
@@ -4398,6 +4474,22 @@ static struct bpf_test tests[] = {
|
4398 | 4474 | { { 0, 0xababcbac } },
|
4399 | 4475 | .fill_helper = bpf_fill_maxinsns11,
|
4400 | 4476 | },
|
| 4477 | + { |
| 4478 | + "BPF_MAXINSNS: ld_abs+get_processor_id", |
| 4479 | + { }, |
| 4480 | + CLASSIC, |
| 4481 | + { }, |
| 4482 | + { { 1, 0xbee } }, |
| 4483 | + .fill_helper = bpf_fill_ld_abs_get_processor_id, |
| 4484 | + }, |
| 4485 | + { |
| 4486 | + "BPF_MAXINSNS: ld_abs+vlan_push/pop", |
| 4487 | + { }, |
| 4488 | + INTERNAL, |
| 4489 | + { 0x34 }, |
| 4490 | + { { 1, 0xbef } }, |
| 4491 | + .fill_helper = bpf_fill_ld_abs_vlan_push_pop, |
| 4492 | + }, |
4401 | 4493 | };
|
4402 | 4494 |
|
4403 | 4495 | static struct net_device dev;
|
@@ -4551,14 +4643,14 @@ static int __run_one(const struct bpf_prog *fp, const void *data,
|
4551 | 4643 | u64 start, finish;
|
4552 | 4644 | int ret = 0, i;
|
4553 | 4645 |
|
4554 |
| - start = ktime_to_us(ktime_get()); |
| 4646 | + start = ktime_get_ns(); |
4555 | 4647 |
|
4556 | 4648 | for (i = 0; i < runs; i++)
|
4557 | 4649 | ret = BPF_PROG_RUN(fp, data);
|
4558 | 4650 |
|
4559 |
| - finish = ktime_to_us(ktime_get()); |
| 4651 | + finish = ktime_get_ns(); |
4560 | 4652 |
|
4561 |
| - *duration = (finish - start) * 1000ULL; |
| 4653 | + *duration = finish - start; |
4562 | 4654 | do_div(*duration, runs);
|
4563 | 4655 |
|
4564 | 4656 | return ret;
|
|
0 commit comments