aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Holzheu <holzheu@linux.vnet.ibm.com>2017-11-07 13:16:25 -0500
committerHeiko Carstens <heiko.carstens@de.ibm.com>2017-11-10 12:57:37 -0500
commit78372709bf95c2ef5c886780efc268f7f052168a (patch)
tree11f908545f711b32ab60a2dd2ce2f749c1b26f44
parent22841cea1a10832d07f16720c718f6795f35fe2a (diff)
s390/bpf: take advantage of stack_depth tracking
Make use of the "stack_depth" tracking feature introduced with commit 8726679a0fa31 ("bpf: teach verifier to track stack depth") for the s390 JIT, so that stack usage can be reduced. Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
-rw-r--r--arch/s390/net/bpf_jit.h7
-rw-r--r--arch/s390/net/bpf_jit_comp.c26
2 files changed, 18 insertions, 15 deletions
diff --git a/arch/s390/net/bpf_jit.h b/arch/s390/net/bpf_jit.h
index fda605dbc1b4..5057728b300e 100644
--- a/arch/s390/net/bpf_jit.h
+++ b/arch/s390/net/bpf_jit.h
@@ -52,10 +52,13 @@ extern u8 sk_load_word[], sk_load_half[], sk_load_byte[];
52 * 52 *
53 * We get 160 bytes stack space from calling function, but only use 53 * We get 160 bytes stack space from calling function, but only use
54 * 12 * 8 byte for old backchain, r15..r6, and tail_call_cnt. 54 * 12 * 8 byte for old backchain, r15..r6, and tail_call_cnt.
55 *
56 * The stack size used by the BPF program ("BPF stack" above) is passed
57 * via "aux->stack_depth".
55 */ 58 */
56#define STK_SPACE (MAX_BPF_STACK + 8 + 8 + 4 + 4 + 160) 59#define STK_SPACE_ADD (8 + 8 + 4 + 4 + 160)
57#define STK_160_UNUSED (160 - 12 * 8) 60#define STK_160_UNUSED (160 - 12 * 8)
58#define STK_OFF (STK_SPACE - STK_160_UNUSED) 61#define STK_OFF (STK_SPACE_ADD - STK_160_UNUSED)
59#define STK_OFF_TMP 160 /* Offset of tmp buffer on stack */ 62#define STK_OFF_TMP 160 /* Offset of tmp buffer on stack */
60#define STK_OFF_HLEN 168 /* Offset of SKB header length on stack */ 63#define STK_OFF_HLEN 168 /* Offset of SKB header length on stack */
61#define STK_OFF_SKBP 176 /* Offset of SKB pointer on stack */ 64#define STK_OFF_SKBP 176 /* Offset of SKB pointer on stack */
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
index 8ec88497a28d..6730652b1a75 100644
--- a/arch/s390/net/bpf_jit_comp.c
+++ b/arch/s390/net/bpf_jit_comp.c
@@ -319,12 +319,12 @@ static void save_regs(struct bpf_jit *jit, u32 rs, u32 re)
319/* 319/*
320 * Restore registers from "rs" (register start) to "re" (register end) on stack 320 * Restore registers from "rs" (register start) to "re" (register end) on stack
321 */ 321 */
322static void restore_regs(struct bpf_jit *jit, u32 rs, u32 re) 322static void restore_regs(struct bpf_jit *jit, u32 rs, u32 re, u32 stack_depth)
323{ 323{
324 u32 off = STK_OFF_R6 + (rs - 6) * 8; 324 u32 off = STK_OFF_R6 + (rs - 6) * 8;
325 325
326 if (jit->seen & SEEN_STACK) 326 if (jit->seen & SEEN_STACK)
327 off += STK_OFF; 327 off += STK_OFF + stack_depth;
328 328
329 if (rs == re) 329 if (rs == re)
330 /* lg %rs,off(%r15) */ 330 /* lg %rs,off(%r15) */
@@ -368,7 +368,7 @@ static int get_end(struct bpf_jit *jit, int start)
368 * Save and restore clobbered registers (6-15) on stack. 368 * Save and restore clobbered registers (6-15) on stack.
369 * We save/restore registers in chunks with gap >= 2 registers. 369 * We save/restore registers in chunks with gap >= 2 registers.
370 */ 370 */
371static void save_restore_regs(struct bpf_jit *jit, int op) 371static void save_restore_regs(struct bpf_jit *jit, int op, u32 stack_depth)
372{ 372{
373 373
374 int re = 6, rs; 374 int re = 6, rs;
@@ -381,7 +381,7 @@ static void save_restore_regs(struct bpf_jit *jit, int op)
381 if (op == REGS_SAVE) 381 if (op == REGS_SAVE)
382 save_regs(jit, rs, re); 382 save_regs(jit, rs, re);
383 else 383 else
384 restore_regs(jit, rs, re); 384 restore_regs(jit, rs, re, stack_depth);
385 re++; 385 re++;
386 } while (re <= 15); 386 } while (re <= 15);
387} 387}
@@ -413,7 +413,7 @@ static void emit_load_skb_data_hlen(struct bpf_jit *jit)
413 * Save registers and create stack frame if necessary. 413 * Save registers and create stack frame if necessary.
414 * See stack frame layout desription in "bpf_jit.h"! 414 * See stack frame layout desription in "bpf_jit.h"!
415 */ 415 */
416static void bpf_jit_prologue(struct bpf_jit *jit) 416static void bpf_jit_prologue(struct bpf_jit *jit, u32 stack_depth)
417{ 417{
418 if (jit->seen & SEEN_TAIL_CALL) { 418 if (jit->seen & SEEN_TAIL_CALL) {
419 /* xc STK_OFF_TCCNT(4,%r15),STK_OFF_TCCNT(%r15) */ 419 /* xc STK_OFF_TCCNT(4,%r15),STK_OFF_TCCNT(%r15) */
@@ -426,7 +426,7 @@ static void bpf_jit_prologue(struct bpf_jit *jit)
426 /* Tail calls have to skip above initialization */ 426 /* Tail calls have to skip above initialization */
427 jit->tail_call_start = jit->prg; 427 jit->tail_call_start = jit->prg;
428 /* Save registers */ 428 /* Save registers */
429 save_restore_regs(jit, REGS_SAVE); 429 save_restore_regs(jit, REGS_SAVE, stack_depth);
430 /* Setup literal pool */ 430 /* Setup literal pool */
431 if (jit->seen & SEEN_LITERAL) { 431 if (jit->seen & SEEN_LITERAL) {
432 /* basr %r13,0 */ 432 /* basr %r13,0 */
@@ -441,7 +441,7 @@ static void bpf_jit_prologue(struct bpf_jit *jit)
441 /* la %bfp,STK_160_UNUSED(%r15) (BPF frame pointer) */ 441 /* la %bfp,STK_160_UNUSED(%r15) (BPF frame pointer) */
442 EMIT4_DISP(0x41000000, BPF_REG_FP, REG_15, STK_160_UNUSED); 442 EMIT4_DISP(0x41000000, BPF_REG_FP, REG_15, STK_160_UNUSED);
443 /* aghi %r15,-STK_OFF */ 443 /* aghi %r15,-STK_OFF */
444 EMIT4_IMM(0xa70b0000, REG_15, -STK_OFF); 444 EMIT4_IMM(0xa70b0000, REG_15, -(STK_OFF + stack_depth));
445 if (jit->seen & SEEN_FUNC) 445 if (jit->seen & SEEN_FUNC)
446 /* stg %w1,152(%r15) (backchain) */ 446 /* stg %w1,152(%r15) (backchain) */
447 EMIT6_DISP_LH(0xe3000000, 0x0024, REG_W1, REG_0, 447 EMIT6_DISP_LH(0xe3000000, 0x0024, REG_W1, REG_0,
@@ -458,7 +458,7 @@ static void bpf_jit_prologue(struct bpf_jit *jit)
458/* 458/*
459 * Function epilogue 459 * Function epilogue
460 */ 460 */
461static void bpf_jit_epilogue(struct bpf_jit *jit) 461static void bpf_jit_epilogue(struct bpf_jit *jit, u32 stack_depth)
462{ 462{
463 /* Return 0 */ 463 /* Return 0 */
464 if (jit->seen & SEEN_RET0) { 464 if (jit->seen & SEEN_RET0) {
@@ -470,7 +470,7 @@ static void bpf_jit_epilogue(struct bpf_jit *jit)
470 /* Load exit code: lgr %r2,%b0 */ 470 /* Load exit code: lgr %r2,%b0 */
471 EMIT4(0xb9040000, REG_2, BPF_REG_0); 471 EMIT4(0xb9040000, REG_2, BPF_REG_0);
472 /* Restore registers */ 472 /* Restore registers */
473 save_restore_regs(jit, REGS_RESTORE); 473 save_restore_regs(jit, REGS_RESTORE, stack_depth);
474 /* br %r14 */ 474 /* br %r14 */
475 _EMIT2(0x07fe); 475 _EMIT2(0x07fe);
476} 476}
@@ -1018,7 +1018,7 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
1018 */ 1018 */
1019 1019
1020 if (jit->seen & SEEN_STACK) 1020 if (jit->seen & SEEN_STACK)
1021 off = STK_OFF_TCCNT + STK_OFF; 1021 off = STK_OFF_TCCNT + STK_OFF + fp->aux->stack_depth;
1022 else 1022 else
1023 off = STK_OFF_TCCNT; 1023 off = STK_OFF_TCCNT;
1024 /* lhi %w0,1 */ 1024 /* lhi %w0,1 */
@@ -1046,7 +1046,7 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
1046 /* 1046 /*
1047 * Restore registers before calling function 1047 * Restore registers before calling function
1048 */ 1048 */
1049 save_restore_regs(jit, REGS_RESTORE); 1049 save_restore_regs(jit, REGS_RESTORE, fp->aux->stack_depth);
1050 1050
1051 /* 1051 /*
1052 * goto *(prog->bpf_func + tail_call_start); 1052 * goto *(prog->bpf_func + tail_call_start);
@@ -1272,7 +1272,7 @@ static int bpf_jit_prog(struct bpf_jit *jit, struct bpf_prog *fp)
1272 jit->lit = jit->lit_start; 1272 jit->lit = jit->lit_start;
1273 jit->prg = 0; 1273 jit->prg = 0;
1274 1274
1275 bpf_jit_prologue(jit); 1275 bpf_jit_prologue(jit, fp->aux->stack_depth);
1276 for (i = 0; i < fp->len; i += insn_count) { 1276 for (i = 0; i < fp->len; i += insn_count) {
1277 insn_count = bpf_jit_insn(jit, fp, i); 1277 insn_count = bpf_jit_insn(jit, fp, i);
1278 if (insn_count < 0) 1278 if (insn_count < 0)
@@ -1280,7 +1280,7 @@ static int bpf_jit_prog(struct bpf_jit *jit, struct bpf_prog *fp)
1280 /* Next instruction address */ 1280 /* Next instruction address */
1281 jit->addrs[i + insn_count] = jit->prg; 1281 jit->addrs[i + insn_count] = jit->prg;
1282 } 1282 }
1283 bpf_jit_epilogue(jit); 1283 bpf_jit_epilogue(jit, fp->aux->stack_depth);
1284 1284
1285 jit->lit_start = jit->prg; 1285 jit->lit_start = jit->prg;
1286 jit->size = jit->lit; 1286 jit->size = jit->lit;