get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1028757,
    "url": "http://patchwork.ozlabs.org/api/patches/1028757/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20190121163356.31332-1-bjorn.topel@gmail.com/",
    "project": {
        "id": 46,
        "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api",
        "name": "Intel Wired Ethernet development",
        "link_name": "intel-wired-lan",
        "list_id": "intel-wired-lan.osuosl.org",
        "list_email": "intel-wired-lan@osuosl.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20190121163356.31332-1-bjorn.topel@gmail.com>",
    "list_archive_url": null,
    "date": "2019-01-21T16:33:56",
    "name": "i40e: replace switch-statement with if-clause",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "e5e1b91d89afe2828805e7b1659db29b3a54039c",
    "submitter": {
        "id": 70569,
        "url": "http://patchwork.ozlabs.org/api/people/70569/?format=api",
        "name": "Björn Töpel",
        "email": "bjorn.topel@gmail.com"
    },
    "delegate": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/users/68/?format=api",
        "username": "jtkirshe",
        "first_name": "Jeff",
        "last_name": "Kirsher",
        "email": "jeffrey.t.kirsher@intel.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20190121163356.31332-1-bjorn.topel@gmail.com/mbox/",
    "series": [
        {
            "id": 87348,
            "url": "http://patchwork.ozlabs.org/api/series/87348/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=87348",
            "date": "2019-01-21T16:33:56",
            "name": "i40e: replace switch-statement with if-clause",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/87348/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/1028757/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/1028757/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<intel-wired-lan-bounces@osuosl.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=osuosl.org\n\t(client-ip=140.211.166.138; helo=whitealder.osuosl.org;\n\tenvelope-from=intel-wired-lan-bounces@osuosl.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org;\n\tdmarc=fail (p=none dis=none) header.from=gmail.com",
            "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"up0qSvka\"; dkim-atps=neutral"
        ],
        "Received": [
            "from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 43jxwC3zDWz9s7T\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 22 Jan 2019 03:34:35 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id A2EF181499;\n\tMon, 21 Jan 2019 16:34:33 +0000 (UTC)",
            "from whitealder.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id 2Y3ktdVQDkHM; Mon, 21 Jan 2019 16:34:32 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 42E2E824B0;\n\tMon, 21 Jan 2019 16:34:32 +0000 (UTC)",
            "from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\tby ash.osuosl.org (Postfix) with ESMTP id 55FE31BF296\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 21 Jan 2019 16:34:30 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 51F7E8147D\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 21 Jan 2019 16:34:30 +0000 (UTC)",
            "from whitealder.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id sYObEmoDCcKa for <intel-wired-lan@lists.osuosl.org>;\n\tMon, 21 Jan 2019 16:34:29 +0000 (UTC)",
            "from mail-pg1-f193.google.com (mail-pg1-f193.google.com\n\t[209.85.215.193])\n\tby whitealder.osuosl.org (Postfix) with ESMTPS id 8E5AC81442\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 21 Jan 2019 16:34:29 +0000 (UTC)",
            "by mail-pg1-f193.google.com with SMTP id m1so9699413pgq.8\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 21 Jan 2019 08:34:29 -0800 (PST)",
            "from btopel-mobl.isw.intel.com ([192.55.54.42])\n\tby smtp.gmail.com with ESMTPSA id\n\te9sm16225989pff.5.2019.01.21.08.34.26\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tMon, 21 Jan 2019 08:34:28 -0800 (PST)"
        ],
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=from:to:cc:subject:date:message-id:mime-version\n\t:content-transfer-encoding;\n\tbh=ZjcFvHbd6iRIroDPAuVeiqXQw0ipZPZGgmNWF9u8XnU=;\n\tb=up0qSvkaVwOVLQHXKK1oEpZJ/OvUV8GR9+9/sa0hZkvVXrin7cjgVmpXhLGpTkeMfM\n\t/TjSh727zRpwHx71/jqtDGmbWk8QD8ygi/zLBoRzTH5r5PXZIeoMGz0XHtEkmIyxgPCu\n\tbOlrmJy+ZLJkeHyQ/o7GUHBFaTOaS3vIJeYu7P7I/vT3fss6WAQhlOzb5dv3J3gM1wUu\n\trUxr3IU5JSagi8y6/DYkh+kcjm5eVYcO8KzE2qUjMLdj+cdhBhTAvqVQg0fy+EDHzZ48\n\tlZcF0RXBL2Ul85HGpFAP+qAJh7T0i4IN70g+GiNqU2bBV7qyop2YIapefQxTBAbIEmU1\n\tWUBg==",
        "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:mime-version\n\t:content-transfer-encoding;\n\tbh=ZjcFvHbd6iRIroDPAuVeiqXQw0ipZPZGgmNWF9u8XnU=;\n\tb=oRWMMyYOPZqOYTRAbgy2OIsiiSRYXcSOfy5rPxB+fS2BrP8vVmvV3upZLYTCYfTCxA\n\tWSxh/6n8tH5RabmxXA3YMwF6zCZKD8Qh0LRGXJ5ws2lI9Dyq8VvgzgZRhJRe7PcBes/W\n\t3tOnws9CdfI7CT5SVuUS1jqpP9tZ09lW3rmp7T8SKMBvBLnwKQOd44zfvxzsC6/6jklW\n\tFrW2FSQXRlLOYlGNEEejZNVGRaK/iuyxrLTqVhCstB1ONPlWKi7FQRnyavSPV9F8M+fq\n\t4eY6Dm3G7u1ZunNVqVf3tELoQfq9IBx4+4vpThJqfoMShTGhGyPLgXwY4t933F2xvaKa\n\txMvg==",
        "X-Gm-Message-State": "AJcUukerGLHCTOJaUEjR0wuw7wh+3G0UALj72fT8O4/EefbR8TGfsuQz\n\t2BPa1xEonij0hPyhiO124OCH3kH+W+8=",
        "X-Google-Smtp-Source": "ALg8bN5cv37P89UnfREgOtCmuZ27gsozgfFCvhC3z/mxQvUu5RxluFfkX6OGQMVmKqlO2acjxRGHlw==",
        "X-Received": "by 2002:a62:37c3:: with SMTP id\n\te186mr30924484pfa.251.1548088468640; \n\tMon, 21 Jan 2019 08:34:28 -0800 (PST)",
        "From": "bjorn.topel@gmail.com",
        "To": "intel-wired-lan@lists.osuosl.org",
        "Date": "Mon, 21 Jan 2019 17:33:56 +0100",
        "Message-Id": "<20190121163356.31332-1-bjorn.topel@gmail.com>",
        "X-Mailer": "git-send-email 2.19.1",
        "MIME-Version": "1.0",
        "Subject": "[Intel-wired-lan] [PATCH] i40e: replace switch-statement with\n\tif-clause",
        "X-BeenThere": "intel-wired-lan@osuosl.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.osuosl.org>",
        "List-Unsubscribe": "<https://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>",
        "List-Post": "<mailto:intel-wired-lan@osuosl.org>",
        "List-Help": "<mailto:intel-wired-lan-request@osuosl.org?subject=help>",
        "List-Subscribe": "<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>",
        "Cc": "netdev@vger.kernel.org, =?utf-8?b?QmrDtnJuIFTDtnBlbA==?=\n\t<bjorn.topel@intel.com>, magnus.karlsson@gmail.com,\n\tmagnus.karlsson@intel.com, brouer@redhat.com",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "base64",
        "Errors-To": "intel-wired-lan-bounces@osuosl.org",
        "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>"
    },
    "content": "From: Björn Töpel <bjorn.topel@intel.com>\n\nGCC will generate jump tables for switch-statements with more than 5\ncase statements. An entry into the jump table is an indirect call,\nwhich means that for CONFIG_RETPOLINE builds, this is rather\nexpensive.\n\nThis commit replaces the switch-statement that acts on the XDP program\nresult with an if-clause.\n\nThe if-clause was also refactored into a common function that can be\nused by AF_XDP zero-copy and non-zero-copy code.\n\nPerformance prior this patch:\n$ sudo ./xdp_rxq_info --dev enp134s0f0 --action XDP_DROP\nRunning XDP on dev:enp134s0f0 (ifindex:7) action:XDP_DROP options:no_touch\nXDP stats       CPU     pps         issue-pps\nXDP-RX CPU      20      18983018    0\nXDP-RX CPU      total   18983018\n\nRXQ stats       RXQ:CPU pps         issue-pps\nrx_queue_index   20:20  18983012    0\nrx_queue_index   20:sum 18983012\n\n$ sudo ./xdpsock -i enp134s0f0 -q 20 -n 2 -z -r\n sock0@enp134s0f0:20 rxdrop\n                pps         pkts        2.00\nrx              14,641,496  144,751,092\ntx              0           0\n\nAnd after:\n$ sudo ./xdp_rxq_info --dev enp134s0f0 --action XDP_DROP\nRunning XDP on dev:enp134s0f0 (ifindex:7) action:XDP_DROP options:no_touch\nXDP stats       CPU     pps         issue-pps\nXDP-RX CPU      20      24000986    0\nXDP-RX CPU      total   24000986\n\nRXQ stats       RXQ:CPU pps         issue-pps\nrx_queue_index   20:20  24000985    0\nrx_queue_index   20:sum 24000985\n\n  +26%\n\n$ sudo ./xdpsock -i enp134s0f0 -q 20 -n 2 -z -r\n sock0@enp134s0f0:20 rxdrop\n                pps         pkts        2.00\nrx              17,623,578  163,503,263\ntx              0           0\n\n  +20%\n\nSigned-off-by: Björn Töpel <bjorn.topel@intel.com>\n---\n drivers/net/ethernet/intel/i40e/i40e_txrx.c   | 31 ++++---------------\n .../ethernet/intel/i40e/i40e_txrx_common.h    | 27 ++++++++++++++++\n drivers/net/ethernet/intel/i40e/i40e_xsk.c    | 24 ++------------\n 3 files changed, 35 insertions(+), 47 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\nindex a7e14e98889f..b339b7ee6380 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n@@ -2,7 +2,6 @@\n /* Copyright(c) 2013 - 2018 Intel Corporation. */\n \n #include <linux/prefetch.h>\n-#include <linux/bpf_trace.h>\n #include <net/xdp.h>\n #include \"i40e.h\"\n #include \"i40e_trace.h\"\n@@ -2195,41 +2194,23 @@ int i40e_xmit_xdp_tx_ring(struct xdp_buff *xdp, struct i40e_ring *xdp_ring)\n static struct sk_buff *i40e_run_xdp(struct i40e_ring *rx_ring,\n \t\t\t\t    struct xdp_buff *xdp)\n {\n-\tint err, result = I40E_XDP_PASS;\n-\tstruct i40e_ring *xdp_ring;\n \tstruct bpf_prog *xdp_prog;\n+\tint result;\n \tu32 act;\n \n \trcu_read_lock();\n \txdp_prog = READ_ONCE(rx_ring->xdp_prog);\n \n-\tif (!xdp_prog)\n+\tif (!xdp_prog) {\n+\t\tresult = I40E_XDP_PASS;\n \t\tgoto xdp_out;\n+\t}\n \n \tprefetchw(xdp->data_hard_start); /* xdp_frame write */\n \n \tact = bpf_prog_run_xdp(xdp_prog, xdp);\n-\tswitch (act) {\n-\tcase XDP_PASS:\n-\t\tbreak;\n-\tcase XDP_TX:\n-\t\txdp_ring = rx_ring->vsi->xdp_rings[rx_ring->queue_index];\n-\t\tresult = i40e_xmit_xdp_tx_ring(xdp, xdp_ring);\n-\t\tbreak;\n-\tcase XDP_REDIRECT:\n-\t\terr = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog);\n-\t\tresult = !err ? I40E_XDP_REDIR : I40E_XDP_CONSUMED;\n-\t\tbreak;\n-\tdefault:\n-\t\tbpf_warn_invalid_xdp_action(act);\n-\t\t/* fall through */\n-\tcase XDP_ABORTED:\n-\t\ttrace_xdp_exception(rx_ring->netdev, xdp_prog, act);\n-\t\t/* fall through -- handle aborts by dropping packet */\n-\tcase XDP_DROP:\n-\t\tresult = I40E_XDP_CONSUMED;\n-\t\tbreak;\n-\t}\n+\ti40e_xdp_do_action(act, &result, rx_ring, xdp, xdp_prog);\n+\n xdp_out:\n \trcu_read_unlock();\n \treturn ERR_PTR(-result);\ndiff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx_common.h b/drivers/net/ethernet/intel/i40e/i40e_txrx_common.h\nindex 8af0e99c6c0d..8cc4d8365f9e 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_txrx_common.h\n+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx_common.h\n@@ -4,6 +4,8 @@\n #ifndef I40E_TXRX_COMMON_\n #define I40E_TXRX_COMMON_\n \n+#include <linux/bpf_trace.h>\n+\n void i40e_fd_handle_status(struct i40e_ring *rx_ring,\n \t\t\t   union i40e_rx_desc *rx_desc, u8 prog_id);\n int i40e_xmit_xdp_tx_ring(struct xdp_buff *xdp, struct i40e_ring *xdp_ring);\n@@ -88,4 +90,29 @@ void i40e_xsk_clean_rx_ring(struct i40e_ring *rx_ring);\n void i40e_xsk_clean_tx_ring(struct i40e_ring *tx_ring);\n bool i40e_xsk_any_rx_ring_enabled(struct i40e_vsi *vsi);\n \n+static inline void i40e_xdp_do_action(u32 act, int *result,\n+\t\t\t\t      struct i40e_ring *rx_ring,\n+\t\t\t\t      struct xdp_buff *xdp,\n+\t\t\t\t      struct bpf_prog *xdp_prog)\n+{\n+\tstruct i40e_ring *xdp_ring;\n+\tint err;\n+\n+\tif (act == XDP_TX) {\n+\t\txdp_ring = rx_ring->vsi->xdp_rings[rx_ring->queue_index];\n+\t\t*result = i40e_xmit_xdp_tx_ring(xdp, xdp_ring);\n+\t} else if (act == XDP_REDIRECT) {\n+\t\terr = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog);\n+\t\t*result = !err ? I40E_XDP_REDIR : I40E_XDP_CONSUMED;\n+\t} else if (act == XDP_PASS) {\n+\t\t*result = I40E_XDP_PASS;\n+\t} else if (act == XDP_DROP) {\n+\t\t*result = I40E_XDP_CONSUMED;\n+\t} else {\n+\t\tif (act != XDP_ABORTED)\n+\t\t\tbpf_warn_invalid_xdp_action(act);\n+\t\ttrace_xdp_exception(rx_ring->netdev, xdp_prog, act);\n+\t\t*result = I40E_XDP_CONSUMED;\n+\t}\n+}\n #endif /* I40E_TXRX_COMMON_ */\ndiff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c\nindex 870cf654e436..1ed56475ec78 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c\n@@ -282,9 +282,8 @@ int i40e_xsk_umem_setup(struct i40e_vsi *vsi, struct xdp_umem *umem,\n  **/\n static int i40e_run_xdp_zc(struct i40e_ring *rx_ring, struct xdp_buff *xdp)\n {\n-\tint err, result = I40E_XDP_PASS;\n-\tstruct i40e_ring *xdp_ring;\n \tstruct bpf_prog *xdp_prog;\n+\tint result;\n \tu32 act;\n \n \trcu_read_lock();\n@@ -294,26 +293,7 @@ static int i40e_run_xdp_zc(struct i40e_ring *rx_ring, struct xdp_buff *xdp)\n \txdp_prog = READ_ONCE(rx_ring->xdp_prog);\n \tact = bpf_prog_run_xdp(xdp_prog, xdp);\n \txdp->handle += xdp->data - xdp->data_hard_start;\n-\tswitch (act) {\n-\tcase XDP_PASS:\n-\t\tbreak;\n-\tcase XDP_TX:\n-\t\txdp_ring = rx_ring->vsi->xdp_rings[rx_ring->queue_index];\n-\t\tresult = i40e_xmit_xdp_tx_ring(xdp, xdp_ring);\n-\t\tbreak;\n-\tcase XDP_REDIRECT:\n-\t\terr = xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog);\n-\t\tresult = !err ? I40E_XDP_REDIR : I40E_XDP_CONSUMED;\n-\t\tbreak;\n-\tdefault:\n-\t\tbpf_warn_invalid_xdp_action(act);\n-\tcase XDP_ABORTED:\n-\t\ttrace_xdp_exception(rx_ring->netdev, xdp_prog, act);\n-\t\t/* fallthrough -- handle aborts by dropping packet */\n-\tcase XDP_DROP:\n-\t\tresult = I40E_XDP_CONSUMED;\n-\t\tbreak;\n-\t}\n+\ti40e_xdp_do_action(act, &result, rx_ring, xdp, xdp_prog);\n \trcu_read_unlock();\n \treturn result;\n }\n",
    "prefixes": []
}