get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 834095,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/834095/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20171103205630.1083-8-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-8-jakub.kicinski@netronome.com>",
    "list_archive_url": null,
    "date": "2017-11-03T20:56:22",
    "name": "[net-next,v2,07/15] nfp: bpf: drop support for cls_bpf with legacy actions",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "7f1301dfdf22d09f56e3fc2998884a6c7503b5c1",
    "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-8-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/834095/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/834095/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=\"ucvoR28Q\"; dkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yTDmG1nvNz9s7p\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSat,  4 Nov 2017 07:57:18 +1100 (AEDT)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1755528AbdKCU45 (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tFri, 3 Nov 2017 16:56:57 -0400",
            "from mail-pf0-f195.google.com ([209.85.192.195]:49856 \"EHLO\n\tmail-pf0-f195.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752454AbdKCU4w (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Fri, 3 Nov 2017 16:56:52 -0400",
            "by mail-pf0-f195.google.com with SMTP id i5so3031968pfe.6\n\tfor <netdev@vger.kernel.org>; Fri, 03 Nov 2017 13:56:52 -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.50\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tFri, 03 Nov 2017 13:56:50 -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=Ve4fE9FjD/FFkLpcNt3U4xuuzTOW9q22TJGCzKU6iWY=;\n\tb=ucvoR28QkBSIgAPTgzSbYd+QQBbkepcfOdCF3d9LOIaCX/jpyTGnDVSQgBmnn4V376\n\tp4/KfkmBwnC+cvlAKOvubMYEvDvveMUoI/X2QGjhXj1b8TcaCiEyc3KL2+WyhLBTAZu6\n\tDZCowIR5koru2aYE8fwcgIHAyp5Mvaplcb+kUwqiotRJ/YHLfxKEV/w5CcOTDk8/QR/B\n\tgVY99u/AYLZ72KKJxwRg46eQkUA0ZaGulionyU7OrjbtpnUR7sXuIjm86KAnwCtR24aH\n\tpXqH52sxwVUgAl+PKlRwZj7aoUpnars4caaXRIlDeDm2bKflBYglrM3WInwNZakmKVf5\n\tCVRw==",
        "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=Ve4fE9FjD/FFkLpcNt3U4xuuzTOW9q22TJGCzKU6iWY=;\n\tb=afyQaOlEvUrACsNKtDupSZCaUq4dHFmXgGFNVlzC62slftPcFknsjRp68Asv4cqT/N\n\trgYWkrnOkoHsVf3JhNfiSk3183ALMMpLWD1Fx+OKc/efg87WyKIWzBDOLe2cBBl4nbCc\n\tZmqd6/guBbPAAfS1qk5kfS2EcMJXx2ZqS0uqMUrNeilR/SDEsWJ91/C4L6dyyLef0lv4\n\tZI0V0uJ6ppwmbKEIHyeIdrgK57jAmZiVa97KD+hDX+igv//HxIn58OaW5bAMZSSRpqKu\n\tPCsaU8DhvJWXRlPiFuA0nSS9zRDC+/NycQU7VXf/22dZb/YTKEp4R2w03VXAP27A/YIE\n\tXRKw==",
        "X-Gm-Message-State": "AMCzsaVCa9UTiDTVMniOfDZ1p5UH0MPO6cNQ3Eu1Nr9MB6Yrh5fQmf3W\n\t1AlDYmTLTyXt9UggEmjW4xP8/48f",
        "X-Google-Smtp-Source": "ABhQp+RzxJmYUNZljgq5le2E3iE62hzWuQkc1RibgnNj9p9NgEE/fphmqrf6igSucNLQP+JCzVPauw==",
        "X-Received": "by 10.99.127.93 with SMTP id p29mr8263916pgn.15.1509742611353;\n\tFri, 03 Nov 2017 13:56:51 -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 07/15] nfp: bpf: drop support for cls_bpf with\n\tlegacy actions",
        "Date": "Fri,  3 Nov 2017 13:56:22 -0700",
        "Message-Id": "<20171103205630.1083-8-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": "Only support BPF_PROG_TYPE_SCHED_CLS programs in direct\naction mode.  This simplifies preparing the offload since\nthere will now be only one mode of operation for that type\nof program.  We need to know the attachment mode type of\ncls_bpf programs, because exit codes are interpreted\ndifferently for legacy vs DA mode.\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      |  87 ++---------------\n drivers/net/ethernet/netronome/nfp/bpf/main.c     |  33 ++-----\n drivers/net/ethernet/netronome/nfp/bpf/main.h     |  30 +-----\n drivers/net/ethernet/netronome/nfp/bpf/offload.c  | 108 +---------------------\n drivers/net/ethernet/netronome/nfp/bpf/verifier.c |  11 +--\n 5 files changed, 22 insertions(+), 247 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c\nindex 2609a2487100..e1907a1d269e 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c\n@@ -201,47 +201,6 @@ emit_br(struct nfp_prog *nfp_prog, enum br_mask mask, u16 addr, u8 defer)\n \t\t  BR_CSS_NONE, addr, defer);\n }\n \n-static void\n-__emit_br_byte(struct nfp_prog *nfp_prog, u8 areg, u8 breg, bool imm8,\n-\t       u8 byte, bool equal, u16 addr, u8 defer, bool src_lmextn)\n-{\n-\tu16 addr_lo, addr_hi;\n-\tu64 insn;\n-\n-\taddr_lo = addr & (OP_BB_ADDR_LO >> __bf_shf(OP_BB_ADDR_LO));\n-\taddr_hi = addr != addr_lo;\n-\n-\tinsn = OP_BBYTE_BASE |\n-\t\tFIELD_PREP(OP_BB_A_SRC, areg) |\n-\t\tFIELD_PREP(OP_BB_BYTE, byte) |\n-\t\tFIELD_PREP(OP_BB_B_SRC, breg) |\n-\t\tFIELD_PREP(OP_BB_I8, imm8) |\n-\t\tFIELD_PREP(OP_BB_EQ, equal) |\n-\t\tFIELD_PREP(OP_BB_DEFBR, defer) |\n-\t\tFIELD_PREP(OP_BB_ADDR_LO, addr_lo) |\n-\t\tFIELD_PREP(OP_BB_ADDR_HI, addr_hi) |\n-\t\tFIELD_PREP(OP_BB_SRC_LMEXTN, src_lmextn);\n-\n-\tnfp_prog_push(nfp_prog, insn);\n-}\n-\n-static void\n-emit_br_byte_neq(struct nfp_prog *nfp_prog,\n-\t\t swreg src, u8 imm, u8 byte, u16 addr, u8 defer)\n-{\n-\tstruct nfp_insn_re_regs reg;\n-\tint err;\n-\n-\terr = swreg_to_restricted(reg_none(), src, reg_imm(imm), &reg, true);\n-\tif (err) {\n-\t\tnfp_prog->error = err;\n-\t\treturn;\n-\t}\n-\n-\t__emit_br_byte(nfp_prog, reg.areg, reg.breg, reg.i8, byte, false, addr,\n-\t\t       defer, reg.src_lmextn);\n-}\n-\n static void\n __emit_immed(struct nfp_prog *nfp_prog, u16 areg, u16 breg, u16 imm_hi,\n \t     enum immed_width width, bool invert,\n@@ -1547,7 +1506,7 @@ mem_ldx(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,\n \tunsigned int size)\n {\n \tif (meta->ptr.type == PTR_TO_CTX) {\n-\t\tif (nfp_prog->act == NN_ACT_XDP)\n+\t\tif (nfp_prog->type == BPF_PROG_TYPE_XDP)\n \t\t\treturn mem_ldx_xdp(nfp_prog, meta, size);\n \t\telse\n \t\t\treturn mem_ldx_skb(nfp_prog, meta, size);\n@@ -2022,34 +1981,6 @@ static void nfp_intro(struct nfp_prog *nfp_prog)\n \t\t plen_reg(nfp_prog), ALU_OP_AND, pv_len(nfp_prog));\n }\n \n-static void nfp_outro_tc_legacy(struct nfp_prog *nfp_prog)\n-{\n-\tconst u8 act2code[] = {\n-\t\t[NN_ACT_TC_DROP]  = 0x22,\n-\t\t[NN_ACT_TC_REDIR] = 0x24\n-\t};\n-\t/* Target for aborts */\n-\tnfp_prog->tgt_abort = nfp_prog_current_offset(nfp_prog);\n-\twrp_immed(nfp_prog, reg_both(0), 0);\n-\n-\t/* Target for normal exits */\n-\tnfp_prog->tgt_out = nfp_prog_current_offset(nfp_prog);\n-\t/* Legacy TC mode:\n-\t *   0        0x11 -> pass,  count as stat0\n-\t *  -1  drop  0x22 -> drop,  count as stat1\n-\t *     redir  0x24 -> redir, count as stat1\n-\t *  ife mark  0x21 -> pass,  count as stat1\n-\t *  ife + tx  0x24 -> redir, count as stat1\n-\t */\n-\temit_br_byte_neq(nfp_prog, reg_b(0), 0xff, 0, nfp_prog->tgt_done, 2);\n-\twrp_mov(nfp_prog, reg_a(0), NFP_BPF_ABI_FLAGS);\n-\temit_ld_field(nfp_prog, reg_a(0), 0xc, reg_imm(0x11), SHF_SC_L_SHF, 16);\n-\n-\temit_br(nfp_prog, BR_UNC, nfp_prog->tgt_done, 1);\n-\temit_ld_field(nfp_prog, reg_a(0), 0xc, reg_imm(act2code[nfp_prog->act]),\n-\t\t      SHF_SC_L_SHF, 16);\n-}\n-\n static void nfp_outro_tc_da(struct nfp_prog *nfp_prog)\n {\n \t/* TC direct-action mode:\n@@ -2142,17 +2073,15 @@ static void nfp_outro_xdp(struct nfp_prog *nfp_prog)\n \n static void nfp_outro(struct nfp_prog *nfp_prog)\n {\n-\tswitch (nfp_prog->act) {\n-\tcase NN_ACT_DIRECT:\n+\tswitch (nfp_prog->type) {\n+\tcase BPF_PROG_TYPE_SCHED_CLS:\n \t\tnfp_outro_tc_da(nfp_prog);\n \t\tbreak;\n-\tcase NN_ACT_TC_DROP:\n-\tcase NN_ACT_TC_REDIR:\n-\t\tnfp_outro_tc_legacy(nfp_prog);\n-\t\tbreak;\n-\tcase NN_ACT_XDP:\n+\tcase BPF_PROG_TYPE_XDP:\n \t\tnfp_outro_xdp(nfp_prog);\n \t\tbreak;\n+\tdefault:\n+\t\tWARN_ON(1);\n \t}\n }\n \n@@ -2351,7 +2280,6 @@ static int nfp_bpf_ustore_calc(struct nfp_prog *nfp_prog, __le64 *ustore)\n  * nfp_bpf_jit() - translate BPF code into NFP assembly\n  * @filter:\tkernel BPF filter struct\n  * @prog_mem:\tmemory to store assembler instructions\n- * @act:\taction attached to this eBPF program\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@@ -2359,7 +2287,6 @@ static int nfp_bpf_ustore_calc(struct nfp_prog *nfp_prog, __le64 *ustore)\n  */\n int\n nfp_bpf_jit(struct bpf_prog *filter, void *prog_mem,\n-\t    enum nfp_bpf_action_type act,\n \t    unsigned int prog_start, unsigned int prog_done,\n \t    unsigned int prog_sz, struct nfp_bpf_result *res)\n {\n@@ -2371,7 +2298,7 @@ nfp_bpf_jit(struct bpf_prog *filter, void *prog_mem,\n \t\treturn -ENOMEM;\n \n \tINIT_LIST_HEAD(&nfp_prog->insns);\n-\tnfp_prog->act = act;\n+\tnfp_prog->type = filter->type;\n \tnfp_prog->start_off = prog_start;\n \tnfp_prog->tgt_done = prog_done;\n \ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c\nindex 8e3e89cace8d..2ff97f12c160 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/main.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c\n@@ -85,34 +85,10 @@ static const char *nfp_bpf_extra_cap(struct nfp_app *app, struct nfp_net *nn)\n \treturn nfp_net_ebpf_capable(nn) ? \"BPF\" : \"\";\n }\n \n-static int\n-nfp_bpf_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id)\n-{\n-\tstruct nfp_net_bpf_priv *priv;\n-\tint ret;\n-\n-\tpriv = kmalloc(sizeof(*priv), GFP_KERNEL);\n-\tif (!priv)\n-\t\treturn -ENOMEM;\n-\n-\tnn->app_priv = priv;\n-\tspin_lock_init(&priv->rx_filter_lock);\n-\tpriv->nn = nn;\n-\ttimer_setup(&priv->rx_filter_stats_timer,\n-\t\t    nfp_net_filter_stats_timer, 0);\n-\n-\tret = nfp_app_nic_vnic_alloc(app, nn, id);\n-\tif (ret)\n-\t\tkfree(priv);\n-\n-\treturn ret;\n-}\n-\n static void nfp_bpf_vnic_free(struct nfp_app *app, struct nfp_net *nn)\n {\n \tif (nn->dp.bpf_offload_xdp)\n \t\tnfp_bpf_xdp_offload(app, nn, NULL);\n-\tkfree(nn->app_priv);\n }\n \n static int nfp_bpf_setup_tc_block_cb(enum tc_setup_type type,\n@@ -133,6 +109,13 @@ static int nfp_bpf_setup_tc_block_cb(enum tc_setup_type type,\n \t\tif (nn->dp.bpf_offload_xdp)\n \t\t\treturn -EBUSY;\n \n+\t\t/* Only support TC direct action */\n+\t\tif (!cls_bpf->exts_integrated ||\n+\t\t    tcf_exts_has_actions(cls_bpf->exts)) {\n+\t\t\tnn_err(nn, \"only direct action with no legacy actions supported\\n\");\n+\t\t\treturn -EOPNOTSUPP;\n+\t\t}\n+\n \t\treturn nfp_net_bpf_offload(nn, cls_bpf);\n \tdefault:\n \t\treturn -EOPNOTSUPP;\n@@ -184,7 +167,7 @@ const struct nfp_app_type app_bpf = {\n \n \t.extra_cap\t= nfp_bpf_extra_cap,\n \n-\t.vnic_alloc\t= nfp_bpf_vnic_alloc,\n+\t.vnic_alloc\t= nfp_app_nic_vnic_alloc,\n \t.vnic_free\t= nfp_bpf_vnic_free,\n \n \t.setup_tc\t= nfp_bpf_setup_tc,\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h\nindex bc604030ff6c..c5280de2ab14 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/main.h\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h\n@@ -65,13 +65,6 @@ enum pkt_vec {\n \tPKT_VEC_PKT_PTR\t\t= 2,\n };\n \n-enum nfp_bpf_action_type {\n-\tNN_ACT_TC_DROP,\n-\tNN_ACT_TC_REDIR,\n-\tNN_ACT_DIRECT,\n-\tNN_ACT_XDP,\n-};\n-\n #define pv_len(np)\treg_lm(1, PKT_VEC_PKT_LEN)\n #define pv_ctm_ptr(np)\treg_lm(1, PKT_VEC_PKT_PTR)\n \n@@ -147,7 +140,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- * @act: BPF program/action type (TC DA, TC with action, XDP etc.)\n+ * @type: BPF program type\n  * @num_regs: number of registers used by this program\n  * @regs_per_thread: number of basic registers allocated per thread\n  * @start_off: address of the first instruction in the memory\n@@ -164,7 +157,7 @@ struct nfp_prog {\n \tunsigned int prog_len;\n \tunsigned int __prog_alloc_len;\n \n-\tenum nfp_bpf_action_type act;\n+\tenum bpf_prog_type type;\n \n \tunsigned int num_regs;\n \tunsigned int regs_per_thread;\n@@ -188,7 +181,7 @@ struct nfp_bpf_result {\n };\n \n int\n-nfp_bpf_jit(struct bpf_prog *filter, void *prog, enum nfp_bpf_action_type act,\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 \n@@ -197,23 +190,6 @@ int nfp_prog_verify(struct nfp_prog *nfp_prog, struct bpf_prog *prog);\n struct nfp_net;\n struct tc_cls_bpf_offload;\n \n-/**\n- * struct nfp_net_bpf_priv - per-vNIC BPF private data\n- * @rx_filter:\t\tFilter offload statistics - dropped packets/bytes\n- * @rx_filter_prev:\tFilter offload statistics - values from previous update\n- * @rx_filter_change:\tJiffies when statistics last changed\n- * @rx_filter_stats_timer:  Timer for polling filter offload statistics\n- * @rx_filter_lock:\tLock protecting timer state changes (teardown)\n- */\n-struct nfp_net_bpf_priv {\n-\tstruct nfp_stat_pair rx_filter, rx_filter_prev;\n-\tunsigned long rx_filter_change;\n-\tstruct timer_list rx_filter_stats_timer;\n-\tstruct nfp_net *nn;\n-\tspinlock_t rx_filter_lock;\n-};\n-\n int nfp_net_bpf_offload(struct nfp_net *nn, struct tc_cls_bpf_offload *cls_bpf);\n-void nfp_net_filter_stats_timer(struct timer_list *t);\n \n #endif\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c\nindex 6d576f631392..b9b5d675c4d3 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c\n@@ -51,92 +51,6 @@\n #include \"../nfp_net_ctrl.h\"\n #include \"../nfp_net.h\"\n \n-void nfp_net_filter_stats_timer(struct timer_list *t)\n-{\n-\tstruct nfp_net_bpf_priv *priv = from_timer(priv, t,\n-\t\t\t\t\t\t   rx_filter_stats_timer);\n-\tstruct nfp_net *nn = priv->nn;\n-\tstruct nfp_stat_pair latest;\n-\n-\tspin_lock_bh(&priv->rx_filter_lock);\n-\n-\tif (nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF)\n-\t\tmod_timer(&priv->rx_filter_stats_timer,\n-\t\t\t  jiffies + NFP_NET_STAT_POLL_IVL);\n-\n-\tspin_unlock_bh(&priv->rx_filter_lock);\n-\n-\tlatest.pkts = nn_readq(nn, NFP_NET_CFG_STATS_APP1_FRAMES);\n-\tlatest.bytes = nn_readq(nn, NFP_NET_CFG_STATS_APP1_BYTES);\n-\n-\tif (latest.pkts != priv->rx_filter.pkts)\n-\t\tpriv->rx_filter_change = jiffies;\n-\n-\tpriv->rx_filter = latest;\n-}\n-\n-static void nfp_net_bpf_stats_reset(struct nfp_net *nn)\n-{\n-\tstruct nfp_net_bpf_priv *priv = nn->app_priv;\n-\n-\tpriv->rx_filter.pkts = nn_readq(nn, NFP_NET_CFG_STATS_APP1_FRAMES);\n-\tpriv->rx_filter.bytes = nn_readq(nn, NFP_NET_CFG_STATS_APP1_BYTES);\n-\tpriv->rx_filter_prev = priv->rx_filter;\n-\tpriv->rx_filter_change = jiffies;\n-}\n-\n-static int\n-nfp_net_bpf_stats_update(struct nfp_net *nn, struct tc_cls_bpf_offload *cls_bpf)\n-{\n-\tstruct nfp_net_bpf_priv *priv = nn->app_priv;\n-\tu64 bytes, pkts;\n-\n-\tpkts = priv->rx_filter.pkts - priv->rx_filter_prev.pkts;\n-\tbytes = priv->rx_filter.bytes - priv->rx_filter_prev.bytes;\n-\tbytes -= pkts * ETH_HLEN;\n-\n-\tpriv->rx_filter_prev = priv->rx_filter;\n-\n-\ttcf_exts_stats_update(cls_bpf->exts,\n-\t\t\t      bytes, pkts, priv->rx_filter_change);\n-\n-\treturn 0;\n-}\n-\n-static int\n-nfp_net_bpf_get_act(struct nfp_net *nn, struct tc_cls_bpf_offload *cls_bpf)\n-{\n-\tconst struct tc_action *a;\n-\tLIST_HEAD(actions);\n-\n-\tif (!cls_bpf->exts)\n-\t\treturn NN_ACT_XDP;\n-\n-\t/* TC direct action */\n-\tif (cls_bpf->exts_integrated) {\n-\t\tif (!tcf_exts_has_actions(cls_bpf->exts))\n-\t\t\treturn NN_ACT_DIRECT;\n-\n-\t\treturn -EOPNOTSUPP;\n-\t}\n-\n-\t/* TC legacy mode */\n-\tif (!tcf_exts_has_one_action(cls_bpf->exts))\n-\t\treturn -EOPNOTSUPP;\n-\n-\ttcf_exts_to_list(cls_bpf->exts, &actions);\n-\tlist_for_each_entry(a, &actions, list) {\n-\t\tif (is_tcf_gact_shot(a))\n-\t\t\treturn NN_ACT_TC_DROP;\n-\n-\t\tif (is_tcf_mirred_egress_redirect(a) &&\n-\t\t    tcf_mirred_ifindex(a) == nn->dp.netdev->ifindex)\n-\t\t\treturn NN_ACT_TC_REDIR;\n-\t}\n-\n-\treturn -EOPNOTSUPP;\n-}\n-\n static int\n nfp_net_bpf_offload_prepare(struct nfp_net *nn,\n \t\t\t    struct tc_cls_bpf_offload *cls_bpf,\n@@ -144,17 +58,11 @@ nfp_net_bpf_offload_prepare(struct nfp_net *nn,\n \t\t\t    void **code, dma_addr_t *dma_addr, u16 max_instr)\n {\n \tunsigned int code_sz = max_instr * sizeof(u64);\n-\tenum nfp_bpf_action_type act;\n \tunsigned int stack_size;\n \tu16 start_off, done_off;\n \tunsigned int max_mtu;\n \tint ret;\n \n-\tret = nfp_net_bpf_get_act(nn, cls_bpf);\n-\tif (ret < 0)\n-\t\treturn ret;\n-\tact = 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@@ -175,7 +83,7 @@ nfp_net_bpf_offload_prepare(struct nfp_net *nn,\n \tif (!*code)\n \t\treturn -ENOMEM;\n \n-\tret = nfp_bpf_jit(cls_bpf->prog, *code, act, start_off, done_off,\n+\tret = nfp_bpf_jit(cls_bpf->prog, *code, start_off, done_off,\n \t\t\t  max_instr, res);\n \tif (ret)\n \t\tgoto out;\n@@ -193,7 +101,6 @@ nfp_net_bpf_load_and_start(struct nfp_net *nn, u32 tc_flags,\n \t\t\t   unsigned int code_sz, unsigned int n_instr,\n \t\t\t   bool dense_mode)\n {\n-\tstruct nfp_net_bpf_priv *priv = nn->app_priv;\n \tu64 bpf_addr = dma_addr;\n \tint err;\n \n@@ -218,25 +125,15 @@ nfp_net_bpf_load_and_start(struct nfp_net *nn, u32 tc_flags,\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-\tnfp_net_bpf_stats_reset(nn);\n-\tmod_timer(&priv->rx_filter_stats_timer,\n-\t\t  jiffies + NFP_NET_STAT_POLL_IVL);\n }\n \n static int nfp_net_bpf_stop(struct nfp_net *nn)\n {\n-\tstruct nfp_net_bpf_priv *priv = nn->app_priv;\n-\n \tif (!(nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF))\n \t\treturn 0;\n \n-\tspin_lock_bh(&priv->rx_filter_lock);\n \tnn->dp.ctrl &= ~NFP_NET_CFG_CTRL_BPF;\n-\tspin_unlock_bh(&priv->rx_filter_lock);\n \tnn_writel(nn, NFP_NET_CFG_CTRL, nn->dp.ctrl);\n-\n-\tdel_timer_sync(&priv->rx_filter_stats_timer);\n \tnn->dp.bpf_offload_skip_sw = 0;\n \n \treturn nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_GEN);\n@@ -292,9 +189,6 @@ int nfp_net_bpf_offload(struct nfp_net *nn, struct tc_cls_bpf_offload *cls_bpf)\n \tcase TC_CLSBPF_DESTROY:\n \t\treturn nfp_net_bpf_stop(nn);\n \n-\tcase TC_CLSBPF_STATS:\n-\t\treturn nfp_net_bpf_stats_update(nn, cls_bpf);\n-\n \tdefault:\n \t\treturn -EOPNOTSUPP;\n \t}\ndiff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c\nindex a8c7615546a9..4f31bdefd331 100644\n--- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c\n+++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c\n@@ -81,7 +81,7 @@ nfp_bpf_check_exit(struct nfp_prog *nfp_prog,\n \tconst struct bpf_reg_state *reg0 = cur_regs(env) + BPF_REG_0;\n \tu64 imm;\n \n-\tif (nfp_prog->act == NN_ACT_XDP)\n+\tif (nfp_prog->type == BPF_PROG_TYPE_XDP)\n \t\treturn 0;\n \n \tif (!(reg0->type == SCALAR_VALUE && tnum_is_const(reg0->var_off))) {\n@@ -94,13 +94,8 @@ nfp_bpf_check_exit(struct nfp_prog *nfp_prog,\n \t}\n \n \timm = reg0->var_off.value;\n-\tif (nfp_prog->act != NN_ACT_DIRECT && imm != 0 && (imm & ~0U) != ~0U) {\n-\t\tpr_info(\"unsupported exit state: %d, imm: %llx\\n\",\n-\t\t\treg0->type, imm);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (nfp_prog->act == NN_ACT_DIRECT && imm <= TC_ACT_REDIRECT &&\n+\tif (nfp_prog->type == BPF_PROG_TYPE_SCHED_CLS &&\n+\t    imm <= TC_ACT_REDIRECT &&\n \t    imm != TC_ACT_SHOT && imm != TC_ACT_STOLEN &&\n \t    imm != TC_ACT_QUEUED) {\n \t\tpr_info(\"unsupported exit state: %d, imm: %llx\\n\",\n",
    "prefixes": [
        "net-next",
        "v2",
        "07/15"
    ]
}