Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/834094/?format=api
{ "id": 834094, "url": "http://patchwork.ozlabs.org/api/1.2/patches/834094/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20171103205630.1083-15-jakub.kicinski@netronome.com/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/1.2/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20171103205630.1083-15-jakub.kicinski@netronome.com>", "list_archive_url": null, "date": "2017-11-03T20:56:29", "name": "[net-next,v2,14/15] nfp: bpf: move to new BPF program offload infrastructure", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "a410a2c0be7f146ee56b76c4f6bdb2ce89edbc61", "submitter": { "id": 67484, "url": "http://patchwork.ozlabs.org/api/1.2/people/67484/?format=api", "name": "Jakub Kicinski", "email": "jakub.kicinski@netronome.com" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/1.2/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/20171103205630.1083-15-jakub.kicinski@netronome.com/mbox/", "series": [ { "id": 11839, "url": "http://patchwork.ozlabs.org/api/1.2/series/11839/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=11839", "date": "2017-11-03T20:56:15", "name": "bpf: add offload as a first class citizen", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/11839/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/834094/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/834094/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=netronome-com.20150623.gappssmtp.com\n\theader.i=@netronome-com.20150623.gappssmtp.com\n\theader.b=\"qN5r1Y1f\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yTDm80CTNz9s7p\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSat, 4 Nov 2017 07:57:12 +1100 (AEDT)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1755879AbdKCU5K (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tFri, 3 Nov 2017 16:57:10 -0400", "from mail-pf0-f196.google.com ([209.85.192.196]:55596 \"EHLO\n\tmail-pf0-f196.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1754855AbdKCU47 (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Fri, 3 Nov 2017 16:56:59 -0400", "by mail-pf0-f196.google.com with SMTP id 17so3021748pfn.12\n\tfor <netdev@vger.kernel.org>; Fri, 03 Nov 2017 13:56:59 -0700 (PDT)", "from jkicinski-Precision-T1700.netronome.com ([75.53.12.129])\n\tby smtp.gmail.com with ESMTPSA id\n\to10sm9989029pgq.69.2017.11.03.13.56.57\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tFri, 03 Nov 2017 13:56:57 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=netronome-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=oH6Fz1XiMGm+pE5l7+PVnDuDF0P8AysNV1Kstv8Di4o=;\n\tb=qN5r1Y1fHCfXBtWvRnb3ZTTOQciP0fUlPwMRA/i5P9RNOhXmLCdcOya8j+6ynvH4MV\n\t53O/AQaZZqDp5f9srVwykUTDLmnWH084r69g+694brKM0qa8uUuqqpZYerBMcN9MSBcf\n\t42qCve4I7Cekrpv0eW+D741rC2DvJz02cZVKLfgxCb41ng8tY7MkhvNI4P6fmGoqVVLC\n\t/yIOScpF3u2FqRK87F71jcGWtKPSdx9SVjZ61/PXty6xsacQQdrOushXR5q1MS1rfFuu\n\t+MBvkYri+iOh9G8+mUBkTvzgum8VTvNBlPhHx27Ps4dAOvlfC+a0ub6AFzbbw6LZl4UL\n\tLQYg==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=oH6Fz1XiMGm+pE5l7+PVnDuDF0P8AysNV1Kstv8Di4o=;\n\tb=Sj5uzncLHUPHntLkg3IYqjwOFlsyPFnFTDcI0tY+Jkc7cXu4bC5nFtAtfKbk8m1k0P\n\ty+jF/a0iJxEJOM+0miu9x+7B5BMsilvWk9AwKNa5uE5NwmqUleJGUaVDe2Eo64S+23tm\n\ttmAVBPw0fQKupbfTz/behayZPiC/muMSvAfXQmExVwLfYs843LQzGH/5TGUSXrNSyFDG\n\txjJRts/5wLCg1/sr9l8wIskdop4DaDrKOlcbQiiNcimS25YbwDp5g95iZJJAd4SsUswV\n\tfQ/RTCQq4WJmn9dPmMRu+pcA9tJlV9xd6P5HlexwrkZ97Q1mu+5R18I/ZG4yw5zy22CK\n\tGooQ==", "X-Gm-Message-State": "AMCzsaVAEbVP4qUUcsC8fpvjHrYnMcTYI8bjYlZJwYy3M0oszkDPXEah\n\tFzyJPID54J4wGXj7ExBQhxIIUBYH", "X-Google-Smtp-Source": "ABhQp+S87BdjcLeZ6P+BMytmiBwBF+pfShqbfBfAP4uw3GPavpYvR1BoUTgeK4/IHz96+sk1LtTYUQ==", "X-Received": "by 10.99.51.205 with SMTP id z196mr8397414pgz.374.1509742618287; \n\tFri, 03 Nov 2017 13:56:58 -0700 (PDT)", "From": "Jakub Kicinski <jakub.kicinski@netronome.com>", "To": "netdev@vger.kernel.org", "Cc": "oss-drivers@netronome.com, alexei.starovoitov@gmail.com,\n\tdaniel@iogearbox.net, Jakub Kicinski <jakub.kicinski@netronome.com>", "Subject": "[PATCH net-next v2 14/15] nfp: bpf: move to new BPF program offload\n\tinfrastructure", "Date": "Fri, 3 Nov 2017 13:56:29 -0700", "Message-Id": "<20171103205630.1083-15-jakub.kicinski@netronome.com>", "X-Mailer": "git-send-email 2.14.1", "In-Reply-To": "<20171103205630.1083-1-jakub.kicinski@netronome.com>", "References": "<20171103205630.1083-1-jakub.kicinski@netronome.com>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "Following steps are taken in the driver to offload an XDP program:\n\nXDP_SETUP_PROG:\n * prepare:\n - allocate program state;\n - run verifier (bpf_analyzer());\n - run translation;\n * load:\n - stop old program if needed;\n - load program;\n - enable BPF if not enabled;\n * clean up:\n - free program image.\n\nWith new infrastructure the flow will look like this:\n\nBPF_OFFLOAD_VERIFIER_PREP:\n - allocate program state;\nBPF_OFFLOAD_TRANSLATE:\n - run translation;\nXDP_SETUP_PROG:\n - stop old program if needed;\n - load program;\n - enable BPF if not enabled;\nBPF_OFFLOAD_DESTROY:\n - free program image.\n\nTake advantage of the new infrastructure. Allocation of driver\nmetadata has to be moved from jit.c to offload.c since it's now\ndone at a different stage. Since there is no separate driver\nprivate data for verification step, move temporary nfp_meta\npointer into nfp_prog. We will now use user space context\noffsets.\n\nSigned-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>\nReviewed-by: Quentin Monnet <quentin.monnet@netronome.com>\n---\n drivers/net/ethernet/netronome/nfp/bpf/jit.c | 35 ++++-----\n drivers/net/ethernet/netronome/nfp/bpf/main.c | 4 +\n drivers/net/ethernet/netronome/nfp/bpf/main.h | 15 +++-\n drivers/net/ethernet/netronome/nfp/bpf/offload.c | 85 ++++++++++------------\n drivers/net/ethernet/netronome/nfp/bpf/verifier.c | 43 ++---------\n drivers/net/ethernet/netronome/nfp/nfp_app.h | 37 ++++++++++\n .../net/ethernet/netronome/nfp/nfp_net_common.c | 8 ++\n 7 files changed, 121 insertions(+), 106 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c\nindex eae7a137a7a8..995e95410b11 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c\n@@ -1427,19 +1427,18 @@ static int mem_ldx_skb(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,\n \tswreg dst = reg_both(meta->insn.dst_reg * 2);\n \n \tswitch (meta->insn.off) {\n-\tcase offsetof(struct sk_buff, len):\n-\t\tif (size != FIELD_SIZEOF(struct sk_buff, len))\n+\tcase offsetof(struct __sk_buff, len):\n+\t\tif (size != FIELD_SIZEOF(struct __sk_buff, len))\n \t\t\treturn -EOPNOTSUPP;\n \t\twrp_mov(nfp_prog, dst, plen_reg(nfp_prog));\n \t\tbreak;\n-\tcase offsetof(struct sk_buff, data):\n-\t\tif (size != sizeof(void *))\n+\tcase offsetof(struct __sk_buff, data):\n+\t\tif (size != FIELD_SIZEOF(struct __sk_buff, data))\n \t\t\treturn -EOPNOTSUPP;\n \t\twrp_mov(nfp_prog, dst, pptr_reg(nfp_prog));\n \t\tbreak;\n-\tcase offsetof(struct sk_buff, cb) +\n-\t offsetof(struct bpf_skb_data_end, data_end):\n-\t\tif (size != sizeof(void *))\n+\tcase offsetof(struct __sk_buff, data_end):\n+\t\tif (size != FIELD_SIZEOF(struct __sk_buff, data_end))\n \t\t\treturn -EOPNOTSUPP;\n \t\temit_alu(nfp_prog, dst,\n \t\t\t plen_reg(nfp_prog), ALU_OP_ADD, pptr_reg(nfp_prog));\n@@ -1458,14 +1457,15 @@ static int mem_ldx_xdp(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,\n {\n \tswreg dst = reg_both(meta->insn.dst_reg * 2);\n \n-\tif (size != sizeof(void *))\n-\t\treturn -EINVAL;\n-\n \tswitch (meta->insn.off) {\n-\tcase offsetof(struct xdp_buff, data):\n+\tcase offsetof(struct xdp_md, data):\n+\t\tif (size != FIELD_SIZEOF(struct xdp_md, data))\n+\t\t\treturn -EOPNOTSUPP;\n \t\twrp_mov(nfp_prog, dst, pptr_reg(nfp_prog));\n \t\tbreak;\n-\tcase offsetof(struct xdp_buff, data_end):\n+\tcase offsetof(struct xdp_md, data_end):\n+\t\tif (size != FIELD_SIZEOF(struct xdp_md, data_end))\n+\t\t\treturn -EOPNOTSUPP;\n \t\temit_alu(nfp_prog, dst,\n \t\t\t plen_reg(nfp_prog), ALU_OP_ADD, pptr_reg(nfp_prog));\n \t\tbreak;\n@@ -2243,19 +2243,10 @@ static int nfp_bpf_ustore_calc(struct nfp_prog *nfp_prog, __le64 *ustore)\n \treturn 0;\n }\n \n-/**\n- * nfp_bpf_jit() - translate BPF code into NFP assembly\n- * @nfp_prog:\tnfp_prog prepared based on @filter\n- * @filter:\tkernel BPF filter struct\n- */\n-int nfp_bpf_jit(struct nfp_prog *nfp_prog, struct bpf_prog *filter)\n+int nfp_bpf_jit(struct nfp_prog *nfp_prog)\n {\n \tint ret;\n \n-\tret = nfp_prog_verify(nfp_prog, filter);\n-\tif (ret)\n-\t\treturn ret;\n-\n \tret = nfp_bpf_optimize(nfp_prog);\n \tif (ret)\n \t\treturn ret;\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c\nindex 7ae7528cd96b..e379b78e86ef 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/main.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c\n@@ -173,4 +173,8 @@ const struct nfp_app_type app_bpf = {\n \t.setup_tc\t= nfp_bpf_setup_tc,\n \t.tc_busy\t= nfp_bpf_tc_busy,\n \t.xdp_offload\t= nfp_bpf_xdp_offload,\n+\n+\t.bpf_verifier_prep\t= nfp_bpf_verifier_prep,\n+\t.bpf_translate\t\t= nfp_bpf_translate,\n+\t.bpf_destroy\t\t= nfp_bpf_destroy,\n };\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h\nindex 36b4eda2d3f8..082a15f6dfb5 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/main.h\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h\n@@ -139,6 +139,7 @@ static inline u8 mbpf_mode(const struct nfp_insn_meta *meta)\n * @prog: machine code\n * @prog_len: number of valid instructions in @prog array\n * @__prog_alloc_len: alloc size of @prog array\n+ * @verifier_meta: temporary storage for verifier's insn meta\n * @type: BPF program type\n * @start_off: address of the first instruction in the memory\n * @tgt_out: jump target for normal exit\n@@ -154,6 +155,8 @@ struct nfp_prog {\n \tunsigned int prog_len;\n \tunsigned int __prog_alloc_len;\n \n+\tstruct nfp_insn_meta *verifier_meta;\n+\n \tenum bpf_prog_type type;\n \n \tunsigned int start_off;\n@@ -169,13 +172,21 @@ struct nfp_prog {\n \tstruct list_head insns;\n };\n \n-int nfp_bpf_jit(struct nfp_prog *nfp_prog, struct bpf_prog *filter);\n+int nfp_bpf_jit(struct nfp_prog *prog);\n \n-int nfp_prog_verify(struct nfp_prog *nfp_prog, struct bpf_prog *prog);\n+extern const struct bpf_ext_analyzer_ops nfp_bpf_analyzer_ops;\n \n+struct netdev_bpf;\n+struct nfp_app;\n struct nfp_net;\n \n int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog,\n \t\t\tbool old_prog);\n \n+int nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t struct netdev_bpf *bpf);\n+int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn,\n+\t\t struct bpf_prog *prog);\n+int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn,\n+\t\t struct bpf_prog *prog);\n #endif\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c\nindex c5546c0e87d8..b6cee71f49d3 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c\n@@ -84,14 +84,17 @@ static void nfp_prog_free(struct nfp_prog *nfp_prog)\n \tkfree(nfp_prog);\n }\n \n-static struct nfp_prog *nfp_bpf_verifier_prep(struct bpf_prog *prog)\n+int nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t struct netdev_bpf *bpf)\n {\n+\tstruct bpf_prog *prog = bpf->verifier.prog;\n \tstruct nfp_prog *nfp_prog;\n \tint ret;\n \n \tnfp_prog = kzalloc(sizeof(*nfp_prog), GFP_KERNEL);\n \tif (!nfp_prog)\n-\t\treturn NULL;\n+\t\treturn -ENOMEM;\n+\tprog->aux->offload->dev_priv = nfp_prog;\n \n \tINIT_LIST_HEAD(&nfp_prog->insns);\n \tnfp_prog->type = prog->type;\n@@ -100,18 +103,21 @@ static struct nfp_prog *nfp_bpf_verifier_prep(struct bpf_prog *prog)\n \tif (ret)\n \t\tgoto err_free;\n \n-\treturn nfp_prog;\n+\tnfp_prog->verifier_meta = nfp_prog_first_meta(nfp_prog);\n+\tbpf->verifier.ops = &nfp_bpf_analyzer_ops;\n+\n+\treturn 0;\n \n err_free:\n \tnfp_prog_free(nfp_prog);\n \n-\treturn NULL;\n+\treturn ret;\n }\n \n-static int\n-nfp_bpf_translate(struct nfp_net *nn, struct nfp_prog *nfp_prog,\n-\t\t struct bpf_prog *prog)\n+int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn,\n+\t\t struct bpf_prog *prog)\n {\n+\tstruct nfp_prog *nfp_prog = prog->aux->offload->dev_priv;\n \tunsigned int stack_size;\n \tunsigned int max_instr;\n \n@@ -133,55 +139,38 @@ nfp_bpf_translate(struct nfp_net *nn, struct nfp_prog *nfp_prog,\n \tif (!nfp_prog->prog)\n \t\treturn -ENOMEM;\n \n-\treturn nfp_bpf_jit(nfp_prog, prog);\n+\treturn nfp_bpf_jit(nfp_prog);\n }\n \n-static void nfp_bpf_destroy(struct nfp_prog *nfp_prog)\n+int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn,\n+\t\t struct bpf_prog *prog)\n {\n+\tstruct nfp_prog *nfp_prog = prog->aux->offload->dev_priv;\n+\n \tkfree(nfp_prog->prog);\n \tnfp_prog_free(nfp_prog);\n+\n+\treturn 0;\n }\n \n-static struct nfp_prog *\n-nfp_net_bpf_offload_prepare(struct nfp_net *nn, struct bpf_prog *prog,\n-\t\t\t dma_addr_t *dma_addr)\n+static int nfp_net_bpf_load(struct nfp_net *nn, struct bpf_prog *prog)\n {\n-\tstruct nfp_prog *nfp_prog;\n+\tstruct nfp_prog *nfp_prog = prog->aux->offload->dev_priv;\n \tunsigned int max_mtu;\n+\tdma_addr_t dma_addr;\n \tint err;\n \n \tmax_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32;\n \tif (max_mtu < nn->dp.netdev->mtu) {\n \t\tnn_info(nn, \"BPF offload not supported with MTU larger than HW packet split boundary\\n\");\n-\t\treturn NULL;\n+\t\treturn -EOPNOTSUPP;\n \t}\n \n-\tnfp_prog = nfp_bpf_verifier_prep(prog);\n-\tif (!nfp_prog)\n-\t\treturn NULL;\n-\n-\terr = nfp_bpf_translate(nn, nfp_prog, prog);\n-\tif (err)\n-\t\tgoto err_destroy_prog;\n-\n-\t*dma_addr = dma_map_single(nn->dp.dev, nfp_prog->prog,\n-\t\t\t\t nfp_prog->prog_len * sizeof(u64),\n-\t\t\t\t DMA_TO_DEVICE);\n-\tif (dma_mapping_error(nn->dp.dev, *dma_addr))\n-\t\tgoto err_destroy_prog;\n-\n-\treturn 0;\n-\n-err_destroy_prog:\n-\tnfp_bpf_destroy(nfp_prog);\n-\treturn NULL;\n-}\n-\n-static void\n-nfp_net_bpf_load(struct nfp_net *nn, struct nfp_prog *nfp_prog,\n-\t\t dma_addr_t dma_addr)\n-{\n-\tint err;\n+\tdma_addr = dma_map_single(nn->dp.dev, nfp_prog->prog,\n+\t\t\t\t nfp_prog->prog_len * sizeof(u64),\n+\t\t\t\t DMA_TO_DEVICE);\n+\tif (dma_mapping_error(nn->dp.dev, dma_addr))\n+\t\treturn -ENOMEM;\n \n \tnn_writew(nn, NFP_NET_CFG_BPF_SIZE, nfp_prog->prog_len);\n \tnn_writeq(nn, NFP_NET_CFG_BPF_ADDR, dma_addr);\n@@ -193,7 +182,8 @@ nfp_net_bpf_load(struct nfp_net *nn, struct nfp_prog *nfp_prog,\n \n \tdma_unmap_single(nn->dp.dev, dma_addr, nfp_prog->prog_len * sizeof(u64),\n \t\t\t DMA_TO_DEVICE);\n-\tnfp_bpf_destroy(nfp_prog);\n+\n+\treturn err;\n }\n \n static void nfp_net_bpf_start(struct nfp_net *nn)\n@@ -222,8 +212,10 @@ static int nfp_net_bpf_stop(struct nfp_net *nn)\n int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog,\n \t\t\tbool old_prog)\n {\n-\tstruct nfp_prog *nfp_prog;\n-\tdma_addr_t dma_addr;\n+\tint err;\n+\n+\tif (prog && !prog->aux->offload)\n+\t\treturn -EINVAL;\n \n \tif (prog && old_prog) {\n \t\tu8 cap;\n@@ -242,11 +234,10 @@ int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog,\n \tif (old_prog && !prog)\n \t\treturn nfp_net_bpf_stop(nn);\n \n-\tnfp_prog = nfp_net_bpf_offload_prepare(nn, prog, &dma_addr);\n-\tif (!nfp_prog)\n-\t\treturn -EINVAL;\n+\terr = nfp_net_bpf_load(nn, prog);\n+\tif (err)\n+\t\treturn err;\n \n-\tnfp_net_bpf_load(nn, nfp_prog, dma_addr);\n \tif (!old_prog)\n \t\tnfp_net_bpf_start(nn);\n \ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c\nindex 4f31bdefd331..8d43491ddd6b 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c\n@@ -40,12 +40,6 @@\n \n #include \"main.h\"\n \n-/* Analyzer/verifier definitions */\n-struct nfp_bpf_analyzer_priv {\n-\tstruct nfp_prog *prog;\n-\tstruct nfp_insn_meta *meta;\n-};\n-\n static struct nfp_insn_meta *\n nfp_bpf_goto_meta(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,\n \t\t unsigned int insn_idx, unsigned int n_insns)\n@@ -171,11 +165,11 @@ nfp_bpf_check_ptr(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,\n static int\n nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx)\n {\n-\tstruct nfp_bpf_analyzer_priv *priv = env->analyzer_priv;\n-\tstruct nfp_insn_meta *meta = priv->meta;\n+\tstruct nfp_prog *nfp_prog = env->prog->aux->offload->dev_priv;\n+\tstruct nfp_insn_meta *meta = nfp_prog->verifier_meta;\n \n-\tmeta = nfp_bpf_goto_meta(priv->prog, meta, insn_idx, env->prog->len);\n-\tpriv->meta = meta;\n+\tmeta = nfp_bpf_goto_meta(nfp_prog, meta, insn_idx, env->prog->len);\n+\tnfp_prog->verifier_meta = meta;\n \n \tif (meta->insn.src_reg >= MAX_BPF_REG ||\n \t meta->insn.dst_reg >= MAX_BPF_REG) {\n@@ -184,39 +178,18 @@ nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx)\n \t}\n \n \tif (meta->insn.code == (BPF_JMP | BPF_EXIT))\n-\t\treturn nfp_bpf_check_exit(priv->prog, env);\n+\t\treturn nfp_bpf_check_exit(nfp_prog, env);\n \n \tif ((meta->insn.code & ~BPF_SIZE_MASK) == (BPF_LDX | BPF_MEM))\n-\t\treturn nfp_bpf_check_ptr(priv->prog, meta, env,\n+\t\treturn nfp_bpf_check_ptr(nfp_prog, meta, env,\n \t\t\t\t\t meta->insn.src_reg);\n \tif ((meta->insn.code & ~BPF_SIZE_MASK) == (BPF_STX | BPF_MEM))\n-\t\treturn nfp_bpf_check_ptr(priv->prog, meta, env,\n+\t\treturn nfp_bpf_check_ptr(nfp_prog, meta, env,\n \t\t\t\t\t meta->insn.dst_reg);\n \n \treturn 0;\n }\n \n-static const struct bpf_ext_analyzer_ops nfp_bpf_analyzer_ops = {\n+const struct bpf_ext_analyzer_ops nfp_bpf_analyzer_ops = {\n \t.insn_hook = nfp_verify_insn,\n };\n-\n-int nfp_prog_verify(struct nfp_prog *nfp_prog, struct bpf_prog *prog)\n-{\n-\tstruct nfp_bpf_analyzer_priv *priv;\n-\tint ret;\n-\n-\tnfp_prog->stack_depth = prog->aux->stack_depth;\n-\n-\tpriv = kzalloc(sizeof(*priv), GFP_KERNEL);\n-\tif (!priv)\n-\t\treturn -ENOMEM;\n-\n-\tpriv->prog = nfp_prog;\n-\tpriv->meta = nfp_prog_first_meta(nfp_prog);\n-\n-\tret = bpf_analyzer(prog, &nfp_bpf_analyzer_ops, priv);\n-\n-\tkfree(priv);\n-\n-\treturn ret;\n-}\ndiff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h\nindex 857bb33020ba..54b67c9b8d5b 100644\n--- a/drivers/net/ethernet/netronome/nfp/nfp_app.h\n+++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h\n@@ -42,6 +42,7 @@\n \n struct bpf_prog;\n struct net_device;\n+struct netdev_bpf;\n struct pci_dev;\n struct sk_buff;\n struct sk_buff;\n@@ -83,6 +84,9 @@ extern const struct nfp_app_type app_flower;\n * @setup_tc:\tsetup TC ndo\n * @tc_busy:\tTC HW offload busy (rules loaded)\n * @xdp_offload: offload an XDP program\n+ * @bpf_verifier_prep:\tverifier prep for dev-specific BPF programs\n+ * @bpf_translate:\ttranslate call for dev-specific BPF programs\n+ * @bpf_destroy:\tdestroy for dev-specific BPF programs\n * @eswitch_mode_get: get SR-IOV eswitch mode\n * @sriov_enable: app-specific sriov initialisation\n * @sriov_disable: app-specific sriov clean-up\n@@ -118,6 +122,12 @@ struct nfp_app_type {\n \tbool (*tc_busy)(struct nfp_app *app, struct nfp_net *nn);\n \tint (*xdp_offload)(struct nfp_app *app, struct nfp_net *nn,\n \t\t\t struct bpf_prog *prog);\n+\tint (*bpf_verifier_prep)(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t\t struct netdev_bpf *bpf);\n+\tint (*bpf_translate)(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t struct bpf_prog *prog);\n+\tint (*bpf_destroy)(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t struct bpf_prog *prog);\n \n \tint (*sriov_enable)(struct nfp_app *app, int num_vfs);\n \tvoid (*sriov_disable)(struct nfp_app *app);\n@@ -271,6 +281,33 @@ static inline int nfp_app_xdp_offload(struct nfp_app *app, struct nfp_net *nn,\n \treturn app->type->xdp_offload(app, nn, prog);\n }\n \n+static inline int\n+nfp_app_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn,\n+\t\t\t struct netdev_bpf *bpf)\n+{\n+\tif (!app || !app->type->bpf_verifier_prep)\n+\t\treturn -EOPNOTSUPP;\n+\treturn app->type->bpf_verifier_prep(app, nn, bpf);\n+}\n+\n+static inline int\n+nfp_app_bpf_translate(struct nfp_app *app, struct nfp_net *nn,\n+\t\t struct bpf_prog *prog)\n+{\n+\tif (!app || !app->type->bpf_translate)\n+\t\treturn -EOPNOTSUPP;\n+\treturn app->type->bpf_translate(app, nn, prog);\n+}\n+\n+static inline int\n+nfp_app_bpf_destroy(struct nfp_app *app, struct nfp_net *nn,\n+\t\t struct bpf_prog *prog)\n+{\n+\tif (!app || !app->type->bpf_destroy)\n+\t\treturn -EOPNOTSUPP;\n+\treturn app->type->bpf_destroy(app, nn, prog);\n+}\n+\n static inline bool nfp_app_ctrl_tx(struct nfp_app *app, struct sk_buff *skb)\n {\n \ttrace_devlink_hwmsg(priv_to_devlink(app->pf), false, 0,\ndiff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c\nindex f6c6ad4e8a59..232044b1b7aa 100644\n--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c\n+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c\n@@ -3393,6 +3393,14 @@ static int nfp_net_xdp(struct net_device *netdev, struct netdev_bpf *xdp)\n \t\t\txdp->prog_attached = XDP_ATTACHED_HW;\n \t\txdp->prog_id = nn->xdp_prog ? nn->xdp_prog->aux->id : 0;\n \t\treturn 0;\n+\tcase BPF_OFFLOAD_VERIFIER_PREP:\n+\t\treturn nfp_app_bpf_verifier_prep(nn->app, nn, xdp);\n+\tcase BPF_OFFLOAD_TRANSLATE:\n+\t\treturn nfp_app_bpf_translate(nn->app, nn,\n+\t\t\t\t\t xdp->offload.prog);\n+\tcase BPF_OFFLOAD_DESTROY:\n+\t\treturn nfp_app_bpf_destroy(nn->app, nn,\n+\t\t\t\t\t xdp->offload.prog);\n \tdefault:\n \t\treturn -EINVAL;\n \t}\n", "prefixes": [ "net-next", "v2", "14/15" ] }