On Sat, Dec 11, 2021 at 10:43 AM Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > + > +static void bpf_test_run_xdp_teardown(struct bpf_test_timer *t) > +{ > + struct xdp_mem_info mem = { > + .id = t->xdp.pp->xdp_mem_id, > + .type = MEM_TYPE_PAGE_POOL, > + }; pls add a new line. > + xdp_unreg_mem_model(&mem); > +} > + > +static bool ctx_was_changed(struct xdp_page_head *head) > +{ > + return (head->orig_ctx.data != head->ctx.data || > + head->orig_ctx.data_meta != head->ctx.data_meta || > + head->orig_ctx.data_end != head->ctx.data_end); redundant () > bpf_test_timer_enter(&t); > old_ctx = bpf_set_run_ctx(&run_ctx.run_ctx); > do { > run_ctx.prog_item = &item; > - if (xdp) > + if (xdp && xdp_redirect) { > + ret = bpf_test_run_xdp_redirect(&t, prog, ctx); > + if (unlikely(ret < 0)) > + break; > + *retval = ret; > + } else if (xdp) { > *retval = bpf_prog_run_xdp(prog, ctx); Can we do this unconditionally without introducing a new uapi flag? I mean "return bpf_redirect()" was a nop under test_run. What kind of tests might break if it stops being a nop?