get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.2/patches/834093/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "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"
    ]
}