Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp4038041ybf; Tue, 3 Mar 2020 18:32:52 -0800 (PST) X-Google-Smtp-Source: ADFU+vt7b/ClrhShsOA/+wG4n3HJQfLXp7mduDpyLZSyRjTv7cP5TWoheG3pV94KgzgGOwI6iBQP X-Received: by 2002:a05:6830:22f2:: with SMTP id t18mr717969otc.165.1583289172508; Tue, 03 Mar 2020 18:32:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583289172; cv=none; d=google.com; s=arc-20160816; b=o99UNRvtE0Eh8Y5Xl60KCKa8r1YhJPvbeZD2LuTYzfJLFSI3tJx+/pJmofhAhX1Gjk eABxNWUg6Ialt0LCwJ6qJ7cykTQ9U7z6xCJHLTfH/tkUnazXme6H+0oaOKI8Qxoy8IlI pq/dvR+n15sKLr5UgdEoZWG8AC6QfLQW7G1ThGh+C/XydkY87wAiVyRYBQZpLUufPGfW /9r+v5vwH9AFvyPqq9UdxbkYYawjzoytsp1ILsxtEAPDUuKdi2B7ONoPWDYLvke1EQw4 z5VqLiVFSdoW1dprKRhTj1kGAyEaoB71DNlHWNAfTdjXkdQrGTEFRCytnKlKhxoCVHFI mCuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=n6mkcIQ2CwC1xTtJxH74NN6vQdrLEAX1li3E8fEudI8=; b=R6a9hU0G1fRc56RX1P/yDdcXlNMyv74jR6rtpbb6NDtRro62bc8Zn/H51o087UwF8l gmmq1Da53BVlQ/zlPqgtK8RWz/VfXAmUe/3+eGb0lR1Qu9hw2RoMee3EnXvDzg7sX89x TSgDBQjS/5rbFZZmSLuD/L7x7UwF4WTKMRuK2RFTl3gYJffvJSJs5WzED0nyEFNWSnD6 ypQRCd9vDsThCGcuF5lKMJ+HdnNmmB95RwEmoAfYSeyl8TZ84H5x0pHF5spzaz8/pWR0 9iFwEqHd9CrBIIGCfuX4LSQIJEJhPxa/c//RE3ge0HPtUtfHuQsgyqdGQkuGVi650jEz Nj/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cs.washington.edu header.s=goo201206 header.b=M5O7QedO; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cs.washington.edu Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h14si297194otn.229.2020.03.03.18.32.40; Tue, 03 Mar 2020 18:32:52 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@cs.washington.edu header.s=goo201206 header.b=M5O7QedO; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cs.washington.edu Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387532AbgCDCcg (ORCPT + 99 others); Tue, 3 Mar 2020 21:32:36 -0500 Received: from mail-il1-f193.google.com ([209.85.166.193]:34179 "EHLO mail-il1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387411AbgCDCcg (ORCPT ); Tue, 3 Mar 2020 21:32:36 -0500 Received: by mail-il1-f193.google.com with SMTP id n11so527884ild.1 for ; Tue, 03 Mar 2020 18:32:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cs.washington.edu; s=goo201206; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=n6mkcIQ2CwC1xTtJxH74NN6vQdrLEAX1li3E8fEudI8=; b=M5O7QedO8LmdTilKXhgDjj6pJDYijzuilBu5xyes4ICn+hClPJbwMCqeC/K5g1bE2g egpjdAJsAJmqcxtp4gn85lwUEg+JAOGc94aItnA3aqKydSvbr6rdf4OOqrfi7+KA5TI3 F0k1koSGJkFlWVrglQhyYi1JSodyDP31qeDsw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=n6mkcIQ2CwC1xTtJxH74NN6vQdrLEAX1li3E8fEudI8=; b=DuvrDCrI3hU5NgTs6JjLqoT7zOrbA7EjYTN2z8YhMJRhBOQleeOhuVE2xh1iuHxvfI psFy/iUrczNAEqCEPzj/DnJENVTZsD3+HWwsE+PTgoKxZ3uXYbBeWW269vDc0+drNjYL GdAVJQGYkzPVNV6zlddDgL2GrtsjJSmgXWmU2vyUjnJHwKBKgXTxikGKZbNwOCfJ8KlP j7PGp4VdAIeFYftP7mTa2oVX+TBqqA627o4CkKjFsOfNjJsS51LA1N888HzMhb27mOv7 Jv6CW9db8hGxfZ4D1QZjIKVXEKBiSAiBx8m0ZrukkSSpgmvAS8lcohVHgUr/gQd7SURA JxpA== X-Gm-Message-State: ANhLgQ1ujPt1APWco6YAfTFyOo1+WvHzPvn6tPAzWp7r+PwOo5quZCEe bv/7Yg3LAPZyY97Vbi3KsNQAQV7Dlk4hdFLF2cZNtw== X-Received: by 2002:a05:6e02:4c2:: with SMTP id f2mr687631ils.126.1583289154825; Tue, 03 Mar 2020 18:32:34 -0800 (PST) MIME-Version: 1.0 References: <20200303005035.13814-1-luke.r.nels@gmail.com> <20200303005035.13814-3-luke.r.nels@gmail.com> In-Reply-To: From: Luke Nelson Date: Tue, 3 Mar 2020 18:32:24 -0800 Message-ID: Subject: Re: [PATCH bpf-next v4 2/4] riscv, bpf: add RV32G eBPF JIT To: =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= Cc: bpf , Luke Nelson , Jonathan Corbet , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andrii Nakryiko , "David S. Miller" , Jakub Kicinski , Paul Walmsley , Palmer Dabbelt , Albert Ou , Xi Wang , Mauro Carvalho Chehab , Stephen Hemminger , Rob Herring , Greg Kroah-Hartman , Jonathan Cameron , Andy Shevchenko , linux-doc@vger.kernel.org, LKML , Netdev , linux-riscv@lists.infradead.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Bj=C3=B6rn, Thanks again for the comments, responses below: On Mon, Mar 2, 2020 at 11:48 PM Bj=C3=B6rn T=C3=B6pel wrote: > > Which are the tests that fail to JIT, and is that due to div/mod + > xadd? Yes, all of the cases that fail to JIT are because of unsupported div/mod or xadd. I'll make that clear in next revision. > > > Co-developed-by: Xi Wang > > Signed-off-by: Xi Wang > > Signed-off-by: Luke Nelson > > --- > > arch/riscv/Kconfig | 2 +- > > arch/riscv/net/Makefile | 7 +- > > arch/riscv/net/bpf_jit_comp32.c | 1466 +++++++++++++++++++++++++++++++ > > 3 files changed, 1473 insertions(+), 2 deletions(-) > > create mode 100644 arch/riscv/net/bpf_jit_comp32.c > [...] > > + > > +static const s8 *rv32_bpf_get_reg64(const s8 *reg, const s8 *tmp, > > + struct rv_jit_context *ctx) > > Really a nit, but you're using rv32 as prefix, and also as part of > many of the functions (e.g. emit_rv32). Everything is this file is > just for RV32, so maybe remove that implicit information from the > function name? Just a thought! :-) I got so used to reading these I never noticed how redundant they were :) I'll change the next revision to remove all of the "rv32"s in function names. > > + case BPF_LSH: > > + if (imm >=3D 32) { > > + emit(rv_slli(hi(rd), lo(rd), imm - 32), ctx); > > + emit(rv_addi(lo(rd), RV_REG_ZERO, 0), ctx); > > + } else if (imm =3D=3D 0) { > > + /* nop */ > > Can we get rid of this, and just do if/else if? imm =3D=3D 0 has been a tricky case for 32-bit JITs; see 6fa632e719ee ("bpf, x32: Fix bug with ALU64 {LSH, RSH, ARSH} BPF_K shift by 0"). We wanted to make the imm =3D=3D 0 case explicit and help future readers see that this case is handled correctly here. We could do the following if we really wanted to get rid of the check: if (imm >=3D 32) { ... } else if (imm !=3D 0) { ... } /* Do nothing for imm =3D=3D 0. */ Though it's unclear if this is easier to read. > > + case BPF_ARSH: > > + if (is_12b_int(imm)) { > > + emit(rv_srai(lo(rd), lo(rd), imm), ctx); > > + } else { > > + emit_imm(RV_REG_T0, imm, ctx); > > + emit(rv_sra(lo(rd), lo(rd), RV_REG_T0), ctx); > > + } > > + break; > > Again nit; I like "early exit" code if possible. Instead of: > > if (bleh) { > foo(); > } else { > bar(); > } > > do: > > if (bleh) { > foo() > return/break; > } > bar(); > > I find the latter easier to read -- but really a nit, and a matter of > style. There are number of places where that could be applied in the > file. I like "early exit" code, too, and agree that it's easier to read in general, especially when handling error conditions. But here we wanted to make it explicit that both branches are emitting equivalent instruction sequences (under different paths). Structured control flow seems a better fit for this particular context. > At this point of the series, let's introduce the shared code .c-file > containing implementation for bpf_int_jit_compile() (with build_body > part of that)and bpf_jit_needs_zext(). That will make it easier to > catch bugs in both JITs and to avoid code duplication! Also, when > adding the stronger invariant suggested by Palmer [1], we only need to > do it in one place. > > The pull out refactoring can be a separate commit. I think the idea of deduplicating bpf_int_jit_compile is good and will lead to more maintainable JITs. How does the following proposal for v5 sound? In patch 1 of this series: - Factor structs and common helpers to bpf_jit.h (just like v4). - Factor out bpf_int_jit_compile(), bpf_jit_needs_zext(), and build_body() to a new file bpf_jit_core.c and tweak the code as in v4. - Rename emit_insn() and build_{prologue,epilogue}() to bpf_jit_emit_insn() and bpf_jit_build_{prologue,epilogue}, since these functions are now extern rather than static. - Rename bpf_jit_comp.c to bpf_jit_comp64.c to be more explicit about its contents (as the next patch will add bpf_jit_comp32.c). Then patch 2 can reuse the new header and won't need to define its own bpf_int_jit_compile() etc. Thanks! Luke