On 08/22/2017 08:36 AM, Shubham Bansal wrote: [...]
+ +static int out_offset = -1; /* initialized on the first pass of build_body() */
Hm, why is this a global var actually? There can be multiple parallel calls to bpf_int_jit_compile(), we don't take a global lock on this. Unless I'm missing something this should really reside in jit_ctx, no? Given this is on emit_bpf_tail_call(), did you get tail calls working the way I suggested to test?
+static int emit_bpf_tail_call(struct jit_ctx *ctx) {
[...]
+ const int idx0 = ctx->idx; +#define cur_offset (ctx->idx - idx0) +#define jmp_offset (out_offset - (cur_offset))
[...]
+ + /* out: */ + if (out_offset == -1) + out_offset = cur_offset; + if (cur_offset != out_offset) { + pr_err_once("tail_call out_offset = %d, expected %d!\n", + cur_offset, out_offset); + return -1; + } + return 0; +#undef cur_offset +#undef jmp_offset }