{"id":834091,"url":"http://patchwork.ozlabs.org/api/1.2/patches/834091/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/20171103205630.1083-14-jakub.kicinski@netronome.com/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/1.2/projects/7/?format=json","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-14-jakub.kicinski@netronome.com>","list_archive_url":null,"date":"2017-11-03T20:56:28","name":"[net-next,v2,13/15] nfp: bpf: move translation prepare to offload.c","commit_ref":null,"pull_url":null,"state":"accepted","archived":true,"hash":"9cbd65e41737d56ace8b4b76193fc331ff252922","submitter":{"id":67484,"url":"http://patchwork.ozlabs.org/api/1.2/people/67484/?format=json","name":"Jakub Kicinski","email":"jakub.kicinski@netronome.com"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/1.2/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/20171103205630.1083-14-jakub.kicinski@netronome.com/mbox/","series":[{"id":11839,"url":"http://patchwork.ozlabs.org/api/1.2/series/11839/?format=json","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/834091/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/834091/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=\"kUVMFu1C\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yTDlx4Prwz9s7p\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSat,  4 Nov 2017 07:57:01 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1755830AbdKCU5A (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tFri, 3 Nov 2017 16:57:00 -0400","from mail-pf0-f194.google.com ([209.85.192.194]:43566 \"EHLO\n\tmail-pf0-f194.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752454AbdKCU46 (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Fri, 3 Nov 2017 16:56:58 -0400","by mail-pf0-f194.google.com with SMTP id a8so3043465pfc.0\n\tfor <netdev@vger.kernel.org>; Fri, 03 Nov 2017 13:56:57 -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.56\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tFri, 03 Nov 2017 13:56:56 -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=NEIeUBzkMmQb5EPd5GQJ2pCK91bHz364jSJ5uUlf0Lc=;\n\tb=kUVMFu1CkoxsYn3wy7kKk9M3Pxr2tKHgrWUse+ftPFerwZA5gVQHMibGRrmGYrcFkJ\n\tIm0+HuIrxTqIQRh2/TmVIVZb9K+Tkj7TY0u7QjSJsSWLFzRn0oA2cDy9LgW2uu81JWBf\n\tnCwajMs0ehRGjguWGD2awK820mm0A1hqVh3tUwOhUicvd8t3IOtneVrhlDBlOXOAz9qg\n\t8+1EYkeL00kTuPZAGx5BYz93ClP0sDtoRBaUGEjWz/FIRDtcdesdbvbXpK5W2fJBvIDD\n\tgcawcUVwNntNm63hYGmRBcJjQ0sWGh8zpFIRuhC07b8dEnaua5UMMA+sDk5tY5SI2Bxo\n\tSCWQ==","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=NEIeUBzkMmQb5EPd5GQJ2pCK91bHz364jSJ5uUlf0Lc=;\n\tb=UUnP7DgIn9+Sib2GplAUOgC8e3ADbuHBG4FACllFE4B5wBMKgtWUd/H0ePTZVBdw2J\n\tlQNppv1tthiXpr/shfoFL7IS0eM3JDI3Ujapmiz8NiWT+S++ZTzSor9t+5iqPea1MjHk\n\tlIt54k8q13WEetw0Ib30VrPpfCNqY90BByAe6Zr3yBSMKcNOdHvbX4eXH5HpO7VQTZvM\n\tz+FCScGAnNKpmOBETdHa1X2IPZRK8iZMQ0NvZwLTg59cYbQU1Jb6fuGt+afxJbiInXeu\n\tLqEm67aERGYKWF78y4Yoi+2LfgmB+Xl4gAByGEfrz/rrAuqpSX9CLga3Kk9SFRJwRU4B\n\tQAZA==","X-Gm-Message-State":"AMCzsaUN989zHWOmRPhLkCP2ITRU9NNEvy8p0RmRwgfNQmVzizw5HcSA\n\tLLRLPSSuNZ59j9cbQfhrtLjyxIxH","X-Google-Smtp-Source":"ABhQp+QVJ65cxY2Ne5WNCJka5ca+14uI1hmieun7Wo7CGG9dlCrKJnkuNDHjE27nBVD6knrkmCcErw==","X-Received":"by 10.84.248.10 with SMTP id p10mr7847135pll.447.1509742617289; \n\tFri, 03 Nov 2017 13:56:57 -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 13/15] nfp: bpf: move translation prepare to\n\toffload.c","Date":"Fri,  3 Nov 2017 13:56:28 -0700","Message-Id":"<20171103205630.1083-14-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":"struct nfp_prog is currently only used internally by the translator.\nThis means there is a lot of parameter passing going on, between\nthe translator and different stages of offload.  Simplify things\nby allocating nfp_prog in offload.c already.\n\nWe will now use kmalloc() to allocate the program area and only\nDMA map it for the time of loading (instead of allocating DMA\ncoherent memory upfront).\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     |  43 ++------\n drivers/net/ethernet/netronome/nfp/bpf/main.h    |  14 +--\n drivers/net/ethernet/netronome/nfp/bpf/offload.c | 128 +++++++++++++++--------\n 3 files changed, 94 insertions(+), 91 deletions(-)","diff":"diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c\nindex 2eddbb45fd60..eae7a137a7a8 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c\n@@ -2245,58 +2245,27 @@ static int nfp_bpf_ustore_calc(struct nfp_prog *nfp_prog, __le64 *ustore)\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- * @prog_mem:\tmemory to store assembler instructions\n- * @prog_start:\toffset of the first instruction when loaded\n- * @prog_done:\twhere to jump on exit\n- * @prog_sz:\tsize of @prog_mem in instructions\n- * @res:\tachieved parameters of translation results\n  */\n-int\n-nfp_bpf_jit(struct bpf_prog *filter, void *prog_mem,\n-\t    unsigned int prog_start, unsigned int prog_done,\n-\t    unsigned int prog_sz, struct nfp_bpf_result *res)\n+int nfp_bpf_jit(struct nfp_prog *nfp_prog, struct bpf_prog *filter)\n {\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 -ENOMEM;\n-\n-\tINIT_LIST_HEAD(&nfp_prog->insns);\n-\tnfp_prog->type = filter->type;\n-\tnfp_prog->start_off = prog_start;\n-\tnfp_prog->tgt_done = prog_done;\n-\n-\tret = nfp_prog_prepare(nfp_prog, filter->insnsi, filter->len);\n-\tif (ret)\n-\t\tgoto out;\n-\n \tret = nfp_prog_verify(nfp_prog, filter);\n \tif (ret)\n-\t\tgoto out;\n+\t\treturn ret;\n \n \tret = nfp_bpf_optimize(nfp_prog);\n \tif (ret)\n-\t\tgoto out;\n-\n-\tnfp_prog->prog = prog_mem;\n-\tnfp_prog->__prog_alloc_len = prog_sz;\n+\t\treturn ret;\n \n \tret = nfp_translate(nfp_prog);\n \tif (ret) {\n \t\tpr_err(\"Translation failed with error %d (translated: %u)\\n\",\n \t\t       ret, nfp_prog->n_translated);\n-\t\tret = -EINVAL;\n-\t\tgoto out;\n+\t\treturn -EINVAL;\n \t}\n \n-\tret = nfp_bpf_ustore_calc(nfp_prog, (__force __le64 *)prog_mem);\n-\n-\tres->n_instr = nfp_prog->prog_len;\n-out:\n-\tnfp_prog_free(nfp_prog);\n-\n-\treturn ret;\n+\treturn nfp_bpf_ustore_calc(nfp_prog, (__force __le64 *)nfp_prog->prog);\n }\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h\nindex b77231a134b9..36b4eda2d3f8 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/main.h\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h\n@@ -169,19 +169,7 @@ struct nfp_prog {\n \tstruct list_head insns;\n };\n \n-struct nfp_bpf_result {\n-\tunsigned int n_instr;\n-};\n-\n-int\n-nfp_prog_prepare(struct nfp_prog *nfp_prog, const struct bpf_insn *prog,\n-\t\t unsigned int cnt);\n-void nfp_prog_free(struct nfp_prog *nfp_prog);\n-\n-int\n-nfp_bpf_jit(struct bpf_prog *filter, void *prog,\n-\t    unsigned int prog_start, unsigned int prog_done,\n-\t    unsigned int prog_sz, struct nfp_bpf_result *res);\n+int nfp_bpf_jit(struct nfp_prog *nfp_prog, struct bpf_prog *filter);\n \n int nfp_prog_verify(struct nfp_prog *nfp_prog, struct bpf_prog *prog);\n \ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c\nindex 3eeee200051e..c5546c0e87d8 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c\n@@ -51,7 +51,7 @@\n #include \"../nfp_net_ctrl.h\"\n #include \"../nfp_net.h\"\n \n-int\n+static int\n nfp_prog_prepare(struct nfp_prog *nfp_prog, const struct bpf_insn *prog,\n \t\t unsigned int cnt)\n {\n@@ -73,7 +73,7 @@ nfp_prog_prepare(struct nfp_prog *nfp_prog, const struct bpf_insn *prog,\n \treturn 0;\n }\n \n-void nfp_prog_free(struct nfp_prog *nfp_prog)\n+static void nfp_prog_free(struct nfp_prog *nfp_prog)\n {\n \tstruct nfp_insn_meta *meta, *tmp;\n \n@@ -84,25 +84,36 @@ void nfp_prog_free(struct nfp_prog *nfp_prog)\n \tkfree(nfp_prog);\n }\n \n-static int\n-nfp_net_bpf_offload_prepare(struct nfp_net *nn, struct bpf_prog *prog,\n-\t\t\t    struct nfp_bpf_result *res,\n-\t\t\t    void **code, dma_addr_t *dma_addr, u16 max_instr)\n+static struct nfp_prog *nfp_bpf_verifier_prep(struct bpf_prog *prog)\n {\n-\tunsigned int code_sz = max_instr * sizeof(u64);\n-\tunsigned int stack_size;\n-\tu16 start_off, done_off;\n-\tunsigned int max_mtu;\n+\tstruct nfp_prog *nfp_prog;\n \tint ret;\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 -EOPNOTSUPP;\n-\t}\n+\tnfp_prog = kzalloc(sizeof(*nfp_prog), GFP_KERNEL);\n+\tif (!nfp_prog)\n+\t\treturn NULL;\n+\n+\tINIT_LIST_HEAD(&nfp_prog->insns);\n+\tnfp_prog->type = prog->type;\n \n-\tstart_off = nn_readw(nn, NFP_NET_CFG_BPF_START);\n-\tdone_off = nn_readw(nn, NFP_NET_CFG_BPF_DONE);\n+\tret = nfp_prog_prepare(nfp_prog, prog->insnsi, prog->len);\n+\tif (ret)\n+\t\tgoto err_free;\n+\n+\treturn nfp_prog;\n+\n+err_free:\n+\tnfp_prog_free(nfp_prog);\n+\n+\treturn NULL;\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+{\n+\tunsigned int stack_size;\n+\tunsigned int max_instr;\n \n \tstack_size = nn_readb(nn, NFP_NET_CFG_BPF_STACK_SZ) * 64;\n \tif (prog->aux->stack_depth > stack_size) {\n@@ -111,28 +122,68 @@ nfp_net_bpf_offload_prepare(struct nfp_net *nn, struct bpf_prog *prog,\n \t\treturn -EOPNOTSUPP;\n \t}\n \n-\t*code = dma_zalloc_coherent(nn->dp.dev, code_sz, dma_addr, GFP_KERNEL);\n-\tif (!*code)\n+\tnfp_prog->stack_depth = prog->aux->stack_depth;\n+\tnfp_prog->start_off = nn_readw(nn, NFP_NET_CFG_BPF_START);\n+\tnfp_prog->tgt_done = nn_readw(nn, NFP_NET_CFG_BPF_DONE);\n+\n+\tmax_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN);\n+\tnfp_prog->__prog_alloc_len = max_instr * sizeof(u64);\n+\n+\tnfp_prog->prog = kmalloc(nfp_prog->__prog_alloc_len, GFP_KERNEL);\n+\tif (!nfp_prog->prog)\n \t\treturn -ENOMEM;\n \n-\tret = nfp_bpf_jit(prog, *code, start_off, done_off, max_instr, res);\n-\tif (ret)\n-\t\tgoto out;\n+\treturn nfp_bpf_jit(nfp_prog, prog);\n+}\n+\n+static void nfp_bpf_destroy(struct nfp_prog *nfp_prog)\n+{\n+\tkfree(nfp_prog->prog);\n+\tnfp_prog_free(nfp_prog);\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+{\n+\tstruct nfp_prog *nfp_prog;\n+\tunsigned int max_mtu;\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}\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-out:\n-\tdma_free_coherent(nn->dp.dev, code_sz, *code, *dma_addr);\n-\treturn ret;\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, void *code, dma_addr_t dma_addr,\n-\t\t unsigned int code_sz, unsigned int n_instr)\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 \n-\tnn_writew(nn, NFP_NET_CFG_BPF_SIZE, n_instr);\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 \n \t/* Load up the JITed code */\n@@ -140,7 +191,9 @@ nfp_net_bpf_load(struct nfp_net *nn, void *code, dma_addr_t dma_addr,\n \tif (err)\n \t\tnn_err(nn, \"FW command error while loading BPF: %d\\n\", err);\n \n-\tdma_free_coherent(nn->dp.dev, code_sz, code, dma_addr);\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 \n static void nfp_net_bpf_start(struct nfp_net *nn)\n@@ -169,11 +222,8 @@ 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_bpf_result res;\n+\tstruct nfp_prog *nfp_prog;\n \tdma_addr_t dma_addr;\n-\tu16 max_instr;\n-\tvoid *code;\n-\tint err;\n \n \tif (prog && old_prog) {\n \t\tu8 cap;\n@@ -192,15 +242,11 @@ 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-\tmax_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN);\n-\n-\terr = nfp_net_bpf_offload_prepare(nn, prog, &res, &code, &dma_addr,\n-\t\t\t\t\t  max_instr);\n-\tif (err)\n-\t\treturn err;\n+\tnfp_prog = nfp_net_bpf_offload_prepare(nn, prog, &dma_addr);\n+\tif (!nfp_prog)\n+\t\treturn -EINVAL;\n \n-\tnfp_net_bpf_load(nn, code, dma_addr, max_instr * sizeof(u64),\n-\t\t\t res.n_instr);\n+\tnfp_net_bpf_load(nn, nfp_prog, dma_addr);\n \tif (!old_prog)\n \t\tnfp_net_bpf_start(nn);\n \n","prefixes":["net-next","v2","13/15"]}