.. | .. |
---|
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 | +} |
---|