Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/1375808/?format=api
{ "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" ] }