Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/834093/?format=api
{ "id": 834093, "url": "http://patchwork.ozlabs.org/api/1.2/patches/834093/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20171103205630.1083-12-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-12-jakub.kicinski@netronome.com>", "list_archive_url": null, "date": "2017-11-03T20:56:26", "name": "[net-next,v2,11/15] nfp: bpf: require seamless reload for program replace", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "67d97350322e8003d42b3404cb37ef831d8b6c0e", "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-12-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/834093/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/834093/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=\"AglhR+X5\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yTDm61Ykdz9s7p\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSat, 4 Nov 2017 07:57:10 +1100 (AEDT)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1755742AbdKCU46 (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tFri, 3 Nov 2017 16:56:58 -0400", "from mail-pg0-f65.google.com ([74.125.83.65]:53641 \"EHLO\n\tmail-pg0-f65.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1754855AbdKCU44 (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Fri, 3 Nov 2017 16:56:56 -0400", "by mail-pg0-f65.google.com with SMTP id s2so3436009pge.10\n\tfor <netdev@vger.kernel.org>; Fri, 03 Nov 2017 13:56:56 -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.54\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tFri, 03 Nov 2017 13:56:54 -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=5cjJl0nXNkRF3ANhTtv4wCx/P1PbIhusNJiFpLkb+Q4=;\n\tb=AglhR+X50Y1pMTNNeo3REIRs06IbhaUsl8zd32uBE/KX7AltqzCVViCffVXmMsH+XH\n\tK1GNC9a/V5KAEmI82GkPgHYvAzOJ2DKzXvkPnwvpn4jufbmXqBgUmu0QaqENAuw8fHqY\n\tQEjzqaRErDo4ht5GmyjtrfhOnX1oTpIGWda0P8HhyUfJLJqtLBxokv6OCqY7U3nIi+us\n\thT/VZ/QIX0rif5dKaDrJVSad7FklVjwuBoSTeJRCXeIgC/GSBcWCzvHrQck16NNuF6W9\n\tLIjOTXIzJxZR9J6D0iJWRO+wFS3DPWXqUtktbltuCgRWBYR7+4CoMK0CqKX4yiY9qzCZ\n\tIusw==", "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=5cjJl0nXNkRF3ANhTtv4wCx/P1PbIhusNJiFpLkb+Q4=;\n\tb=r7xQa1fEPoSrw9B0UET3QJIgQLHXr18zDsDflCMZ5BfciMywhHMhlEV188KHz0FjSx\n\t/z9Xk6MNfFkVkXaBK53aehTpKGxIR0Meh24o+jdEpfjAX0iBNLv8yruqEGTdT58i4gbQ\n\tV7Rtl+g7umhqh1nSK8npDSzeIkw69rbCkQEk5w/gQvHn9kzTi6zjRqOEXny4zNYfCPpU\n\tl3OQTEQAkdcNwr7hbxTp1993l9Ga3zW3MxYZ3I5QE/jN6+S6F1Wk2eeBkkbnubHLxrOV\n\tbLGqIl4gqfkrVj6sNkn7K3EP4dVvDzeq5yYIbLJnEuU4b043GSamlWwFpAo/9xK7Cq/k\n\tlcUQ==", "X-Gm-Message-State": "AMCzsaW6zwW86opCCKEsA71i7Sjm+u4FEBD6+hsP64zs/u88p1ZEqgSY\n\t9pKbmhK7hDuP3eWeTN2fdHJ462nO", "X-Google-Smtp-Source": "ABhQp+TCQcMIwzUy0pLvPP6T1nnH853I6Q2rKdQWK7Lgl0hBxY016IFFguofrURB6YYz+jBx6CQdPA==", "X-Received": "by 10.99.141.200 with SMTP id z191mr8095966pgd.73.1509742615367; \n\tFri, 03 Nov 2017 13:56:55 -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 11/15] nfp: bpf: require seamless reload for\n\tprogram replace", "Date": "Fri, 3 Nov 2017 13:56:26 -0700", "Message-Id": "<20171103205630.1083-12-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": "Firmware supports live replacement of programs for quite some\ntime now. Remove the software-fallback related logic and\ndepend on the FW for program replace. Seamless reload will\nbecome a requirement if maps are present, anyway.\n\nLoad and start stages have to be split now, since replace\nonly needs a load, start has already been done on add.\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/main.c | 11 ++---\n drivers/net/ethernet/netronome/nfp/bpf/main.h | 2 +-\n drivers/net/ethernet/netronome/nfp/bpf/offload.c | 62 ++++++++++++------------\n drivers/net/ethernet/netronome/nfp/nfp_net.h | 2 -\n 4 files changed, 35 insertions(+), 42 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c\nindex 9e1286346d42..7ae7528cd96b 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/main.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c\n@@ -68,7 +68,7 @@ nfp_bpf_xdp_offload(struct nfp_app *app, struct nfp_net *nn,\n \tif (prog && running && !xdp_running)\n \t\treturn -EBUSY;\n \n-\tret = nfp_net_bpf_offload(nn, prog, running, true);\n+\tret = nfp_net_bpf_offload(nn, prog, running);\n \t/* Stop offload if replace not possible */\n \tif (ret && prog)\n \t\tnfp_bpf_xdp_offload(app, nn, NULL);\n@@ -93,7 +93,6 @@ static int nfp_bpf_setup_tc_block_cb(enum tc_setup_type type,\n {\n \tstruct tc_cls_bpf_offload *cls_bpf = type_data;\n \tstruct nfp_net *nn = cb_priv;\n-\tbool skip_sw;\n \n \tif (type != TC_SETUP_CLSBPF ||\n \t !tc_can_offload(nn->dp.netdev) ||\n@@ -111,15 +110,13 @@ static int nfp_bpf_setup_tc_block_cb(enum tc_setup_type type,\n \t\treturn -EOPNOTSUPP;\n \t}\n \n-\tskip_sw = !!(cls_bpf->gen_flags & TCA_CLS_FLAGS_SKIP_SW);\n-\n \tswitch (cls_bpf->command) {\n \tcase TC_CLSBPF_REPLACE:\n-\t\treturn nfp_net_bpf_offload(nn, cls_bpf->prog, true, !skip_sw);\n+\t\treturn nfp_net_bpf_offload(nn, cls_bpf->prog, true);\n \tcase TC_CLSBPF_ADD:\n-\t\treturn nfp_net_bpf_offload(nn, cls_bpf->prog, false, !skip_sw);\n+\t\treturn nfp_net_bpf_offload(nn, cls_bpf->prog, false);\n \tcase TC_CLSBPF_DESTROY:\n-\t\treturn nfp_net_bpf_offload(nn, NULL, true, !skip_sw);\n+\t\treturn nfp_net_bpf_offload(nn, NULL, true);\n \tdefault:\n \t\treturn -EOPNOTSUPP;\n \t}\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h\nindex 6dddab95d57a..df56f40fea7c 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/main.h\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h\n@@ -183,6 +183,6 @@ int nfp_prog_verify(struct nfp_prog *nfp_prog, struct bpf_prog *prog);\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, bool sw_fallback);\n+\t\t\tbool old_prog);\n \n #endif\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c\nindex c09efa1a9649..f4b9a46c844d 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c\n@@ -94,14 +94,11 @@ nfp_net_bpf_offload_prepare(struct nfp_net *nn, struct bpf_prog *prog,\n }\n \n static void\n-nfp_net_bpf_load_and_start(struct nfp_net *nn, bool sw_fallback,\n-\t\t\t void *code, dma_addr_t dma_addr,\n-\t\t\t unsigned int code_sz, unsigned int n_instr)\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 {\n \tint err;\n \n-\tnn->dp.bpf_offload_skip_sw = !sw_fallback;\n-\n \tnn_writew(nn, NFP_NET_CFG_BPF_SIZE, n_instr);\n \tnn_writeq(nn, NFP_NET_CFG_BPF_ADDR, dma_addr);\n \n@@ -110,14 +107,19 @@ nfp_net_bpf_load_and_start(struct nfp_net *nn, bool sw_fallback,\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+}\n+\n+static void nfp_net_bpf_start(struct nfp_net *nn)\n+{\n+\tint err;\n+\n \t/* Enable passing packets through BPF function */\n \tnn->dp.ctrl |= NFP_NET_CFG_CTRL_BPF;\n \tnn_writel(nn, NFP_NET_CFG_CTRL, nn->dp.ctrl);\n \terr = nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_GEN);\n \tif (err)\n \t\tnn_err(nn, \"FW command error while enabling BPF: %d\\n\", err);\n-\n-\tdma_free_coherent(nn->dp.dev, code_sz, code, dma_addr);\n }\n \n static int nfp_net_bpf_stop(struct nfp_net *nn)\n@@ -127,13 +129,12 @@ static int nfp_net_bpf_stop(struct nfp_net *nn)\n \n \tnn->dp.ctrl &= ~NFP_NET_CFG_CTRL_BPF;\n \tnn_writel(nn, NFP_NET_CFG_CTRL, nn->dp.ctrl);\n-\tnn->dp.bpf_offload_skip_sw = 0;\n \n \treturn nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_GEN);\n }\n \n int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog,\n-\t\t\tbool old_prog, bool sw_fallback)\n+\t\t\tbool old_prog)\n {\n \tstruct nfp_bpf_result res;\n \tdma_addr_t dma_addr;\n@@ -141,37 +142,34 @@ int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog,\n \tvoid *code;\n \tint err;\n \n-\t/* There is nothing stopping us from implementing seamless\n-\t * replace but the simple method of loading I adopted in\n-\t * the firmware does not handle atomic replace (i.e. we have to\n-\t * stop the BPF offload and re-enable it). Leaking-in a few\n-\t * frames which didn't have BPF applied in the hardware should\n-\t * be fine if software fallback is available, though.\n-\t */\n-\tif (prog && old_prog && nn->dp.bpf_offload_skip_sw)\n-\t\treturn -EBUSY;\n+\tif (prog && old_prog) {\n+\t\tu8 cap;\n+\n+\t\tcap = nn_readb(nn, NFP_NET_CFG_BPF_CAP);\n+\t\tif (!(cap & NFP_NET_BPF_CAP_RELO)) {\n+\t\t\tnn_err(nn, \"FW does not support live reload\\n\");\n+\t\t\treturn -EBUSY;\n+\t\t}\n+\t}\n \n \t/* Something else is loaded, different program type? */\n \tif (!old_prog && nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF)\n \t\treturn -EBUSY;\n \n-\tmax_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN);\n-\tcode = NULL;\n+\tif (old_prog && !prog)\n+\t\treturn nfp_net_bpf_stop(nn);\n \n-\tif (prog) {\n-\t\terr = nfp_net_bpf_offload_prepare(nn, prog, &res, &code,\n-\t\t\t\t\t\t &dma_addr, max_instr);\n-\t\tif (err)\n-\t\t\treturn err;\n-\t}\n+\tmax_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN);\n \n-\tif (old_prog)\n-\t\tnfp_net_bpf_stop(nn);\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 \n-\tif (prog)\n-\t\tnfp_net_bpf_load_and_start(nn, sw_fallback, code,\n-\t\t\t\t\t dma_addr, max_instr * sizeof(u64),\n-\t\t\t\t\t res.n_instr);\n+\tnfp_net_bpf_load(nn, code, dma_addr, max_instr * sizeof(u64),\n+\t\t\t res.n_instr);\n+\tif (!old_prog)\n+\t\tnfp_net_bpf_start(nn);\n \n \treturn 0;\n }\ndiff --git a/drivers/net/ethernet/netronome/nfp/nfp_net.h b/drivers/net/ethernet/netronome/nfp/nfp_net.h\nindex 3d411f0d15b6..7f9857c276b1 100644\n--- a/drivers/net/ethernet/netronome/nfp/nfp_net.h\n+++ b/drivers/net/ethernet/netronome/nfp/nfp_net.h\n@@ -476,7 +476,6 @@ struct nfp_stat_pair {\n * @dev:\t\tBackpointer to struct device\n * @netdev:\t\tBackpointer to net_device structure\n * @is_vf:\t\tIs the driver attached to a VF?\n- * @bpf_offload_skip_sw: Offloaded BPF program will not be rerun by cls_bpf\n * @bpf_offload_xdp:\tOffloaded BPF program is XDP\n * @chained_metadata_format: Firemware will use new metadata format\n * @rx_dma_dir:\t\tMapping direction for RX buffers\n@@ -502,7 +501,6 @@ struct nfp_net_dp {\n \tstruct net_device *netdev;\n \n \tu8 is_vf:1;\n-\tu8 bpf_offload_skip_sw:1;\n \tu8 bpf_offload_xdp:1;\n \tu8 chained_metadata_format:1;\n \n", "prefixes": [ "net-next", "v2", "11/15" ] }