*             [   nv gpr save area    ] 8*8           |
  *             [    tail_call_cnt      ] 8             |
  *             [    local_tmp_var      ] 8             |
- * fp (r31) -->        [   ebpf stack space    ] 512           |
+ * fp (r31) -->        [   ebpf stack space    ] upto 512      |
  *             [     frame header      ] 32/112        |
  * sp (r1) --->        [    stack pointer      ] --------------
  */
 #define BPF_PPC_STACK_SAVE     (8*8)
 /* for bpf JIT code internal usage */
 #define BPF_PPC_STACK_LOCALS   16
-/* Ensure this is quadword aligned */
-#define BPF_PPC_STACKFRAME     (STACK_FRAME_MIN_SIZE + MAX_BPF_STACK + \
+/* stack frame excluding BPF stack, ensure this is quadword aligned */
+#define BPF_PPC_STACKFRAME     (STACK_FRAME_MIN_SIZE + \
                                 BPF_PPC_STACK_LOCALS + BPF_PPC_STACK_SAVE)
 
 #ifndef __ASSEMBLY__
         */
        unsigned int seen;
        unsigned int idx;
+       unsigned int stack_size;
 };
 
 #endif /* !__ASSEMBLY__ */
 
 static int bpf_jit_stack_local(struct codegen_context *ctx)
 {
        if (bpf_has_stack_frame(ctx))
-               return STACK_FRAME_MIN_SIZE + MAX_BPF_STACK;
+               return STACK_FRAME_MIN_SIZE + ctx->stack_size;
        else
                return -(BPF_PPC_STACK_SAVE + 16);
 }
 static int bpf_jit_stack_offsetof(struct codegen_context *ctx, int reg)
 {
        if (reg >= BPF_PPC_NVR_MIN && reg < 32)
-               return (bpf_has_stack_frame(ctx) ? BPF_PPC_STACKFRAME : 0)
-                                                       - (8 * (32 - reg));
+               return (bpf_has_stack_frame(ctx) ?
+                       (BPF_PPC_STACKFRAME + ctx->stack_size) : 0)
+                               - (8 * (32 - reg));
 
        pr_err("BPF JIT is asking about unknown registers");
        BUG();
                        PPC_BPF_STL(0, 1, PPC_LR_STKOFF);
                }
 
-               PPC_BPF_STLU(1, 1, -BPF_PPC_STACKFRAME);
+               PPC_BPF_STLU(1, 1, -(BPF_PPC_STACKFRAME + ctx->stack_size));
        }
 
        /*
        /* Setup frame pointer to point to the bpf stack area */
        if (bpf_is_seen_register(ctx, BPF_REG_FP))
                PPC_ADDI(b2p[BPF_REG_FP], 1,
-                               STACK_FRAME_MIN_SIZE + MAX_BPF_STACK);
+                               STACK_FRAME_MIN_SIZE + ctx->stack_size);
 }
 
 static void bpf_jit_emit_common_epilogue(u32 *image, struct codegen_context *ctx)
 
        /* Tear down our stack frame */
        if (bpf_has_stack_frame(ctx)) {
-               PPC_ADDI(1, 1, BPF_PPC_STACKFRAME);
+               PPC_ADDI(1, 1, BPF_PPC_STACKFRAME + ctx->stack_size);
                if (ctx->seen & SEEN_FUNC) {
                        PPC_BPF_LL(0, 1, PPC_LR_STKOFF);
                        PPC_MTLR(0);
 
        memset(&cgctx, 0, sizeof(struct codegen_context));
 
+       /* Make sure that the stack is quadword aligned. */
+       cgctx.stack_size = round_up(fp->aux->stack_depth, 16);
+
        /* Scouting faux-generate pass 0 */
        if (bpf_jit_build_body(fp, 0, &cgctx, addrs)) {
                /* We hit something illegal or unsupported. */