Reduce bpf_core_apply_relo_insn() stack usage and bump BPF_CORE_SPEC_MAX_LEN limit back to 64.
Showing the changes to kernel (1 of 4 files). Show all
Unified · Split
| @@ -6742,8 +6742,16 @@ int bpf_core_apply(struct bpf_core_ctx *ctx, const struct bpf_core_relo *relo, · 6741 unmodified lines | ||
| 6742 | 6742 | { |
| 6743 | 6743 | bool need_cands = relo->kind != BPF_CORE_TYPE_ID_LOCAL; |
| 6744 | 6744 | struct bpf_core_cand_list cands = {}; |
| 6745 | + struct bpf_core_spec *specs; | |
| 6745 | 6746 | int err; |
| 6746 | 6747 | |
| 6748 | + /* ~4k of temp memory necessary to convert LLVM spec like "0:1:0:5" | |
| 6749 | + * into arrays of btf_ids of struct fields and array indices. | |
| 6750 | + */ | |
| 6751 | + specs = kcalloc(3, sizeof(*specs), GFP_KERNEL); | |
| 6752 | + if (!specs) | |
| 6753 | + return -ENOMEM; | |
| 6754 | + | |
| 6747 | 6755 | if (need_cands) { |
| 6748 | 6756 | struct bpf_cand_cache *cc; |
| 6749 | 6757 | int i; |
| @@ -6779,8 +6787,9 @@ int bpf_core_apply(struct bpf_core_ctx *ctx, const struct bpf_core_relo *relo, · 29 unmodified lines | ||
| 6779 | 6787 | } |
| 6780 | 6788 | |
| 6781 | 6789 | err = bpf_core_apply_relo_insn((void *)ctx->log, insn, relo->insn_off / 8, |
| 6782 | − relo, relo_idx, ctx->btf, &cands); | |
| 6790 | + relo, relo_idx, ctx->btf, &cands, specs); | |
| 6783 | 6791 | out: |
| 6792 | + kfree(specs); | |
| 6784 | 6793 | if (need_cands) { |
| 6785 | 6794 | kfree(cands.cands); |
| 6786 | 6795 | mutex_unlock(&cand_cache_mutex); |