Skip to content

Commit 9045bdc

Browse files
qmonnetdavem330
authored andcommitted
selftests/bpf: check bpf verifier log buffer usage works for HW offload
Make netdevsim print a message to the BPF verifier log buffer when a program is offloaded. Then use this message in hardware offload selftests to make sure that using this buffer actually prints the message to the console for eBPF hardware offload. The message is appended after the last instruction is processed with the verifying function from netdevsim. Output looks like the following: $ tc filter add dev foo ingress bpf obj sample_ret0.o \ sec .text verbose skip_sw Prog section '.text' loaded (5)! - Type: 3 - Instructions: 2 (0 over limit) - License: Verifier analysis: 0: (b7) r0 = 0 1: (95) exit [netdevsim] Hello from netdevsim! processed 2 insns, stack depth 0 "verbose" flag is required to see it in the console since netdevsim does not throw an error after printing the message. Signed-off-by: Quentin Monnet <[email protected]> Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7c5db7e commit 9045bdc

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

drivers/net/netdevsim/bpf.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323

2424
#include "netdevsim.h"
2525

26+
#define pr_vlog(env, fmt, ...) \
27+
bpf_verifier_log_write(env, "[netdevsim] " fmt, ##__VA_ARGS__)
28+
2629
struct nsim_bpf_bound_prog {
2730
struct netdevsim *ns;
2831
struct bpf_prog *prog;
@@ -77,6 +80,9 @@ nsim_bpf_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn)
7780
if (state->ns->bpf_bind_verifier_delay && !insn_idx)
7881
msleep(state->ns->bpf_bind_verifier_delay);
7982

83+
if (insn_idx == env->prog->len - 1)
84+
pr_vlog(env, "Hello from netdevsim!\n");
85+
8086
return 0;
8187
}
8288

tools/testing/selftests/bpf/test_offload.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,10 @@ def set_mtu(self, mtu, fail=True):
362362
return ip("link set dev %s mtu %d" % (self.dev["ifname"], mtu),
363363
fail=fail)
364364

365-
def set_xdp(self, bpf, mode, force=False, JSON=True,
365+
def set_xdp(self, bpf, mode, force=False, JSON=True, verbose=False,
366366
fail=True, include_stderr=False):
367+
if verbose:
368+
bpf += " verbose"
367369
return ip("link set dev %s xdp%s %s" % (self.dev["ifname"], mode, bpf),
368370
force=force, JSON=JSON,
369371
fail=fail, include_stderr=include_stderr)
@@ -427,11 +429,13 @@ def tc_show_ingress(self, expected=None):
427429
(len(filters), expected))
428430
return filters
429431

430-
def cls_bpf_add_filter(self, bpf, da=False, skip_sw=False, skip_hw=False,
431-
fail=True, include_stderr=False):
432+
def cls_bpf_add_filter(self, bpf, da=False, verbose=False, skip_sw=False,
433+
skip_hw=False, fail=True, include_stderr=False):
432434
params = ""
433435
if da:
434436
params += " da"
437+
if verbose:
438+
params += " verbose"
435439
if skip_sw:
436440
params += " skip_sw"
437441
if skip_hw:
@@ -520,6 +524,13 @@ def check_extack(output, reference, args):
520524
def check_extack_nsim(output, reference, args):
521525
check_extack(output, "Error: netdevsim: " + reference, args)
522526

527+
def check_verifier_log(output, reference):
528+
lines = output.split("\n")
529+
for l in reversed(lines):
530+
if l == reference:
531+
return
532+
fail(True, "Missing or incorrect message from netdevsim in verifier log")
533+
523534
# Parse command line
524535
parser = argparse.ArgumentParser()
525536
parser.add_argument("--log", help="output verbose log to given file")
@@ -634,8 +645,10 @@ def check_extack_nsim(output, reference, args):
634645
sim.wait_for_flush()
635646

636647
start_test("Test TC offloads work...")
637-
ret, _ = sim.cls_bpf_add_filter(obj, skip_sw=True, fail=False)
648+
ret, _, err = sim.cls_bpf_add_filter(obj, verbose=True, skip_sw=True,
649+
fail=False, include_stderr=True)
638650
fail(ret != 0, "TC filter did not load with TC offloads enabled")
651+
check_verifier_log(err, "[netdevsim] Hello from netdevsim!")
639652

640653
start_test("Test TC offload basics...")
641654
dfs = sim.dfs_get_bound_progs(expected=1)
@@ -744,12 +757,13 @@ def check_extack_nsim(output, reference, args):
744757

745758
sim.wait_for_flush()
746759
start_test("Test XDP offload...")
747-
sim.set_xdp(obj, "offload")
760+
_, _, err = sim.set_xdp(obj, "offload", verbose=True, include_stderr=True)
748761
ipl = sim.ip_link_show(xdp=True)
749762
link_xdp = ipl["xdp"]["prog"]
750763
progs = bpftool_prog_list(expected=1)
751764
prog = progs[0]
752765
fail(link_xdp["id"] != prog["id"], "Loaded program has wrong ID")
766+
check_verifier_log(err, "[netdevsim] Hello from netdevsim!")
753767

754768
start_test("Test XDP offload is device bound...")
755769
dfs = sim.dfs_get_bound_progs(expected=1)

0 commit comments

Comments
 (0)