Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390: bpf: eliminate zero extension code-gen

Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Jiong Wang and committed by
Alexei Starovoitov
591006b9 a4c92773

+34 -7
+34 -7
arch/s390/net/bpf_jit_comp.c
··· 299 299 300 300 #define EMIT_ZERO(b1) \ 301 301 ({ \ 302 - /* llgfr %dst,%dst (zero extend to 64 bit) */ \ 303 - EMIT4(0xb9160000, b1, b1); \ 304 - REG_SET_SEEN(b1); \ 302 + if (!fp->aux->verifier_zext) { \ 303 + /* llgfr %dst,%dst (zero extend to 64 bit) */ \ 304 + EMIT4(0xb9160000, b1, b1); \ 305 + REG_SET_SEEN(b1); \ 306 + } \ 305 307 }) 306 308 307 309 /* ··· 522 520 case BPF_ALU | BPF_MOV | BPF_X: /* dst = (u32) src */ 523 521 /* llgfr %dst,%src */ 524 522 EMIT4(0xb9160000, dst_reg, src_reg); 523 + if (insn_is_zext(&insn[1])) 524 + insn_count = 2; 525 525 break; 526 526 case BPF_ALU64 | BPF_MOV | BPF_X: /* dst = src */ 527 527 /* lgr %dst,%src */ ··· 532 528 case BPF_ALU | BPF_MOV | BPF_K: /* dst = (u32) imm */ 533 529 /* llilf %dst,imm */ 534 530 EMIT6_IMM(0xc00f0000, dst_reg, imm); 531 + if (insn_is_zext(&insn[1])) 532 + insn_count = 2; 535 533 break; 536 534 case BPF_ALU64 | BPF_MOV | BPF_K: /* dst = imm */ 537 535 /* lgfi %dst,imm */ ··· 645 639 EMIT4(0xb9970000, REG_W0, src_reg); 646 640 /* llgfr %dst,%rc */ 647 641 EMIT4(0xb9160000, dst_reg, rc_reg); 642 + if (insn_is_zext(&insn[1])) 643 + insn_count = 2; 648 644 break; 649 645 } 650 646 case BPF_ALU64 | BPF_DIV | BPF_X: /* dst = dst / src */ ··· 684 676 EMIT_CONST_U32(imm)); 685 677 /* llgfr %dst,%rc */ 686 678 EMIT4(0xb9160000, dst_reg, rc_reg); 679 + if (insn_is_zext(&insn[1])) 680 + insn_count = 2; 687 681 break; 688 682 } 689 683 case BPF_ALU64 | BPF_DIV | BPF_K: /* dst = dst / imm */ ··· 874 864 case 16: /* dst = (u16) cpu_to_be16(dst) */ 875 865 /* llghr %dst,%dst */ 876 866 EMIT4(0xb9850000, dst_reg, dst_reg); 867 + if (insn_is_zext(&insn[1])) 868 + insn_count = 2; 877 869 break; 878 870 case 32: /* dst = (u32) cpu_to_be32(dst) */ 879 - /* llgfr %dst,%dst */ 880 - EMIT4(0xb9160000, dst_reg, dst_reg); 871 + if (!fp->aux->verifier_zext) 872 + /* llgfr %dst,%dst */ 873 + EMIT4(0xb9160000, dst_reg, dst_reg); 881 874 break; 882 875 case 64: /* dst = (u64) cpu_to_be64(dst) */ 883 876 break; ··· 895 882 EMIT4_DISP(0x88000000, dst_reg, REG_0, 16); 896 883 /* llghr %dst,%dst */ 897 884 EMIT4(0xb9850000, dst_reg, dst_reg); 885 + if (insn_is_zext(&insn[1])) 886 + insn_count = 2; 898 887 break; 899 888 case 32: /* dst = (u32) cpu_to_le32(dst) */ 900 889 /* lrvr %dst,%dst */ 901 890 EMIT4(0xb91f0000, dst_reg, dst_reg); 902 - /* llgfr %dst,%dst */ 903 - EMIT4(0xb9160000, dst_reg, dst_reg); 891 + if (!fp->aux->verifier_zext) 892 + /* llgfr %dst,%dst */ 893 + EMIT4(0xb9160000, dst_reg, dst_reg); 904 894 break; 905 895 case 64: /* dst = (u64) cpu_to_le64(dst) */ 906 896 /* lrvgr %dst,%dst */ ··· 984 968 /* llgc %dst,0(off,%src) */ 985 969 EMIT6_DISP_LH(0xe3000000, 0x0090, dst_reg, src_reg, REG_0, off); 986 970 jit->seen |= SEEN_MEM; 971 + if (insn_is_zext(&insn[1])) 972 + insn_count = 2; 987 973 break; 988 974 case BPF_LDX | BPF_MEM | BPF_H: /* dst = *(u16 *)(ul) (src + off) */ 989 975 /* llgh %dst,0(off,%src) */ 990 976 EMIT6_DISP_LH(0xe3000000, 0x0091, dst_reg, src_reg, REG_0, off); 991 977 jit->seen |= SEEN_MEM; 978 + if (insn_is_zext(&insn[1])) 979 + insn_count = 2; 992 980 break; 993 981 case BPF_LDX | BPF_MEM | BPF_W: /* dst = *(u32 *)(ul) (src + off) */ 994 982 /* llgf %dst,off(%src) */ 995 983 jit->seen |= SEEN_MEM; 996 984 EMIT6_DISP_LH(0xe3000000, 0x0016, dst_reg, src_reg, REG_0, off); 985 + if (insn_is_zext(&insn[1])) 986 + insn_count = 2; 997 987 break; 998 988 case BPF_LDX | BPF_MEM | BPF_DW: /* dst = *(u64 *)(ul) (src + off) */ 999 989 /* lg %dst,0(off,%src) */ ··· 1302 1280 jit->size = jit->lit; 1303 1281 jit->size_prg = jit->prg; 1304 1282 return 0; 1283 + } 1284 + 1285 + bool bpf_jit_needs_zext(void) 1286 + { 1287 + return true; 1305 1288 } 1306 1289 1307 1290 /*