From patchwork Fri Jul 6 22:13:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 940730 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="cNETFBsW"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Mptl0LVjz9s2R for ; Sat, 7 Jul 2018 08:14:55 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932925AbeGFWOw (ORCPT ); Fri, 6 Jul 2018 18:14:52 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:40381 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754120AbeGFWOj (ORCPT ); Fri, 6 Jul 2018 18:14:39 -0400 Received: by mail-qk0-f193.google.com with SMTP id b129-v6so7078047qke.7 for ; Fri, 06 Jul 2018 15:14:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FTLN70jWWwX7Bnmat8pY+Qr2PTyVNNmcA3w+43GD7nM=; b=cNETFBsW3a+NVgawijwhQatmHkEL7uH2irLd5on5tqtUuibZHl4ZFyLQwRpLYRyUD7 K4SXlUEJ8xnJjBD0XOx1hIcclnYc3orVIHU1xTYgUq4FcIBnkJXSjfXPb1qC6jvPxMvK sOxjQmIA1ymuRCNpEtMkmIKImnkdIOO0fvDMnNuzsb/+CsQGPit/FcAZhOKT0wZWNB/I QLTKvJD4PNLMhr6CddLBoTQrz2uAimLcZinnGV/SSGjNCPCB/W2s7Vcga6M15nWL1sJ9 vsqaYV/ki0ZmIsASZ2n4pkBx5Y77sxvV1FzuL4nXFCk7ImDQKh+0GDTmhVxpR5w8zQNQ YxiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FTLN70jWWwX7Bnmat8pY+Qr2PTyVNNmcA3w+43GD7nM=; b=rnIiRxwQrQaF/Jk0a73zdaH9D4jB1VCuJMj7WAbDYZqLHZXFke3qQcT/g8yxPyZf88 vf4n1WAAaL1qvQG7fMbuX+NWtxrNZlp6SkdAWL+dQXu3hUshQwVrIOESMshbHZY0VN+Z ohLvuCbD29wl+P6fMOm4aNcjiz0+bAQqCTOcguviv08CJTRlotN0ILnR32iw8Mk+NC80 msvY0Z9DvGzEgJK3dDKkKf3FreHvqi7i+xAlydWFCB7vXRuVpRKZ4cFfw3CFDKmyHXpn tR/MrzpDjILyheP/tt9BNrT1UJPLdXNWvs0kusHHK0NaIQGot9QbJu/PZLrocNtnNLge 8erw== X-Gm-Message-State: APt69E1P2vyAnNdK0Pm9Gux1Vx8tSq/6NDtSGPuLdBFW/r6oPZCnw+oe SaftT5T0sOzlZpCVlfs36TJGRA== X-Google-Smtp-Source: AAOMgpeWC9ay0htCBUYnI7Bl42grY+piBFMkS4IqvIQlbTCfbY1ELCG6PwNA8GMBeTGEmru1RB9F+Q== X-Received: by 2002:a37:2711:: with SMTP id n17-v6mr2519555qkn.109.1530915278295; Fri, 06 Jul 2018 15:14:38 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id 42-v6sm7949968qtz.45.2018.07.06.15.14.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 06 Jul 2018 15:14:37 -0700 (PDT) From: Jakub Kicinski To: alexei.starovoitov@gmail.com, daniel@iogearbox.net Cc: Song Liu , oss-drivers@netronome.com, netdev@vger.kernel.org, Jiong Wang Subject: [PATCH bpf-next v2 3/6] nfp: bpf: copy range info for all operands of all ALU operations Date: Fri, 6 Jul 2018 15:13:20 -0700 Message-Id: <20180706221323.31688-4-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180706221323.31688-1-jakub.kicinski@netronome.com> References: <20180706221323.31688-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiong Wang NFP verifier hook is coping range information of the shift amount for indirect shift operation so optimized shift sequences could be generated. We want to use range info to do more things. For example, to decide whether multiplication and divide are supported on the given range. This patch simply let NFP verifier hook to copy range info for all operands of all ALU operands. Signed-off-by: Jiong Wang Reviewed-by: Jakub Kicinski Acked-by: Song Liu --- drivers/net/ethernet/netronome/nfp/bpf/main.h | 33 +++++++------------ .../net/ethernet/netronome/nfp/bpf/offload.c | 4 ++- .../net/ethernet/netronome/nfp/bpf/verifier.c | 6 +++- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h index 5975a19c28cb..c985d0ac61a3 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h @@ -265,6 +265,8 @@ struct nfp_bpf_reg_state { * @arg2: arg2 for call instructions * @umin_src: copy of core verifier umin_value for src opearnd. * @umax_src: copy of core verifier umax_value for src operand. + * @umin_dst: copy of core verifier umin_value for dst opearnd. + * @umax_dst: copy of core verifier umax_value for dst operand. * @off: index of first generated machine instruction (in nfp_prog.prog) * @n: eBPF instruction number * @flags: eBPF instruction extra optimization flags @@ -300,12 +302,15 @@ struct nfp_insn_meta { struct bpf_reg_state arg1; struct nfp_bpf_reg_state arg2; }; - /* We are interested in range info for some operands, - * for example, the shift amount which is kept in src operand. + /* We are interested in range info for operands of ALU + * operations. For example, shift amount, multiplicand and + * multiplier etc. */ struct { u64 umin_src; u64 umax_src; + u64 umin_dst; + u64 umax_dst; }; }; unsigned int off; @@ -339,6 +344,11 @@ static inline u8 mbpf_mode(const struct nfp_insn_meta *meta) return BPF_MODE(meta->insn.code); } +static inline bool is_mbpf_alu(const struct nfp_insn_meta *meta) +{ + return mbpf_class(meta) == BPF_ALU64 || mbpf_class(meta) == BPF_ALU; +} + static inline bool is_mbpf_load(const struct nfp_insn_meta *meta) { return (meta->insn.code & ~BPF_SIZE_MASK) == (BPF_LDX | BPF_MEM); @@ -384,25 +394,6 @@ static inline bool is_mbpf_xadd(const struct nfp_insn_meta *meta) return (meta->insn.code & ~BPF_SIZE_MASK) == (BPF_STX | BPF_XADD); } -static inline bool is_mbpf_indir_shift(const struct nfp_insn_meta *meta) -{ - u8 code = meta->insn.code; - bool is_alu, is_shift; - u8 opclass, opcode; - - opclass = BPF_CLASS(code); - is_alu = opclass == BPF_ALU64 || opclass == BPF_ALU; - if (!is_alu) - return false; - - opcode = BPF_OP(code); - is_shift = opcode == BPF_LSH || opcode == BPF_RSH || opcode == BPF_ARSH; - if (!is_shift) - return false; - - return BPF_SRC(code) == BPF_X; -} - /** * struct nfp_prog - nfp BPF program * @bpf: backpointer to the bpf app priv structure diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c index 856a0003bb75..78f44c4d95b4 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c @@ -190,8 +190,10 @@ nfp_prog_prepare(struct nfp_prog *nfp_prog, const struct bpf_insn *prog, meta->insn = prog[i]; meta->n = i; - if (is_mbpf_indir_shift(meta)) + if (is_mbpf_alu(meta)) { meta->umin_src = U64_MAX; + meta->umin_dst = U64_MAX; + } list_add_tail(&meta->l, &nfp_prog->insns); } diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c index e862b739441f..7bd9666bd8ff 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c @@ -551,12 +551,16 @@ nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx) if (is_mbpf_xadd(meta)) return nfp_bpf_check_xadd(nfp_prog, meta, env); - if (is_mbpf_indir_shift(meta)) { + if (is_mbpf_alu(meta)) { const struct bpf_reg_state *sreg = cur_regs(env) + meta->insn.src_reg; + const struct bpf_reg_state *dreg = + cur_regs(env) + meta->insn.dst_reg; meta->umin_src = min(meta->umin_src, sreg->umin_value); meta->umax_src = max(meta->umax_src, sreg->umax_value); + meta->umin_dst = min(meta->umin_dst, dreg->umin_value); + meta->umax_dst = max(meta->umax_dst, dreg->umax_value); } return 0;