{"id":834093,"url":"http://patchwork.ozlabs.org/api/1.2/patches/834093/?format=json","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=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-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=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-12-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/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"]}