diff options
author | Michael Holzheu <holzheu@linux.vnet.ibm.com> | 2017-11-07 13:16:25 -0500 |
---|---|---|
committer | Heiko Carstens <heiko.carstens@de.ibm.com> | 2017-11-10 12:57:37 -0500 |
commit | 78372709bf95c2ef5c886780efc268f7f052168a (patch) | |
tree | 11f908545f711b32ab60a2dd2ce2f749c1b26f44 | |
parent | 22841cea1a10832d07f16720c718f6795f35fe2a (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.h | 7 | ||||
-rw-r--r-- | arch/s390/net/bpf_jit_comp.c | 26 |
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 | */ |
322 | static void restore_regs(struct bpf_jit *jit, u32 rs, u32 re) | 322 | static 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 | */ |
371 | static void save_restore_regs(struct bpf_jit *jit, int op) | 371 | static 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 | */ |
416 | static void bpf_jit_prologue(struct bpf_jit *jit) | 416 | static 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 | */ |
461 | static void bpf_jit_epilogue(struct bpf_jit *jit) | 461 | static 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; |