mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-26 12:34:41 +08:00
78c1f8d063
Reduce bpf_core_apply_relo_insn() stack usage and bump
BPF_CORE_SPEC_MAX_LEN limit back to 64.
Fixes: 29db4bea1d
("bpf: Prepare relo_core.c for kernel duty.")
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20211203182836.16646-1-alexei.starovoitov@gmail.com
58 lines
1.6 KiB
C
58 lines
1.6 KiB
C
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
|
|
/* Copyright (c) 2019 Facebook */
|
|
|
|
#ifndef __RELO_CORE_H
|
|
#define __RELO_CORE_H
|
|
|
|
#include <linux/bpf.h>
|
|
|
|
struct bpf_core_cand {
|
|
const struct btf *btf;
|
|
__u32 id;
|
|
};
|
|
|
|
/* dynamically sized list of type IDs and its associated struct btf */
|
|
struct bpf_core_cand_list {
|
|
struct bpf_core_cand *cands;
|
|
int len;
|
|
};
|
|
|
|
#define BPF_CORE_SPEC_MAX_LEN 64
|
|
|
|
/* represents BPF CO-RE field or array element accessor */
|
|
struct bpf_core_accessor {
|
|
__u32 type_id; /* struct/union type or array element type */
|
|
__u32 idx; /* field index or array index */
|
|
const char *name; /* field name or NULL for array accessor */
|
|
};
|
|
|
|
struct bpf_core_spec {
|
|
const struct btf *btf;
|
|
/* high-level spec: named fields and array indices only */
|
|
struct bpf_core_accessor spec[BPF_CORE_SPEC_MAX_LEN];
|
|
/* original unresolved (no skip_mods_or_typedefs) root type ID */
|
|
__u32 root_type_id;
|
|
/* CO-RE relocation kind */
|
|
enum bpf_core_relo_kind relo_kind;
|
|
/* high-level spec length */
|
|
int len;
|
|
/* raw, low-level spec: 1-to-1 with accessor spec string */
|
|
int raw_spec[BPF_CORE_SPEC_MAX_LEN];
|
|
/* raw spec length */
|
|
int raw_len;
|
|
/* field bit offset represented by spec */
|
|
__u32 bit_offset;
|
|
};
|
|
|
|
int bpf_core_apply_relo_insn(const char *prog_name,
|
|
struct bpf_insn *insn, int insn_idx,
|
|
const struct bpf_core_relo *relo, int relo_idx,
|
|
const struct btf *local_btf,
|
|
struct bpf_core_cand_list *cands,
|
|
struct bpf_core_spec *specs_scratch);
|
|
int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id,
|
|
const struct btf *targ_btf, __u32 targ_id);
|
|
|
|
size_t bpf_core_essential_name_len(const char *name);
|
|
#endif
|