| .. | .. |
|---|
| 83 | 83 | prog = orig_prog; |
|---|
| 84 | 84 | goto out_offset; |
|---|
| 85 | 85 | } |
|---|
| 86 | + |
|---|
| 87 | + if (build_body(ctx, extra_pass, NULL)) { |
|---|
| 88 | + prog = orig_prog; |
|---|
| 89 | + goto out_offset; |
|---|
| 90 | + } |
|---|
| 91 | + |
|---|
| 86 | 92 | for (i = 0; i < prog->len; i++) { |
|---|
| 87 | 93 | prev_ninsns += 32; |
|---|
| 88 | 94 | ctx->offset[i] = prev_ninsns; |
|---|
| .. | .. |
|---|
| 91 | 97 | for (i = 0; i < NR_JIT_ITERATIONS; i++) { |
|---|
| 92 | 98 | pass++; |
|---|
| 93 | 99 | ctx->ninsns = 0; |
|---|
| 100 | + |
|---|
| 101 | + bpf_jit_build_prologue(ctx); |
|---|
| 102 | + ctx->prologue_len = ctx->ninsns; |
|---|
| 103 | + |
|---|
| 94 | 104 | if (build_body(ctx, extra_pass, ctx->offset)) { |
|---|
| 95 | 105 | prog = orig_prog; |
|---|
| 96 | 106 | goto out_offset; |
|---|
| 97 | 107 | } |
|---|
| 98 | | - bpf_jit_build_prologue(ctx); |
|---|
| 108 | + |
|---|
| 99 | 109 | ctx->epilogue_offset = ctx->ninsns; |
|---|
| 100 | 110 | bpf_jit_build_epilogue(ctx); |
|---|
| 101 | 111 | |
|---|
| .. | .. |
|---|
| 153 | 163 | bpf_flush_icache(jit_data->header, ctx->insns + ctx->ninsns); |
|---|
| 154 | 164 | |
|---|
| 155 | 165 | if (!prog->is_func || extra_pass) { |
|---|
| 166 | + bpf_jit_binary_lock_ro(jit_data->header); |
|---|
| 167 | + for (i = 0; i < prog->len; i++) |
|---|
| 168 | + ctx->offset[i] = ninsns_rvoff(ctx->offset[i]); |
|---|
| 169 | + bpf_prog_fill_jited_linfo(prog, ctx->offset); |
|---|
| 156 | 170 | out_offset: |
|---|
| 157 | 171 | kfree(ctx->offset); |
|---|
| 158 | 172 | kfree(jit_data); |
|---|
| .. | .. |
|---|
| 165 | 179 | tmp : orig_prog); |
|---|
| 166 | 180 | return prog; |
|---|
| 167 | 181 | } |
|---|
| 182 | + |
|---|
| 183 | +void *bpf_jit_alloc_exec(unsigned long size) |
|---|
| 184 | +{ |
|---|
| 185 | + return __vmalloc_node_range(size, PAGE_SIZE, BPF_JIT_REGION_START, |
|---|
| 186 | + BPF_JIT_REGION_END, GFP_KERNEL, |
|---|
| 187 | + PAGE_KERNEL, 0, NUMA_NO_NODE, |
|---|
| 188 | + __builtin_return_address(0)); |
|---|
| 189 | +} |
|---|
| 190 | + |
|---|
| 191 | +void bpf_jit_free_exec(void *addr) |
|---|
| 192 | +{ |
|---|
| 193 | + return vfree(addr); |
|---|
| 194 | +} |
|---|