All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH bpf-next v5 0/8] bpf: Support multi-attach for freplace programs
@ 2020-09-15 11:40 Toke Høiland-Jørgensen
  2020-09-15 11:40 ` [PATCH bpf-next v5 1/8] bpf: change logging calls from verbose() to bpf_log() and use log pointer Toke Høiland-Jørgensen
                   ` (7 more replies)
  0 siblings, 8 replies; 33+ messages in thread
From: Toke Høiland-Jørgensen @ 2020-09-15 11:40 UTC (permalink / raw)
  To: Alexei Starovoitov
  Cc: Daniel Borkmann, Martin KaFai Lau, Song Liu, Yonghong Song,
	Andrii Nakryiko, John Fastabend, Jiri Olsa, Eelco Chaudron,
	KP Singh, netdev, bpf

This series adds support attaching freplace BPF programs to multiple targets.
This is needed to support incremental attachment of multiple XDP programs using
the libxdp dispatcher model.

The first three patches are refactoring patches: The first one is a trivial
change to the logging in the verifier, split out to make the subsequent refactor
easier to read. Patch 2 refactors check_attach_btf_id() so that the checks on
program and target compatibility can be reused when attaching to a secondary
location.

Patch 3 moves prog_aux->linked_prog and the trampoline to be embedded in
bpf_tracing_link on attach, and freed by the link release logic, and introduces
a mutex to protect the writing of the pointers in prog->aux.

Based on these refactorings, it becomes pretty straight-forward to support
multiple-attach for freplace programs (patch 4). This is simply a matter of
creating a second bpf_tracing_link if a target is supplied. However, for API
consistency with other types of link attach, this option is added to the
BPF_LINK_CREATE API instead of extending bpf_raw_tracepoint_open().

Patch 5 is a port of Jiri Olsa's patch to support fentry/fexit on freplace
programs. His approach of getting the target type from the target program
reference no longer works after we've gotten rid of linked_prog (because the
bpf_tracing_link reference disappears on attach). Instead, we used the saved
reference to the target prog type that is also used to verify compatibility on
secondary freplace attachment.

Patches 6 is the accompanying libbpf update, and patches 7-8 are selftests, the
first one for the multi-freplace functionality itself, and the second one is
Jiri's previous selftest for the fentry-to-freplace fix.

With this series, libxdp and xdp-tools can successfully attach multiple programs
one at a time. To play with this, use the 'freplace-multi-attach' branch of
xdp-tools:

$ git clone --recurse-submodules --branch freplace-multi-attach https://github.com/xdp-project/xdp-tools
$ cd xdp-tools
$ make
$ sudo ./xdp-loader/xdp-loader load veth0 lib/testing/xdp_drop.o
$ sudo ./xdp-loader/xdp-loader load veth0 lib/testing/xdp_pass.o
$ sudo ./xdp-loader/xdp-loader status

The series is also available here:
https://git.kernel.org/pub/scm/linux/kernel/git/toke/linux.git/log/?h=bpf-freplace-multi-attach-alt-05

Changelog:

v5:
  - Fix typo in inline function definition of bpf_trampoline_get()
  - Don't put bpf_tracing_link in prog->aux, use a mutex to protect tgt_prog and
    trampoline instead, and move them to the link on attach.
  - Restore Jiri as author of the last selftest patch

v4:
  - Cleanup the refactored check_attach_btf_id() to make the logic easier to follow
  - Fix cleanup paths for bpf_tracing_link
  - Use xchg() for removing the bpf_tracing_link from prog->aux and restore on (some) failures
  - Use BPF_LINK_CREATE operation to create link with target instead of extending raw_tracepoint_open
  - Fold update of tools/ UAPI header into main patch
  - Update arg dereference patch to use skeletons and set_attach_target()

v3:
  - Get rid of prog_aux->linked_prog entirely in favour of a bpf_tracing_link
  - Incorporate Jiri's fix for attaching fentry to freplace programs

v2:
  - Drop the log arguments from bpf_raw_tracepoint_open
  - Fix kbot errors
  - Rebase to latest bpf-next

---

Jiri Olsa (1):
      selftests/bpf: Adding test for arg dereference in extension trace

Toke Høiland-Jørgensen (7):
      bpf: change logging calls from verbose() to bpf_log() and use log pointer
      bpf: verifier: refactor check_attach_btf_id()
      bpf: move prog->aux->linked_prog and trampoline into bpf_link on attach
      bpf: support attaching freplace programs to multiple attach points
      bpf: Fix context type resolving for extension programs
      libbpf: add support for freplace attachment in bpf_link_create
      selftests: add test for multiple attachments of freplace program


 include/linux/bpf.h                           |  24 +-
 include/linux/bpf_verifier.h                  |   9 +
 include/uapi/linux/bpf.h                      |   2 +
 kernel/bpf/btf.c                              |  15 +-
 kernel/bpf/core.c                             |   9 +-
 kernel/bpf/syscall.c                          | 118 +++++++++-
 kernel/bpf/trampoline.c                       |  32 ++-
 kernel/bpf/verifier.c                         | 211 +++++++++++-------
 tools/include/uapi/linux/bpf.h                |   2 +
 tools/lib/bpf/bpf.c                           |   1 +
 tools/lib/bpf/bpf.h                           |   3 +-
 tools/lib/bpf/libbpf.c                        |  24 +-
 tools/lib/bpf/libbpf.h                        |   3 +
 tools/lib/bpf/libbpf.map                      |   1 +
 .../selftests/bpf/prog_tests/fexit_bpf2bpf.c  | 171 +++++++++++---
 .../selftests/bpf/prog_tests/trace_ext.c      | 113 ++++++++++
 .../bpf/progs/freplace_get_constant.c         |  15 ++
 .../selftests/bpf/progs/test_trace_ext.c      |  18 ++
 .../bpf/progs/test_trace_ext_tracing.c        |  25 +++
 19 files changed, 641 insertions(+), 155 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/trace_ext.c
 create mode 100644 tools/testing/selftests/bpf/progs/freplace_get_constant.c
 create mode 100644 tools/testing/selftests/bpf/progs/test_trace_ext.c
 create mode 100644 tools/testing/selftests/bpf/progs/test_trace_ext_tracing.c


^ permalink raw reply	[flat|nested] 33+ messages in thread
* Re: [PATCH bpf-next v5 4/8] bpf: support attaching freplace programs to multiple attach points
@ 2020-09-16 23:46 kernel test robot
  0 siblings, 0 replies; 33+ messages in thread
From: kernel test robot @ 2020-09-16 23:46 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 26648 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <160017006133.98230.8867570651560085505.stgit@toke.dk>
References: <160017006133.98230.8867570651560085505.stgit@toke.dk>
TO: "Toke Høiland-Jørgensen" <toke@redhat.com>

Hi "Toke,

I love your patch! Perhaps something to improve:

[auto build test WARNING on bpf-next/master]

url:    https://github.com/0day-ci/linux/commits/Toke-H-iland-J-rgensen/bpf-change-logging-calls-from-verbose-to-bpf_log-and-use-log-pointer/20200916-085115
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
:::::: branch date: 23 hours ago
:::::: commit date: 23 hours ago
compiler: s390-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


cppcheck warnings: (new ones prefixed by >>)

   kernel/bpf/verifier.c:2624:9: warning: Identical condition 'err', second condition is always false [identicalConditionAfterEarlyExit]
    return err;
           ^
   kernel/bpf/verifier.c:2607:6: note: first condition
    if (err)
        ^
   kernel/bpf/verifier.c:2624:9: note: second condition
    return err;
           ^
>> kernel/bpf/verifier.c:11206:36: warning: Either the condition 'if(tgt_prog&&conservative)' is redundant or there is possible null pointer dereference: tgt_prog. [nullPointerRedundantCheck]
          prog->aux->tgt_prog_type != tgt_prog->type) ||
                                      ^
   kernel/bpf/verifier.c:11211:6: note: Assuming that condition 'if(tgt_prog&&conservative)' is not redundant
     if (tgt_prog && conservative)
        ^
   kernel/bpf/verifier.c:11206:36: note: Null pointer dereference
          prog->aux->tgt_prog_type != tgt_prog->type) ||
                                      ^
   kernel/bpf/verifier.c:11208:38: warning: Either the condition 'if(tgt_prog&&conservative)' is redundant or there is possible null pointer dereference: tgt_prog. [nullPointerRedundantCheck]
          prog->aux->tgt_attach_type != tgt_prog->expected_attach_type))
                                        ^
   kernel/bpf/verifier.c:11211:6: note: Assuming that condition 'if(tgt_prog&&conservative)' is not redundant
     if (tgt_prog && conservative)
        ^
   kernel/bpf/verifier.c:11208:38: note: Null pointer dereference
          prog->aux->tgt_attach_type != tgt_prog->expected_attach_type))
                                        ^
   kernel/bpf/verifier.c:11377:6: warning: Variable 'ret' is reassigned a value before the old one has been used. [redundantAssignment]
    ret = -ENOMEM;
        ^
   kernel/bpf/verifier.c:11359:0: note: Variable 'ret' is reassigned a value before the old one has been used.
    int i, len, ret = -EINVAL;
   ^
   kernel/bpf/verifier.c:11377:6: note: Variable 'ret' is reassigned a value before the old one has been used.
    ret = -ENOMEM;
        ^
   kernel/bpf/verifier.c:11434:6: warning: Variable 'ret' is reassigned a value before the old one has been used. [redundantAssignment]
    ret = replace_map_fd_with_map_ptr(env);
        ^
   kernel/bpf/verifier.c:11377:6: note: Variable 'ret' is reassigned a value before the old one has been used.
    ret = -ENOMEM;
        ^
   kernel/bpf/verifier.c:11434:6: note: Variable 'ret' is reassigned a value before the old one has been used.
    ret = replace_map_fd_with_map_ptr(env);
        ^
   kernel/bpf/verifier.c:11434:6: warning: Variable 'ret' is reassigned a value before the old one has been used. [redundantAssignment]
    ret = replace_map_fd_with_map_ptr(env);
        ^
   kernel/bpf/verifier.c:11405:7: note: Variable 'ret' is reassigned a value before the old one has been used.
     ret = -EINVAL;
         ^
   kernel/bpf/verifier.c:11434:6: note: Variable 'ret' is reassigned a value before the old one has been used.
    ret = replace_map_fd_with_map_ptr(env);
        ^
   kernel/bpf/verifier.c:11451:6: warning: Variable 'ret' is reassigned a value before the old one has been used. [redundantAssignment]
    ret = check_subprogs(env);
        ^
   kernel/bpf/verifier.c:11447:6: note: Variable 'ret' is reassigned a value before the old one has been used.
    ret = -ENOMEM;
        ^
   kernel/bpf/verifier.c:11451:6: note: Variable 'ret' is reassigned a value before the old one has been used.
    ret = check_subprogs(env);
        ^
   kernel/bpf/verifier.c:1963:25: warning: Local variable func shadows outer function [shadowFunction]
    struct bpf_func_state *func;
                           ^
   kernel/bpf/verifier.c:535:31: note: Shadowed declaration
   static struct bpf_func_state *func(struct bpf_verifier_env *env,
                                 ^
   kernel/bpf/verifier.c:1963:25: note: Shadow variable
    struct bpf_func_state *func;
                           ^
   kernel/bpf/verifier.c:1996:25: warning: Local variable func shadows outer function [shadowFunction]
    struct bpf_func_state *func;
                           ^
   kernel/bpf/verifier.c:535:31: note: Shadowed declaration
   static struct bpf_func_state *func(struct bpf_verifier_env *env,
                                 ^
   kernel/bpf/verifier.c:1996:25: note: Shadow variable
    struct bpf_func_state *func;
                           ^
   kernel/bpf/verifier.c:7316:25: warning: Local variable src_reg shadows outer variable [shadowVar]
     struct bpf_reg_state *src_reg = &regs[insn->src_reg];
                           ^
   kernel/bpf/verifier.c:7220:54: note: Shadowed declaration
    struct bpf_reg_state *dst_reg, *other_branch_regs, *src_reg = NULL;
                                                        ^
   kernel/bpf/verifier.c:7316:25: note: Shadow variable
     struct bpf_reg_state *src_reg = &regs[insn->src_reg];

# https://github.com/0day-ci/linux/commit/63e92b3278bbe1301a49b822500ebed166c130a3
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Toke-H-iland-J-rgensen/bpf-change-logging-calls-from-verbose-to-bpf_log-and-use-log-pointer/20200916-085115
git checkout 63e92b3278bbe1301a49b822500ebed166c130a3
vim +11206 kernel/bpf/verifier.c

1e6c62a8821557 Alexei Starovoitov     2020-08-27  11039  
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11040  int bpf_check_attach_target(struct bpf_verifier_log *log,
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11041  			    const struct bpf_prog *prog,
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11042  			    const struct bpf_prog *tgt_prog,
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11043  			    u32 btf_id,
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11044  			    struct btf_func_model *fmodel,
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11045  			    long *tgt_addr,
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11046  			    const char **tgt_name,
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11047  			    const struct btf_type **tgt_type)
38207291604401 Martin KaFai Lau       2019-10-24  11048  {
be8704ff07d237 Alexei Starovoitov     2020-01-20  11049  	bool prog_extension = prog->type == BPF_PROG_TYPE_EXT;
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11050  	const char prefix[] = "btf_trace_";
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11051  	int ret = 0, subprog = -1, i;
38207291604401 Martin KaFai Lau       2019-10-24  11052  	const struct btf_type *t;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11053  	bool conservative = true;
38207291604401 Martin KaFai Lau       2019-10-24  11054  	const char *tname;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11055  	struct btf *btf;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11056  	long addr = 0;
38207291604401 Martin KaFai Lau       2019-10-24  11057  
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11058  	if (!btf_id) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11059  		bpf_log(log, "Tracing programs must provide btf_id\n");
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11060  		return -EINVAL;
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11061  	}
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11062  	btf = tgt_prog ? tgt_prog->aux->btf : btf_vmlinux;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11063  	if (!btf) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11064  		bpf_log(log,
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11065  			"FENTRY/FEXIT program can only be attached to another program annotated with BTF\n");
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11066  		return -EINVAL;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11067  	}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11068  	t = btf_type_by_id(btf, btf_id);
38207291604401 Martin KaFai Lau       2019-10-24  11069  	if (!t) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11070  		bpf_log(log, "attach_btf_id %u is invalid\n", btf_id);
38207291604401 Martin KaFai Lau       2019-10-24  11071  		return -EINVAL;
38207291604401 Martin KaFai Lau       2019-10-24  11072  	}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11073  	tname = btf_name_by_offset(btf, t->name_off);
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11074  	if (!tname) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11075  		bpf_log(log, "attach_btf_id %u doesn't have a name\n", btf_id);
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11076  		return -EINVAL;
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11077  	}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11078  	if (tgt_prog) {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11079  		struct bpf_prog_aux *aux = tgt_prog->aux;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11080  
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11081  		for (i = 0; i < aux->func_info_cnt; i++)
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11082  			if (aux->func_info[i].type_id == btf_id) {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11083  				subprog = i;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11084  				break;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11085  			}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11086  		if (subprog == -1) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11087  			bpf_log(log, "Subprog %s doesn't exist\n", tname);
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11088  			return -EINVAL;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11089  		}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11090  		conservative = aux->func_info_aux[subprog].unreliable;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11091  		if (prog_extension) {
be8704ff07d237 Alexei Starovoitov     2020-01-20  11092  			if (conservative) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11093  				bpf_log(log,
be8704ff07d237 Alexei Starovoitov     2020-01-20  11094  					"Cannot replace static functions\n");
be8704ff07d237 Alexei Starovoitov     2020-01-20  11095  				return -EINVAL;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11096  			}
be8704ff07d237 Alexei Starovoitov     2020-01-20  11097  			if (!prog->jit_requested) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11098  				bpf_log(log,
be8704ff07d237 Alexei Starovoitov     2020-01-20  11099  					"Extension programs should be JITed\n");
be8704ff07d237 Alexei Starovoitov     2020-01-20  11100  				return -EINVAL;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11101  			}
be8704ff07d237 Alexei Starovoitov     2020-01-20  11102  		}
be8704ff07d237 Alexei Starovoitov     2020-01-20  11103  		if (!tgt_prog->jited) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11104  			bpf_log(log, "Can attach to only JITed progs\n");
be8704ff07d237 Alexei Starovoitov     2020-01-20  11105  			return -EINVAL;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11106  		}
be8704ff07d237 Alexei Starovoitov     2020-01-20  11107  		if (tgt_prog->type == prog->type) {
be8704ff07d237 Alexei Starovoitov     2020-01-20  11108  			/* Cannot fentry/fexit another fentry/fexit program.
be8704ff07d237 Alexei Starovoitov     2020-01-20  11109  			 * Cannot attach program extension to another extension.
be8704ff07d237 Alexei Starovoitov     2020-01-20  11110  			 * It's ok to attach fentry/fexit to extension program.
be8704ff07d237 Alexei Starovoitov     2020-01-20  11111  			 */
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11112  			bpf_log(log, "Cannot recursively attach\n");
be8704ff07d237 Alexei Starovoitov     2020-01-20  11113  			return -EINVAL;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11114  		}
be8704ff07d237 Alexei Starovoitov     2020-01-20  11115  		if (tgt_prog->type == BPF_PROG_TYPE_TRACING &&
be8704ff07d237 Alexei Starovoitov     2020-01-20  11116  		    prog_extension &&
be8704ff07d237 Alexei Starovoitov     2020-01-20  11117  		    (tgt_prog->expected_attach_type == BPF_TRACE_FENTRY ||
be8704ff07d237 Alexei Starovoitov     2020-01-20  11118  		     tgt_prog->expected_attach_type == BPF_TRACE_FEXIT)) {
be8704ff07d237 Alexei Starovoitov     2020-01-20  11119  			/* Program extensions can extend all program types
be8704ff07d237 Alexei Starovoitov     2020-01-20  11120  			 * except fentry/fexit. The reason is the following.
be8704ff07d237 Alexei Starovoitov     2020-01-20  11121  			 * The fentry/fexit programs are used for performance
be8704ff07d237 Alexei Starovoitov     2020-01-20  11122  			 * analysis, stats and can be attached to any program
be8704ff07d237 Alexei Starovoitov     2020-01-20  11123  			 * type except themselves. When extension program is
be8704ff07d237 Alexei Starovoitov     2020-01-20  11124  			 * replacing XDP function it is necessary to allow
be8704ff07d237 Alexei Starovoitov     2020-01-20  11125  			 * performance analysis of all functions. Both original
be8704ff07d237 Alexei Starovoitov     2020-01-20  11126  			 * XDP program and its program extension. Hence
be8704ff07d237 Alexei Starovoitov     2020-01-20  11127  			 * attaching fentry/fexit to BPF_PROG_TYPE_EXT is
be8704ff07d237 Alexei Starovoitov     2020-01-20  11128  			 * allowed. If extending of fentry/fexit was allowed it
be8704ff07d237 Alexei Starovoitov     2020-01-20  11129  			 * would be possible to create long call chain
be8704ff07d237 Alexei Starovoitov     2020-01-20  11130  			 * fentry->extension->fentry->extension beyond
be8704ff07d237 Alexei Starovoitov     2020-01-20  11131  			 * reasonable stack size. Hence extending fentry is not
be8704ff07d237 Alexei Starovoitov     2020-01-20  11132  			 * allowed.
be8704ff07d237 Alexei Starovoitov     2020-01-20  11133  			 */
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11134  			bpf_log(log, "Cannot extend fentry/fexit\n");
be8704ff07d237 Alexei Starovoitov     2020-01-20  11135  			return -EINVAL;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11136  		}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11137  	} else {
be8704ff07d237 Alexei Starovoitov     2020-01-20  11138  		if (prog_extension) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11139  			bpf_log(log, "Cannot replace kernel functions\n");
be8704ff07d237 Alexei Starovoitov     2020-01-20  11140  			return -EINVAL;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11141  		}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11142  	}
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11143  
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11144  	switch (prog->expected_attach_type) {
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11145  	case BPF_TRACE_RAW_TP:
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11146  		if (tgt_prog) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11147  			bpf_log(log,
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11148  				"Only FENTRY/FEXIT progs are attachable to another BPF prog\n");
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11149  			return -EINVAL;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11150  		}
38207291604401 Martin KaFai Lau       2019-10-24  11151  		if (!btf_type_is_typedef(t)) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11152  			bpf_log(log, "attach_btf_id %u is not a typedef\n",
38207291604401 Martin KaFai Lau       2019-10-24  11153  				btf_id);
38207291604401 Martin KaFai Lau       2019-10-24  11154  			return -EINVAL;
38207291604401 Martin KaFai Lau       2019-10-24  11155  		}
f1b9509c2fb0ef Alexei Starovoitov     2019-10-30  11156  		if (strncmp(prefix, tname, sizeof(prefix) - 1)) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11157  			bpf_log(log, "attach_btf_id %u points to wrong type name %s\n",
38207291604401 Martin KaFai Lau       2019-10-24  11158  				btf_id, tname);
38207291604401 Martin KaFai Lau       2019-10-24  11159  			return -EINVAL;
38207291604401 Martin KaFai Lau       2019-10-24  11160  		}
38207291604401 Martin KaFai Lau       2019-10-24  11161  		tname += sizeof(prefix) - 1;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11162  		t = btf_type_by_id(btf, t->type);
38207291604401 Martin KaFai Lau       2019-10-24  11163  		if (!btf_type_is_ptr(t))
38207291604401 Martin KaFai Lau       2019-10-24  11164  			/* should never happen in valid vmlinux build */
38207291604401 Martin KaFai Lau       2019-10-24  11165  			return -EINVAL;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11166  		t = btf_type_by_id(btf, t->type);
38207291604401 Martin KaFai Lau       2019-10-24  11167  		if (!btf_type_is_func_proto(t))
38207291604401 Martin KaFai Lau       2019-10-24  11168  			/* should never happen in valid vmlinux build */
38207291604401 Martin KaFai Lau       2019-10-24  11169  			return -EINVAL;
38207291604401 Martin KaFai Lau       2019-10-24  11170  
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11171  		break;
15d83c4d7cef5c Yonghong Song          2020-05-09  11172  	case BPF_TRACE_ITER:
15d83c4d7cef5c Yonghong Song          2020-05-09  11173  		if (!btf_type_is_func(t)) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11174  			bpf_log(log, "attach_btf_id %u is not a function\n",
15d83c4d7cef5c Yonghong Song          2020-05-09  11175  				btf_id);
15d83c4d7cef5c Yonghong Song          2020-05-09  11176  			return -EINVAL;
15d83c4d7cef5c Yonghong Song          2020-05-09  11177  		}
15d83c4d7cef5c Yonghong Song          2020-05-09  11178  		t = btf_type_by_id(btf, t->type);
15d83c4d7cef5c Yonghong Song          2020-05-09  11179  		if (!btf_type_is_func_proto(t))
15d83c4d7cef5c Yonghong Song          2020-05-09  11180  			return -EINVAL;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11181  		ret = btf_distill_func_proto(log, btf, t, tname, fmodel);
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11182  		if (ret)
15d83c4d7cef5c Yonghong Song          2020-05-09  11183  			return ret;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11184  		break;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11185  	default:
be8704ff07d237 Alexei Starovoitov     2020-01-20  11186  		if (!prog_extension)
be8704ff07d237 Alexei Starovoitov     2020-01-20  11187  			return -EINVAL;
be8704ff07d237 Alexei Starovoitov     2020-01-20  11188  		/* fallthrough */
ae24082331d9bb KP Singh               2020-03-04  11189  	case BPF_MODIFY_RETURN:
9e4e01dfd3254c KP Singh               2020-03-29  11190  	case BPF_LSM_MAC:
fec56f5890d93f Alexei Starovoitov     2019-11-14  11191  	case BPF_TRACE_FENTRY:
fec56f5890d93f Alexei Starovoitov     2019-11-14  11192  	case BPF_TRACE_FEXIT:
fec56f5890d93f Alexei Starovoitov     2019-11-14  11193  		if (!btf_type_is_func(t)) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11194  			bpf_log(log, "attach_btf_id %u is not a function\n",
fec56f5890d93f Alexei Starovoitov     2019-11-14  11195  				btf_id);
fec56f5890d93f Alexei Starovoitov     2019-11-14  11196  			return -EINVAL;
fec56f5890d93f Alexei Starovoitov     2019-11-14  11197  		}
be8704ff07d237 Alexei Starovoitov     2020-01-20  11198  		if (prog_extension &&
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11199  		    btf_check_type_match(log, prog, btf, t))
be8704ff07d237 Alexei Starovoitov     2020-01-20  11200  			return -EINVAL;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11201  		t = btf_type_by_id(btf, t->type);
fec56f5890d93f Alexei Starovoitov     2019-11-14  11202  		if (!btf_type_is_func_proto(t))
fec56f5890d93f Alexei Starovoitov     2019-11-14  11203  			return -EINVAL;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11204  
63e92b3278bbe1 Toke Høiland-Jørgensen 2020-09-15  11205  		if ((prog->aux->tgt_prog_type &&
63e92b3278bbe1 Toke Høiland-Jørgensen 2020-09-15 @11206  		     prog->aux->tgt_prog_type != tgt_prog->type) ||
63e92b3278bbe1 Toke Høiland-Jørgensen 2020-09-15  11207  		    (prog->aux->tgt_attach_type &&
63e92b3278bbe1 Toke Høiland-Jørgensen 2020-09-15  11208  		     prog->aux->tgt_attach_type != tgt_prog->expected_attach_type))
63e92b3278bbe1 Toke Høiland-Jørgensen 2020-09-15  11209  			return -EINVAL;
63e92b3278bbe1 Toke Høiland-Jørgensen 2020-09-15  11210  
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11211  		if (tgt_prog && conservative)
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11212  			t = NULL;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11213  
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11214  		ret = btf_distill_func_proto(log, btf, t, tname, fmodel);
fec56f5890d93f Alexei Starovoitov     2019-11-14  11215  		if (ret < 0)
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11216  			return ret;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11217  
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11218  		if (tgt_prog) {
e9eeec58c992c4 Yonghong Song          2019-12-04  11219  			if (subprog == 0)
e9eeec58c992c4 Yonghong Song          2019-12-04  11220  				addr = (long) tgt_prog->bpf_func;
e9eeec58c992c4 Yonghong Song          2019-12-04  11221  			else
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11222  				addr = (long) tgt_prog->aux->func[subprog]->bpf_func;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11223  		} else {
fec56f5890d93f Alexei Starovoitov     2019-11-14  11224  			addr = kallsyms_lookup_name(tname);
fec56f5890d93f Alexei Starovoitov     2019-11-14  11225  			if (!addr) {
2bc773a4b52761 Toke Høiland-Jørgensen 2020-09-15  11226  				bpf_log(log,
fec56f5890d93f Alexei Starovoitov     2019-11-14  11227  					"The address of function %s cannot be found\n",
fec56f5890d93f Alexei Starovoitov     2019-11-14  11228  					tname);
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11229  				return -ENOENT;
fec56f5890d93f Alexei Starovoitov     2019-11-14  11230  			}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  11231  		}
18644cec714aab Alexei Starovoitov     2020-05-28  11232  
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11233  		if (prog->aux->sleepable) {
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11234  			ret = -EINVAL;
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11235  			switch (prog->type) {
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11236  			case BPF_PROG_TYPE_TRACING:
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11237  				/* fentry/fexit/fmod_ret progs can be sleepable only if they are
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11238  				 * attached to ALLOW_ERROR_INJECTION and are not in denylist.
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11239  				 */
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11240  				if (!check_non_sleepable_error_inject(btf_id) &&
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11241  				    within_error_injection_list(addr))
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11242  					ret = 0;
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11243  				break;
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11244  			case BPF_PROG_TYPE_LSM:
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11245  				/* LSM progs check that they are attached to bpf_lsm_*() funcs.
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11246  				 * Only some of them are sleepable.
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11247  				 */
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11248  				if (check_sleepable_lsm_hook(btf_id))
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11249  					ret = 0;
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11250  				break;
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11251  			default:
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11252  				break;
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11253  			}
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11254  			if (ret) {
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11255  				bpf_log(log, "%s is not sleepable\n", tname);
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11256  				return ret;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11257  			}
1e6c62a8821557 Alexei Starovoitov     2020-08-27  11258  		} else if (prog->expected_attach_type == BPF_MODIFY_RETURN) {
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11259  			ret = check_attach_modify_return(prog, addr, tname);
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11260  			if (ret) {
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11261  				bpf_log(log, "%s() is not modifiable\n", tname);
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11262  				return ret;
18644cec714aab Alexei Starovoitov     2020-05-28  11263  			}
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11264  		}
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11265  
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11266  		break;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11267  	}
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11268  	*tgt_addr = addr;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11269  	if (tgt_name)
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11270  		*tgt_name = tname;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11271  	if (tgt_type)
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11272  		*tgt_type = t;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11273  	return 0;
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11274  }
23c5f908e2d812 Toke Høiland-Jørgensen 2020-09-15  11275  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2020-09-17 18:44 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-15 11:40 [PATCH bpf-next v5 0/8] bpf: Support multi-attach for freplace programs Toke Høiland-Jørgensen
2020-09-15 11:40 ` [PATCH bpf-next v5 1/8] bpf: change logging calls from verbose() to bpf_log() and use log pointer Toke Høiland-Jørgensen
2020-09-16 17:08   ` Andrii Nakryiko
2020-09-15 11:40 ` [PATCH bpf-next v5 2/8] bpf: verifier: refactor check_attach_btf_id() Toke Høiland-Jørgensen
2020-09-16 17:32   ` Andrii Nakryiko
2020-09-16 21:07     ` Toke Høiland-Jørgensen
2020-09-17 10:06     ` Toke Høiland-Jørgensen
2020-09-17 16:38       ` Andrii Nakryiko
2020-09-17 16:54         ` Toke Høiland-Jørgensen
2020-09-15 11:41 ` [PATCH bpf-next v5 3/8] bpf: move prog->aux->linked_prog and trampoline into bpf_link on attach Toke Høiland-Jørgensen
2020-09-16 18:22   ` Andrii Nakryiko
2020-09-15 11:41 ` [PATCH bpf-next v5 4/8] bpf: support attaching freplace programs to multiple attach points Toke Høiland-Jørgensen
2020-09-16 19:49   ` Andrii Nakryiko
2020-09-16 21:13     ` Toke Høiland-Jørgensen
2020-09-16 21:17       ` Andrii Nakryiko
2020-09-16 21:27         ` Toke Høiland-Jørgensen
2020-09-15 11:41 ` [PATCH bpf-next v5 5/8] bpf: Fix context type resolving for extension programs Toke Høiland-Jørgensen
2020-09-16 19:59   ` Andrii Nakryiko
2020-09-16 20:28     ` Andrii Nakryiko
2020-09-16 21:15       ` Toke Høiland-Jørgensen
2020-09-17 17:10       ` Toke Høiland-Jørgensen
2020-09-17 18:06         ` Andrii Nakryiko
2020-09-17 18:44           ` Toke Høiland-Jørgensen
2020-09-15 11:41 ` [PATCH bpf-next v5 6/8] libbpf: add support for freplace attachment in bpf_link_create Toke Høiland-Jørgensen
2020-09-16 20:37   ` Andrii Nakryiko
2020-09-16 20:45     ` Andrii Nakryiko
2020-09-16 21:21       ` Toke Høiland-Jørgensen
2020-09-16 21:24         ` Andrii Nakryiko
2020-09-16 21:41           ` Toke Høiland-Jørgensen
2020-09-15 11:41 ` [PATCH bpf-next v5 7/8] selftests: add test for multiple attachments of freplace program Toke Høiland-Jørgensen
2020-09-15 11:41 ` [PATCH bpf-next v5 8/8] selftests/bpf: Adding test for arg dereference in extension trace Toke Høiland-Jørgensen
2020-09-16 20:44   ` Andrii Nakryiko
2020-09-16 23:46 [PATCH bpf-next v5 4/8] bpf: support attaching freplace programs to multiple attach points kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.