Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/833245/?format=api
{ "id": 833245, "url": "http://patchwork.ozlabs.org/api/1.2/patches/833245/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20171102075917.2780-3-bhole_prashant_q7@lab.ntt.co.jp/", "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": "<20171102075917.2780-3-bhole_prashant_q7@lab.ntt.co.jp>", "list_archive_url": null, "date": "2017-11-02T07:59:16", "name": "[net-next,V2,2/3] tools: bpftool: show filenames of pinned objects", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": true, "hash": "e9d5d715e1f8332de18fc6ebcf4543306fc8f847", "submitter": { "id": 72702, "url": "http://patchwork.ozlabs.org/api/1.2/people/72702/?format=api", "name": "Prashant Bhole", "email": "bhole_prashant_q7@lab.ntt.co.jp" }, "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/20171102075917.2780-3-bhole_prashant_q7@lab.ntt.co.jp/mbox/", "series": [ { "id": 11451, "url": "http://patchwork.ozlabs.org/api/1.2/series/11451/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=11451", "date": "2017-11-02T07:59:15", "name": "tools: bpftool: show filenames of pinned objects", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/11451/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/833245/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/833245/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>)", "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3ySHbd15zFz9t2f\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 2 Nov 2017 19:01:33 +1100 (AEDT)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1755647AbdKBIBb (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tThu, 2 Nov 2017 04:01:31 -0400", "from tama500.ecl.ntt.co.jp ([129.60.39.148]:33068 \"EHLO\n\ttama500.ecl.ntt.co.jp\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1755638AbdKBIB3 (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Thu, 2 Nov 2017 04:01:29 -0400", "from vc1.ecl.ntt.co.jp (vc1.ecl.ntt.co.jp [129.60.86.153])\n\tby tama500.ecl.ntt.co.jp (8.13.8/8.13.8) with ESMTP id vA281Bn9021346;\n\tThu, 2 Nov 2017 17:01:11 +0900", "from vc1.ecl.ntt.co.jp (localhost [127.0.0.1])\n\tby vc1.ecl.ntt.co.jp (Postfix) with ESMTP id 80A4760294;\n\tThu, 2 Nov 2017 17:01:11 +0900 (JST)", "from jcms-pop21.ecl.ntt.co.jp (jcms-pop21.ecl.ntt.co.jp\n\t[129.60.87.134])\n\tby vc1.ecl.ntt.co.jp (Postfix) with ESMTP id 7433B5F65A;\n\tThu, 2 Nov 2017 17:01:11 +0900 (JST)", "from jcms-pop21.ecl.ntt.co.jp (unknown [129.60.241.220])\n\tby jcms-pop21.ecl.ntt.co.jp (Postfix) with ESMTPSA id 6E3A6400A80;\n\tThu, 2 Nov 2017 17:01:11 +0900 (JST)" ], "From": "Prashant Bhole <bhole_prashant_q7@lab.ntt.co.jp>", "Subject": "[PATCH net-next V2 2/3] tools: bpftool: show filenames of pinned\n\tobjects", "Date": "Thu, 2 Nov 2017 16:59:16 +0900", "Message-Id": "<20171102075917.2780-3-bhole_prashant_q7@lab.ntt.co.jp>", "X-Mailer": "git-send-email 2.14.2", "In-Reply-To": "<20171102075917.2780-1-bhole_prashant_q7@lab.ntt.co.jp>", "References": "<20171102075917.2780-1-bhole_prashant_q7@lab.ntt.co.jp>", "To": "\"David S . Miller\" <davem@davemloft.net>", "Cc": "Prashant Bhole <bhole_prashant_q7@lab.ntt.co.jp>,\n\tnetdev@vger.kernel.org, Alexei Starovoitov <ast@kernel.org>,\n\tDaniel Borkmann <daniel@iogearbox.net>,\n\tQuentin Monnet <quentin.monnet@netronome.com>,\n\tJakub Kicinski <jakub.kicinski@netronome.com>", "X-TM-AS-MML": "disable", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "Added support to show filenames of pinned objects.\n\nFor example:\n\nroot@test# ./bpftool prog\n3: tracepoint name tracepoint__irq tag f677a7dd722299a3\n loaded_at Oct 26/11:39 uid 0\n xlated 160B not jited memlock 4096B map_ids 4\n pinned /sys/fs/bpf/softirq_prog\n\n4: tracepoint name tracepoint__irq tag ea5dc530d00b92b6\n loaded_at Oct 26/11:39 uid 0\n xlated 392B not jited memlock 4096B map_ids 4,6\n\nroot@test# ./bpftool --json --pretty prog\n[{\n \"id\": 3,\n \"type\": \"tracepoint\",\n \"name\": \"tracepoint__irq\",\n \"tag\": \"f677a7dd722299a3\",\n \"loaded_at\": \"Oct 26/11:39\",\n \"uid\": 0,\n \"bytes_xlated\": 160,\n \"jited\": false,\n \"bytes_memlock\": 4096,\n \"map_ids\": [4\n ],\n \"pinned\": [\"/sys/fs/bpf/softirq_prog\"\n ]\n },{\n \"id\": 4,\n \"type\": \"tracepoint\",\n \"name\": \"tracepoint__irq\",\n \"tag\": \"ea5dc530d00b92b6\",\n \"loaded_at\": \"Oct 26/11:39\",\n \"uid\": 0,\n \"bytes_xlated\": 392,\n \"jited\": false,\n \"bytes_memlock\": 4096,\n \"map_ids\": [4,6\n ],\n \"pinned\": []\n }\n]\n\nroot@test# ./bpftool map\n4: hash name start flags 0x0\n key 4B value 16B max_entries 10240 memlock 1003520B\n pinned /sys/fs/bpf/softirq_map1\n5: hash name iptr flags 0x0\n key 4B value 8B max_entries 10240 memlock 921600B\n\nroot@test# ./bpftool --json --pretty map\n[{\n \"id\": 4,\n \"type\": \"hash\",\n \"name\": \"start\",\n \"flags\": 0,\n \"bytes_key\": 4,\n \"bytes_value\": 16,\n \"max_entries\": 10240,\n \"bytes_memlock\": 1003520,\n \"pinned\": [\"/sys/fs/bpf/softirq_map1\"\n ]\n },{\n \"id\": 5,\n \"type\": \"hash\",\n \"name\": \"iptr\",\n \"flags\": 0,\n \"bytes_key\": 4,\n \"bytes_value\": 8,\n \"max_entries\": 10240,\n \"bytes_memlock\": 921600,\n \"pinned\": []\n }\n]\n\nSigned-off-by: Prashant Bhole <bhole_prashant_q7@lab.ntt.co.jp>\n---\nv2:\n - Dynamically identify bpf-fs moutpoint\n - Close files descriptors before returning on error\n - Fixed line break for proper output formatting\n - Code style: wrapped lines > 80, used reverse christmastree style\n\n tools/bpf/bpftool/common.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++\n tools/bpf/bpftool/main.c | 8 ++++\n tools/bpf/bpftool/main.h | 17 +++++++++\n tools/bpf/bpftool/map.c | 21 +++++++++++\n tools/bpf/bpftool/prog.c | 24 ++++++++++++\n 5 files changed, 163 insertions(+)", "diff": "diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c\nindex 4556947709ee..78a16c02c778 100644\n--- a/tools/bpf/bpftool/common.c\n+++ b/tools/bpf/bpftool/common.c\n@@ -45,6 +45,8 @@\n #include <sys/mount.h>\n #include <sys/types.h>\n #include <sys/vfs.h>\n+#include <mntent.h>\n+#include <fts.h>\n \n #include <bpf.h>\n \n@@ -290,3 +292,94 @@ void print_hex_data_json(uint8_t *data, size_t len)\n \t\tjsonw_printf(json_wtr, \"\\\"0x%02hhx\\\"\", data[i]);\n \tjsonw_end_array(json_wtr);\n }\n+\n+int build_pinned_obj_table(struct pinned_obj_table *tab,\n+\t\t\t enum bpf_obj_type type)\n+{\n+\tstruct bpf_prog_info pinned_info = {};\n+\t__u32 len = sizeof(pinned_info);\n+\tstruct pinned_obj *obj_node = NULL;\n+\tenum bpf_obj_type objtype;\n+\tstruct mntent *mntent = NULL;\n+\tFILE *mntfile = NULL;\n+\tchar *bpf_dir = NULL;\n+\tFTSENT *ftse = NULL;\n+\tFTS *ftsp = NULL;\n+\tint fd, err;\n+\n+\tmntfile = setmntent(\"/proc/mounts\", \"r\");\n+\tif (!mntfile)\n+\t\treturn -1;\n+\n+\twhile ((mntent = getmntent(mntfile)) != NULL) {\n+\t\tif (strncmp(mntent->mnt_type, \"bpf\", 3) == 0) {\n+\t\t\tbpf_dir = mntent->mnt_dir;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\tfclose(mntfile);\n+\n+\tif (bpf_dir) {\n+\t\tchar *path[] = {bpf_dir, 0};\n+\n+\t\tftsp = fts_open(path, 0, NULL);\n+\t\tif (!ftsp)\n+\t\t\treturn -1;\n+\t} else {\n+\t\treturn -1;\n+\t}\n+\n+\n+\twhile ((ftse = fts_read(ftsp)) != NULL) {\n+\t\tif (!(ftse->fts_info & FTS_F))\n+\t\t\tcontinue;\n+\t\tfd = open_obj_pinned(ftse->fts_path);\n+\t\tif (fd < 0)\n+\t\t\tcontinue;\n+\n+\t\tobjtype = get_fd_type(fd);\n+\t\tif (objtype != type) {\n+\t\t\tclose(fd);\n+\t\t\tcontinue;\n+\t\t}\n+\t\tmemset(&pinned_info, 0, sizeof(pinned_info));\n+\t\terr = bpf_obj_get_info_by_fd(fd, &pinned_info, &len);\n+\t\tif (err) {\n+\t\t\tclose(fd);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tobj_node = malloc(sizeof(*obj_node));\n+\t\tif (!obj_node) {\n+\t\t\tclose(fd);\n+\t\t\tfts_close(ftsp);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tmemset(obj_node, 0, sizeof(*obj_node));\n+\t\tobj_node->id = pinned_info.id;\n+\t\tobj_node->path = strdup(ftse->fts_path);\n+\t\thash_add(tab->table, &obj_node->hash, obj_node->id);\n+\n+\t\tclose(fd);\n+\t}\n+\n+\tfts_close(ftsp);\n+\treturn 0;\n+}\n+\n+void delete_pinned_obj_table(struct pinned_obj_table *tab)\n+{\n+\tstruct pinned_obj *obj;\n+\tstruct hlist_node *tmp;\n+\tunsigned int bkt;\n+\n+\tif (hash_empty(tab->table))\n+\t\treturn;\n+\n+\thash_for_each_safe(tab->table, bkt, tmp, obj, hash) {\n+\t\thash_del(&obj->hash);\n+\t\tfree(obj->path);\n+\t\tfree(obj);\n+\t}\n+}\ndiff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c\nindex 78d9afb74ef4..6ad53f1797fa 100644\n--- a/tools/bpf/bpftool/main.c\n+++ b/tools/bpf/bpftool/main.c\n@@ -54,6 +54,8 @@ static int (*last_do_help)(int argc, char **argv);\n json_writer_t *json_wtr;\n bool pretty_output;\n bool json_output;\n+struct pinned_obj_table prog_table;\n+struct pinned_obj_table map_table;\n \n void usage(void)\n {\n@@ -272,6 +274,9 @@ int main(int argc, char **argv)\n \tjson_output = false;\n \tbin_name = argv[0];\n \n+\thash_init(prog_table.table);\n+\thash_init(map_table.table);\n+\n \twhile ((opt = getopt_long(argc, argv, \"Vhpj\",\n \t\t\t\t options, NULL)) >= 0) {\n \t\tswitch (opt) {\n@@ -311,5 +316,8 @@ int main(int argc, char **argv)\n \tif (json_output)\n \t\tjsonw_destroy(&json_wtr);\n \n+\tdelete_pinned_obj_table(&prog_table);\n+\tdelete_pinned_obj_table(&map_table);\n+\n \treturn ret;\n }\ndiff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h\nindex 4b5685005cb0..bd6d0663228b 100644\n--- a/tools/bpf/bpftool/main.h\n+++ b/tools/bpf/bpftool/main.h\n@@ -42,6 +42,7 @@\n #include <stdio.h>\n #include <linux/bpf.h>\n #include <linux/kernel.h>\n+#include <linux/hashtable.h>\n \n #include \"json_writer.h\"\n \n@@ -70,11 +71,27 @@ extern const char *bin_name;\n \n extern json_writer_t *json_wtr;\n extern bool json_output;\n+extern struct pinned_obj_table prog_table;\n+extern struct pinned_obj_table map_table;\n \n bool is_prefix(const char *pfx, const char *str);\n void fprint_hex(FILE *f, void *arg, unsigned int n, const char *sep);\n void usage(void) __attribute__((noreturn));\n \n+struct pinned_obj_table {\n+\tDECLARE_HASHTABLE(table, 16);\n+};\n+\n+struct pinned_obj {\n+\t__u32 id;\n+\tchar *path;\n+\tstruct hlist_node hash;\n+};\n+\n+int build_pinned_obj_table(struct pinned_obj_table *table,\n+\t\t\t\t\t\t enum bpf_obj_type type);\n+void delete_pinned_obj_table(struct pinned_obj_table *tab);\n+\n struct cmd {\n \tconst char *cmd;\n \tint (*func)(int argc, char **argv);\ndiff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c\nindex e978ab23a77f..de0980657cef 100644\n--- a/tools/bpf/bpftool/map.c\n+++ b/tools/bpf/bpftool/map.c\n@@ -436,6 +436,18 @@ static int show_map_close_json(int fd, struct bpf_map_info *info)\n \t\tjsonw_int_field(json_wtr, \"bytes_memlock\", atoi(memlock));\n \tfree(memlock);\n \n+\tif (!hash_empty(map_table.table)) {\n+\t\tstruct pinned_obj *obj;\n+\n+\t\tjsonw_name(json_wtr, \"pinned\");\n+\t\tjsonw_start_array(json_wtr);\n+\t\thash_for_each_possible(map_table.table, obj, hash, info->id) {\n+\t\t\tif (obj->id == info->id)\n+\t\t\t\tjsonw_string(json_wtr, obj->path);\n+\t\t}\n+\t\tjsonw_end_array(json_wtr);\n+\t}\n+\n \tjsonw_end_object(json_wtr);\n \n \treturn 0;\n@@ -466,7 +478,14 @@ static int show_map_close_plain(int fd, struct bpf_map_info *info)\n \tfree(memlock);\n \n \tprintf(\"\\n\");\n+\tif (!hash_empty(map_table.table)) {\n+\t\tstruct pinned_obj *obj;\n \n+\t\thash_for_each_possible(map_table.table, obj, hash, info->id) {\n+\t\t\tif (obj->id == info->id)\n+\t\t\t\tprintf(\"\\tpinned %s\\n\", obj->path);\n+\t\t}\n+\t}\n \treturn 0;\n }\n \n@@ -478,6 +497,8 @@ static int do_show(int argc, char **argv)\n \tint err;\n \tint fd;\n \n+\tbuild_pinned_obj_table(&map_table, BPF_OBJ_MAP);\n+\n \tif (argc == 2) {\n \t\tfd = map_parse_fd_and_info(&argc, &argv, &info, &len);\n \t\tif (fd < 0)\ndiff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c\nindex 250f80fd46aa..11375f669fc0 100644\n--- a/tools/bpf/bpftool/prog.c\n+++ b/tools/bpf/bpftool/prog.c\n@@ -256,6 +256,18 @@ static void print_prog_json(struct bpf_prog_info *info, int fd)\n \tif (info->nr_map_ids)\n \t\tshow_prog_maps(fd, info->nr_map_ids);\n \n+\tif (!hash_empty(prog_table.table)) {\n+\t\tstruct pinned_obj *obj;\n+\n+\t\tjsonw_name(json_wtr, \"pinned\");\n+\t\tjsonw_start_array(json_wtr);\n+\t\thash_for_each_possible(prog_table.table, obj, hash, info->id) {\n+\t\t\tif (obj->id == info->id)\n+\t\t\t\tjsonw_string(json_wtr, obj->path);\n+\t\t}\n+\t\tjsonw_end_array(json_wtr);\n+\t}\n+\n \tjsonw_end_object(json_wtr);\n }\n \n@@ -300,6 +312,16 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)\n \tif (info->nr_map_ids)\n \t\tshow_prog_maps(fd, info->nr_map_ids);\n \n+\tif (!hash_empty(prog_table.table)) {\n+\t\tstruct pinned_obj *obj;\n+\n+\t\tprintf(\"\\n\");\n+\t\thash_for_each_possible(prog_table.table, obj, hash, info->id) {\n+\t\t\tif (obj->id == info->id)\n+\t\t\t\tprintf(\"\\tpinned %s\\n\", obj->path);\n+\t\t}\n+\t}\n+\n \tprintf(\"\\n\");\n }\n \n@@ -329,6 +351,8 @@ static int do_show(int argc, char **argv)\n \tint err;\n \tint fd;\n \n+\tbuild_pinned_obj_table(&prog_table, BPF_OBJ_PROG);\n+\n \tif (argc == 2) {\n \t\tfd = prog_parse_fd(&argc, &argv);\n \t\tif (fd < 0)\n", "prefixes": [ "net-next", "V2", "2/3" ] }