get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1375808,
    "url": "http://patchwork.ozlabs.org/api/patches/1375808/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/8ace573b1a8d74f1a1bd072c08283a8560bd1b48.1601648734.git.lorenzo@kernel.org/",
    "project": {
        "id": 7,
        "url": "http://patchwork.ozlabs.org/api/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": "<8ace573b1a8d74f1a1bd072c08283a8560bd1b48.1601648734.git.lorenzo@kernel.org>",
    "list_archive_url": null,
    "date": "2020-10-02T14:42:05",
    "name": "[v4,bpf-next,07/13] samples/bpf: add bpf program that uses xdp mb helpers",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": false,
    "hash": "ac0e79ea82f60f27ca6cc12073e627f865f1bff0",
    "submitter": {
        "id": 76007,
        "url": "http://patchwork.ozlabs.org/api/people/76007/?format=api",
        "name": "Lorenzo Bianconi",
        "email": "lorenzo@kernel.org"
    },
    "delegate": {
        "id": 77147,
        "url": "http://patchwork.ozlabs.org/api/users/77147/?format=api",
        "username": "bpf",
        "first_name": "BPF",
        "last_name": "Maintainers",
        "email": "bpf@iogearbox.net"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/8ace573b1a8d74f1a1bd072c08283a8560bd1b48.1601648734.git.lorenzo@kernel.org/mbox/",
    "series": [
        {
            "id": 205635,
            "url": "http://patchwork.ozlabs.org/api/series/205635/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=205635",
            "date": "2020-10-02T14:41:58",
            "name": "mvneta: introduce XDP multi-buffer support",
            "version": 4,
            "mbox": "http://patchwork.ozlabs.org/series/205635/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/1375808/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/1375808/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<netdev-owner@vger.kernel.org>",
        "X-Original-To": "patchwork-incoming-netdev@ozlabs.org",
        "Delivered-To": "patchwork-incoming-netdev@ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=23.128.96.18; helo=vger.kernel.org;\n envelope-from=netdev-owner@vger.kernel.org; receiver=<UNKNOWN>)",
            "ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=kernel.org",
            "ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=default header.b=0ut98xk9;\n\tdkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [23.128.96.18])\n\tby ozlabs.org (Postfix) with ESMTP id 4C2t5G0dcSz9sSC\n\tfor <patchwork-incoming-netdev@ozlabs.org>;\n Sat,  3 Oct 2020 00:42:58 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n        id S2388216AbgJBOm5 (ORCPT\n        <rfc822;patchwork-incoming-netdev@ozlabs.org>);\n        Fri, 2 Oct 2020 10:42:57 -0400",
            "from mail.kernel.org ([198.145.29.99]:60940 \"EHLO mail.kernel.org\"\n        rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n        id S1726017AbgJBOm5 (ORCPT <rfc822;netdev@vger.kernel.org>);\n        Fri, 2 Oct 2020 10:42:57 -0400",
            "from lore-desk.redhat.com (unknown [176.207.245.61])\n        (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n        (No client certificate requested)\n        by mail.kernel.org (Postfix) with ESMTPSA id C66F120708;\n        Fri,  2 Oct 2020 14:42:53 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n        s=default; t=1601649776;\n        bh=lFcWqY7rLwu78iOPKE7givKvyCMBOdqm51HhVpZKRoQ=;\n        h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n        b=0ut98xk9SC9/wRWzNj7wXYK6m9Gzt+FyLkNf+1IFxsI5SLtSHNsdzIbHRYScQSjsB\n         fhcoRyS7Byw9S9eLAj0sSG3dwlfDjKgljb+HcngnqS597p23+Y70Zbz2qt9DJSAbMY\n         +sq+Fy5klrgofErhh7YS1KGGwgfvoOQJrG/up0ek=",
        "From": "Lorenzo Bianconi <lorenzo@kernel.org>",
        "To": "bpf@vger.kernel.org, netdev@vger.kernel.org",
        "Cc": "davem@davemloft.net, kuba@kernel.org, ast@kernel.org,\n        daniel@iogearbox.net, shayagr@amazon.com, sameehj@amazon.com,\n        john.fastabend@gmail.com, dsahern@kernel.org, brouer@redhat.com,\n        lorenzo.bianconi@redhat.com, echaudro@redhat.com",
        "Subject": "[PATCH v4 bpf-next 07/13] samples/bpf: add bpf program that uses xdp\n mb helpers",
        "Date": "Fri,  2 Oct 2020 16:42:05 +0200",
        "Message-Id": "\n <8ace573b1a8d74f1a1bd072c08283a8560bd1b48.1601648734.git.lorenzo@kernel.org>",
        "X-Mailer": "git-send-email 2.26.2",
        "In-Reply-To": "<cover.1601648734.git.lorenzo@kernel.org>",
        "References": "<cover.1601648734.git.lorenzo@kernel.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "From: Sameeh Jubran <sameehj@amazon.com>\n\nThe bpf program returns XDP_PASS for every packet and calculates the\ntotal number of bytes in its linear and paged parts.\n\nThe program is executed with:\n./xdp_mb [if name]\n\nand has the following output format:\n[if index]: [rx packet count] pkt/sec, [number of bytes] bytes/sec\n\nSigned-off-by: Shay Agroskin <shayagr@amazon.com>\nSigned-off-by: Sameeh Jubran <sameehj@amazon.com>\nSigned-off-by: Lorenzo Bianconi <lorenzo@kernel.org>\n---\n samples/bpf/Makefile      |   3 +\n samples/bpf/xdp_mb_kern.c |  68 ++++++++++++++\n samples/bpf/xdp_mb_user.c | 182 ++++++++++++++++++++++++++++++++++++++\n 3 files changed, 253 insertions(+)\n create mode 100644 samples/bpf/xdp_mb_kern.c\n create mode 100644 samples/bpf/xdp_mb_user.c",
    "diff": "diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile\nindex 4f1ed0e3cf9f..12e32516f02a 100644\n--- a/samples/bpf/Makefile\n+++ b/samples/bpf/Makefile\n@@ -54,6 +54,7 @@ tprogs-y += task_fd_query\n tprogs-y += xdp_sample_pkts\n tprogs-y += ibumad\n tprogs-y += hbm\n+tprogs-y += xdp_mb\n \n # Libbpf dependencies\n LIBBPF = $(TOOLS_PATH)/lib/bpf/libbpf.a\n@@ -111,6 +112,7 @@ task_fd_query-objs := bpf_load.o task_fd_query_user.o $(TRACE_HELPERS)\n xdp_sample_pkts-objs := xdp_sample_pkts_user.o $(TRACE_HELPERS)\n ibumad-objs := bpf_load.o ibumad_user.o $(TRACE_HELPERS)\n hbm-objs := bpf_load.o hbm.o $(CGROUP_HELPERS)\n+xdp_mb-objs := xdp_mb_user.o\n \n # Tell kbuild to always build the programs\n always-y := $(tprogs-y)\n@@ -172,6 +174,7 @@ always-y += ibumad_kern.o\n always-y += hbm_out_kern.o\n always-y += hbm_edt_kern.o\n always-y += xdpsock_kern.o\n+always-y += xdp_mb_kern.o\n \n ifeq ($(ARCH), arm)\n # Strip all except -D__LINUX_ARM_ARCH__ option needed to handle linux\ndiff --git a/samples/bpf/xdp_mb_kern.c b/samples/bpf/xdp_mb_kern.c\nnew file mode 100644\nindex 000000000000..f366bce92fc7\n--- /dev/null\n+++ b/samples/bpf/xdp_mb_kern.c\n@@ -0,0 +1,68 @@\n+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB\n+/*\n+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All rights reserved.\n+ */\n+#define KBUILD_MODNAME \"foo\"\n+#include <uapi/linux/bpf.h>\n+#include <linux/in.h>\n+#include <linux/if_ether.h>\n+#include <linux/if_packet.h>\n+#include <linux/if_vlan.h>\n+#include <linux/ip.h>\n+#include <linux/ipv6.h>\n+#include <bpf/bpf_helpers.h>\n+\n+/* count RX packets */\n+struct {\n+\t__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);\n+\t__type(key, u32);\n+\t__type(value, long);\n+\t__uint(max_entries, 1);\n+} rx_cnt SEC(\".maps\");\n+\n+/* count RX fragments */\n+struct {\n+\t__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);\n+\t__type(key, u32);\n+\t__type(value, long);\n+\t__uint(max_entries, 1);\n+} rx_frags SEC(\".maps\");\n+\n+/* count total number of bytes */\n+struct {\n+\t__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);\n+\t__type(key, u32);\n+\t__type(value, long);\n+\t__uint(max_entries, 1);\n+} tot_len SEC(\".maps\");\n+\n+SEC(\"xdp_mb\")\n+int xdp_mb_prog(struct xdp_md *ctx)\n+{\n+\tvoid *data_end = (void *)(long)ctx->data_end;\n+\tvoid *data = (void *)(long)ctx->data;\n+\tu32 frag_offset = 0, frag_size = 0;\n+\tu32 key = 0, nfrags;\n+\tlong *value;\n+\tint i, len;\n+\n+\tvalue = bpf_map_lookup_elem(&rx_cnt, &key);\n+\tif (value)\n+\t\t*value += 1;\n+\n+\tlen = data_end - data;\n+\tnfrags = bpf_xdp_get_frags_count(ctx);\n+\tlen += bpf_xdp_get_frags_total_size(ctx);\n+\n+\tvalue = bpf_map_lookup_elem(&tot_len, &key);\n+\tif (value)\n+\t\t*value += len;\n+\n+\tvalue = bpf_map_lookup_elem(&rx_frags, &key);\n+\tif (value)\n+\t\t*value += nfrags;\n+\n+\treturn XDP_PASS;\n+}\n+\n+char _license[] SEC(\"license\") = \"GPL\";\ndiff --git a/samples/bpf/xdp_mb_user.c b/samples/bpf/xdp_mb_user.c\nnew file mode 100644\nindex 000000000000..6f555e94b748\n--- /dev/null\n+++ b/samples/bpf/xdp_mb_user.c\n@@ -0,0 +1,182 @@\n+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB\n+/*\n+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All rights reserved.\n+ */\n+#include <linux/bpf.h>\n+#include <linux/if_link.h>\n+#include <assert.h>\n+#include <errno.h>\n+#include <signal.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <unistd.h>\n+#include <libgen.h>\n+#include <sys/resource.h>\n+#include <net/if.h>\n+\n+#include \"bpf_util.h\"\n+#include <bpf/bpf.h>\n+#include <bpf/libbpf.h>\n+\n+static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST | XDP_FLAGS_DRV_MODE;\n+static __u32 prog_id;\n+static int rx_cnt_fd, tot_len_fd, rx_frags_fd;\n+static int ifindex;\n+\n+static void int_exit(int sig)\n+{\n+\t__u32 curr_prog_id = 0;\n+\n+\tif (bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags)) {\n+\t\tprintf(\"bpf_get_link_xdp_id failed\\n\");\n+\t\texit(1);\n+\t}\n+\tif (prog_id == curr_prog_id)\n+\t\tbpf_set_link_xdp_fd(ifindex, -1, xdp_flags);\n+\telse if (!curr_prog_id)\n+\t\tprintf(\"couldn't find a prog id on a given interface\\n\");\n+\telse\n+\t\tprintf(\"program on interface changed, not removing\\n\");\n+\texit(0);\n+}\n+\n+/* count total packets and bytes per second */\n+static void poll_stats(int interval)\n+{\n+\tunsigned int nr_cpus = bpf_num_possible_cpus();\n+\t__u64 rx_frags_cnt[nr_cpus], rx_frags_cnt_prev[nr_cpus];\n+\t__u64 tot_len[nr_cpus], tot_len_prev[nr_cpus];\n+\t__u64 rx_cnt[nr_cpus], rx_cnt_prev[nr_cpus];\n+\tint i;\n+\n+\tmemset(rx_frags_cnt_prev, 0, sizeof(rx_frags_cnt_prev));\n+\tmemset(tot_len_prev, 0, sizeof(tot_len_prev));\n+\tmemset(rx_cnt_prev, 0, sizeof(rx_cnt_prev));\n+\n+\twhile (1) {\n+\t\t__u64 n_rx_pkts = 0, rx_frags = 0, rx_len = 0;\n+\t\t__u32 key = 0;\n+\n+\t\tsleep(interval);\n+\n+\t\t/* fetch rx cnt */\n+\t\tassert(bpf_map_lookup_elem(rx_cnt_fd, &key, rx_cnt) == 0);\n+\t\tfor (i = 0; i < nr_cpus; i++)\n+\t\t\tn_rx_pkts += (rx_cnt[i] - rx_cnt_prev[i]);\n+\t\tmemcpy(rx_cnt_prev, rx_cnt, sizeof(rx_cnt));\n+\n+\t\t/* fetch rx frags */\n+\t\tassert(bpf_map_lookup_elem(rx_frags_fd, &key, rx_frags_cnt) == 0);\n+\t\tfor (i = 0; i < nr_cpus; i++)\n+\t\t\trx_frags += (rx_frags_cnt[i] - rx_frags_cnt_prev[i]);\n+\t\tmemcpy(rx_frags_cnt_prev, rx_frags_cnt, sizeof(rx_frags_cnt));\n+\n+\t\t/* count total bytes of packets */\n+\t\tassert(bpf_map_lookup_elem(tot_len_fd, &key, tot_len) == 0);\n+\t\tfor (i = 0; i < nr_cpus; i++)\n+\t\t\trx_len += (tot_len[i] - tot_len_prev[i]);\n+\t\tmemcpy(tot_len_prev, tot_len, sizeof(tot_len));\n+\n+\t\tif (n_rx_pkts)\n+\t\t\tprintf(\"ifindex %i: %10llu pkt/s, %10llu frags/s, %10llu bytes/s\\n\",\n+\t\t\t       ifindex, n_rx_pkts / interval, rx_frags / interval,\n+\t\t\t       rx_len / interval);\n+\t}\n+}\n+\n+static void usage(const char *prog)\n+{\n+\tfprintf(stderr,\n+\t\t\"%s: %s [OPTS] IFACE\\n\\n\"\n+\t\t\"OPTS:\\n\"\n+\t\t\"    -F    force loading prog\\n\",\n+\t\t__func__, prog);\n+}\n+\n+int main(int argc, char **argv)\n+{\n+\tstruct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};\n+\tstruct bpf_prog_load_attr prog_load_attr = {\n+\t\t.prog_type\t= BPF_PROG_TYPE_XDP,\n+\t};\n+\tint prog_fd, opt;\n+\tstruct bpf_prog_info info = {};\n+\t__u32 info_len = sizeof(info);\n+\tconst char *optstr = \"F\";\n+\tstruct bpf_program *prog;\n+\tstruct bpf_object *obj;\n+\tchar filename[256];\n+\tint err;\n+\n+\twhile ((opt = getopt(argc, argv, optstr)) != -1) {\n+\t\tswitch (opt) {\n+\t\tcase 'F':\n+\t\t\txdp_flags &= ~XDP_FLAGS_UPDATE_IF_NOEXIST;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tusage(basename(argv[0]));\n+\t\t\treturn 1;\n+\t\t}\n+\t}\n+\n+\tif (optind == argc) {\n+\t\tusage(basename(argv[0]));\n+\t\treturn 1;\n+\t}\n+\n+\tif (setrlimit(RLIMIT_MEMLOCK, &r)) {\n+\t\tperror(\"setrlimit(RLIMIT_MEMLOCK)\");\n+\t\treturn 1;\n+\t}\n+\n+\tifindex = if_nametoindex(argv[optind]);\n+\tif (!ifindex) {\n+\t\tperror(\"if_nametoindex\");\n+\t\treturn 1;\n+\t}\n+\n+\tsnprintf(filename, sizeof(filename), \"%s_kern.o\", argv[0]);\n+\tprog_load_attr.file = filename;\n+\n+\tif (bpf_prog_load_xattr(&prog_load_attr, &obj, &prog_fd))\n+\t\treturn 1;\n+\n+\tprog = bpf_program__next(NULL, obj);\n+\tif (!prog) {\n+\t\tprintf(\"finding a prog in obj file failed\\n\");\n+\t\treturn 1;\n+\t}\n+\n+\tif (!prog_fd) {\n+\t\tprintf(\"bpf_prog_load_xattr: %s\\n\", strerror(errno));\n+\t\treturn 1;\n+\t}\n+\n+\trx_cnt_fd = bpf_object__find_map_fd_by_name(obj, \"rx_cnt\");\n+\trx_frags_fd = bpf_object__find_map_fd_by_name(obj, \"rx_frags\");\n+\ttot_len_fd = bpf_object__find_map_fd_by_name(obj, \"tot_len\");\n+\tif (rx_cnt_fd < 0 || rx_frags_fd < 0 || tot_len_fd < 0) {\n+\t\tprintf(\"bpf_object__find_map_fd_by_name failed\\n\");\n+\t\treturn 1;\n+\t}\n+\n+\tif (bpf_set_link_xdp_fd(ifindex, prog_fd, xdp_flags) < 0) {\n+\t\tprintf(\"ERROR: link set xdp fd failed on %d\\n\", ifindex);\n+\t\treturn 1;\n+\t}\n+\n+\terr = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);\n+\tif (err) {\n+\t\tprintf(\"can't get prog info - %s\\n\", strerror(errno));\n+\t\treturn err;\n+\t}\n+\tprog_id = info.id;\n+\n+\tsignal(SIGINT, int_exit);\n+\tsignal(SIGTERM, int_exit);\n+\n+\tpoll_stats(1);\n+\n+\treturn 0;\n+}\n",
    "prefixes": [
        "v4",
        "bpf-next",
        "07/13"
    ]
}