On 08/22/2017 05:08 PM, Daniel Borkmann wrote:
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?

Hm, okay, it's for generating the out jmp offsets in
tail call emission which are supposed to always be the
same relative offsets; should be fine then.

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
  }

Reply via email to