libbpf: Support BTF_KIND_FLOAT during type compatibility checks in CO-RE
authorAndrii Nakryiko <andrii@kernel.org>
Mon, 26 Apr 2021 19:29:46 +0000 (12:29 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 27 Apr 2021 01:37:13 +0000 (18:37 -0700)
Add BTF_KIND_FLOAT support when doing CO-RE field type compatibility check.
Without this, relocations against float/double fields will fail.

Also adjust one error message to emit instruction index instead of less
convenient instruction byte offset.

Fixes: 22541a9eeb0d ("libbpf: Add BTF_KIND_FLOAT support")
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Lorenz Bauer <lmb@cloudflare.com>
Link: https://lore.kernel.org/bpf/20210426192949.416837-3-andrii@kernel.org
tools/lib/bpf/libbpf.c

index a1cddd17af7d0d0d7163a3039e94fcf845795a91..e2a3cf4378140f2ccabe45df70d40accc63d7bb3 100644 (file)
@@ -5115,6 +5115,7 @@ err_out:
  *     least one of enums should be anonymous;
  *   - for ENUMs, check sizes, names are ignored;
  *   - for INT, size and signedness are ignored;
+ *   - any two FLOATs are always compatible;
  *   - for ARRAY, dimensionality is ignored, element types are checked for
  *     compatibility recursively;
  *   - everything else shouldn't be ever a target of relocation.
@@ -5141,6 +5142,7 @@ recur:
 
        switch (btf_kind(local_type)) {
        case BTF_KIND_PTR:
+       case BTF_KIND_FLOAT:
                return 1;
        case BTF_KIND_FWD:
        case BTF_KIND_ENUM: {
@@ -6245,8 +6247,8 @@ patch_insn:
        /* bpf_core_patch_insn() should know how to handle missing targ_spec */
        err = bpf_core_patch_insn(prog, relo, relo_idx, &targ_res);
        if (err) {
-               pr_warn("prog '%s': relo #%d: failed to patch insn at offset %d: %d\n",
-                       prog->name, relo_idx, relo->insn_off, err);
+               pr_warn("prog '%s': relo #%d: failed to patch insn #%zu: %d\n",
+                       prog->name, relo_idx, relo->insn_off / BPF_INSN_SZ, err);
                return -EINVAL;
        }