get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 819323,
    "url": "http://patchwork.ozlabs.org/api/patches/819323/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170927213756.1254938-4-kafai@fb.com/",
    "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": "<20170927213756.1254938-4-kafai@fb.com>",
    "list_archive_url": null,
    "date": "2017-09-27T21:37:54",
    "name": "[net-next,3/5] bpf: libbpf: Provide basic API support to specify BPF obj name",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "399ddc9f09c22dbfcc4969fc6c0a1d00bb274447",
    "submitter": {
        "id": 64907,
        "url": "http://patchwork.ozlabs.org/api/people/64907/?format=api",
        "name": "Martin KaFai Lau",
        "email": "kafai@fb.com"
    },
    "delegate": {
        "id": 34,
        "url": "http://patchwork.ozlabs.org/api/users/34/?format=api",
        "username": "davem",
        "first_name": "David",
        "last_name": "Miller",
        "email": "davem@davemloft.net"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/20170927213756.1254938-4-kafai@fb.com/mbox/",
    "series": [
        {
            "id": 5453,
            "url": "http://patchwork.ozlabs.org/api/series/5453/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=5453",
            "date": "2017-09-27T21:37:55",
            "name": "bpf: Extend bpf_{prog,map}_info",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/5453/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/819323/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/819323/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 (1024-bit key;\n\tunprotected) header.d=fb.com header.i=@fb.com header.b=\"AWbqqLnN\";\n\tdkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y2WSG0kbPz9t5l\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 28 Sep 2017 07:39:42 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752039AbdI0Vjk (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tWed, 27 Sep 2017 17:39:40 -0400",
            "from mx0b-00082601.pphosted.com ([67.231.153.30]:49417 \"EHLO\n\tmx0b-00082601.pphosted.com\" rhost-flags-OK-OK-OK-OK)\n\tby vger.kernel.org with ESMTP id S1751958AbdI0Vji (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Wed, 27 Sep 2017 17:39:38 -0400",
            "from pps.filterd (m0109332.ppops.net [127.0.0.1])\n\tby mx0a-00082601.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id\n\tv8RLdXgU027985\n\tfor <netdev@vger.kernel.org>; Wed, 27 Sep 2017 14:39:38 -0700",
            "from mail.thefacebook.com ([199.201.64.23])\n\tby mx0a-00082601.pphosted.com with ESMTP id 2d8jetrgrv-4\n\t(version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT)\n\tfor <netdev@vger.kernel.org>; Wed, 27 Sep 2017 14:39:38 -0700",
            "from mx-out.facebook.com (192.168.52.123) by\n\tPRN-CHUB04.TheFacebook.com (192.168.16.14) with Microsoft SMTP Server\n\tid 14.3.319.2; Wed, 27 Sep 2017 14:37:57 -0700",
            "by devbig738.prn1.facebook.com (Postfix, from userid 6611)    id\n\t7EC2A4500948; Wed, 27 Sep 2017 14:37:56 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com;\n\th=from : to : cc : subject\n\t: date : message-id : in-reply-to : references : mime-version :\n\tcontent-type; s=facebook;\n\tbh=ktsjktUxiiNn5RgZF2MbazM44ulQxTGigqxX8Su3FEw=; \n\tb=AWbqqLnNjjuW2wL4ZkL5+fBcGbyiZIApspxhmKXHDK9ny6/EBodTUj7PaqaJKl8H92Kx\n\tK3kyQ3ANrzb3rCO7HLbJItLRysBXkYR5PiEcvW5jlRNeueRcc3VlD5PbKHEgBJ6x3KxJ\n\trLb+NQiBjXWVYM3bO0fyGb4A+aXkGQpJ8+M= ",
        "Smtp-Origin-Hostprefix": "devbig",
        "From": "Martin KaFai Lau <kafai@fb.com>",
        "Smtp-Origin-Hostname": "devbig738.prn1.facebook.com",
        "To": "<netdev@vger.kernel.org>",
        "CC": "Alexei Starovoitov <ast@fb.com>,\n\tDaniel Borkmann <daniel@iogearbox.net>, <kernel-team@fb.com>",
        "Smtp-Origin-Cluster": "prn1c29",
        "Subject": "[PATCH net-next 3/5] bpf: libbpf: Provide basic API support to\n\tspecify BPF obj name",
        "Date": "Wed, 27 Sep 2017 14:37:54 -0700",
        "Message-ID": "<20170927213756.1254938-4-kafai@fb.com>",
        "X-Mailer": "git-send-email 2.9.5",
        "In-Reply-To": "<20170927213756.1254938-1-kafai@fb.com>",
        "References": "<20170927213756.1254938-1-kafai@fb.com>",
        "X-FB-Internal": [
            "Safe",
            "Safe"
        ],
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Proofpoint-Spam-Reason": "safe",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10432:, ,\n\tdefinitions=2017-09-27_08:, , signatures=0",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "This patch extends the libbpf to provide API support to\nallow specifying BPF object name.\n\nIn tools/lib/bpf/libbpf, the C symbol of the function\nand the map is used.  Regarding section name, all maps are\nunder the same section named \"maps\".  Hence, section name\nis not a good choice for map's name.  To be consistent with\nmap, bpf_prog also follows and uses its function symbol as\nthe prog's name.\n\nThis patch adds logic to collect function's symbols in libbpf.\nThere is existing codes to collect the map's symbols and no change\nis needed.\n\nThe bpf_load_program_name() and bpf_map_create_name() are\nadded to take the name argument.  For the other bpf_map_create_xxx()\nvariants, a name argument is directly added to them.\n\nIn samples/bpf, bpf_load.c in particular, the symbol is also\nused as the map's name and the map symbols has already been\ncollected in the existing code.  For bpf_prog, bpf_load.c does\nnot collect the function symbol name.  We can consider to collect\nthem later if there is a need to continue supporting the bpf_load.c.\n\nSigned-off-by: Martin KaFai Lau <kafai@fb.com>\nAcked-by: Alexei Starovoitov <ast@fb.com>\nAcked-by: Daniel Borkmann <daniel@iogearbox.net>\n---\n samples/bpf/bpf_load.c                      |   2 +\n samples/bpf/map_perf_test_user.c            |   1 +\n tools/include/uapi/linux/bpf.h              |  10 +++\n tools/lib/bpf/bpf.c                         |  57 +++++++++++----\n tools/lib/bpf/bpf.h                         |  23 ++++--\n tools/lib/bpf/libbpf.c                      | 109 +++++++++++++++++++++-------\n tools/testing/selftests/bpf/test_verifier.c |   2 +-\n 7 files changed, 157 insertions(+), 47 deletions(-)",
    "diff": "diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c\nindex 6aa50098dfb8..18b1c8dd0391 100644\n--- a/samples/bpf/bpf_load.c\n+++ b/samples/bpf/bpf_load.c\n@@ -221,6 +221,7 @@ static int load_maps(struct bpf_map_data *maps, int nr_maps,\n \t\t\tint inner_map_fd = map_fd[maps[i].def.inner_map_idx];\n \n \t\t\tmap_fd[i] = bpf_create_map_in_map_node(maps[i].def.type,\n+\t\t\t\t\t\t\tmaps[i].name,\n \t\t\t\t\t\t\tmaps[i].def.key_size,\n \t\t\t\t\t\t\tinner_map_fd,\n \t\t\t\t\t\t\tmaps[i].def.max_entries,\n@@ -228,6 +229,7 @@ static int load_maps(struct bpf_map_data *maps, int nr_maps,\n \t\t\t\t\t\t\tnuma_node);\n \t\t} else {\n \t\t\tmap_fd[i] = bpf_create_map_node(maps[i].def.type,\n+\t\t\t\t\t\t\tmaps[i].name,\n \t\t\t\t\t\t\tmaps[i].def.key_size,\n \t\t\t\t\t\t\tmaps[i].def.value_size,\n \t\t\t\t\t\t\tmaps[i].def.max_entries,\ndiff --git a/samples/bpf/map_perf_test_user.c b/samples/bpf/map_perf_test_user.c\nindex a0310fc70057..519d9af4b04a 100644\n--- a/samples/bpf/map_perf_test_user.c\n+++ b/samples/bpf/map_perf_test_user.c\n@@ -137,6 +137,7 @@ static void do_test_lru(enum test_type test, int cpu)\n \n \t\t\tinner_lru_map_fds[cpu] =\n \t\t\t\tbpf_create_map_node(BPF_MAP_TYPE_LRU_HASH,\n+\t\t\t\t\t\t    test_map_names[INNER_LRU_HASH_PREALLOC],\n \t\t\t\t\t\t    sizeof(uint32_t),\n \t\t\t\t\t\t    sizeof(long),\n \t\t\t\t\t\t    inner_lru_hash_size, 0,\ndiff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h\nindex e43491ac4823..6d2137b4cf38 100644\n--- a/tools/include/uapi/linux/bpf.h\n+++ b/tools/include/uapi/linux/bpf.h\n@@ -175,6 +175,8 @@ enum bpf_attach_type {\n /* Specify numa node during map creation */\n #define BPF_F_NUMA_NODE\t\t(1U << 2)\n \n+#define BPF_OBJ_NAME_LEN 16U\n+\n union bpf_attr {\n \tstruct { /* anonymous struct used by BPF_MAP_CREATE command */\n \t\t__u32\tmap_type;\t/* one of enum bpf_map_type */\n@@ -188,6 +190,7 @@ union bpf_attr {\n \t\t__u32\tnuma_node;\t/* numa node (effective only if\n \t\t\t\t\t * BPF_F_NUMA_NODE is set).\n \t\t\t\t\t */\n+\t\t__u8\tmap_name[BPF_OBJ_NAME_LEN];\n \t};\n \n \tstruct { /* anonymous struct used by BPF_MAP_*_ELEM commands */\n@@ -210,6 +213,7 @@ union bpf_attr {\n \t\t__aligned_u64\tlog_buf;\t/* user supplied buffer */\n \t\t__u32\t\tkern_version;\t/* checked when prog_type=kprobe */\n \t\t__u32\t\tprog_flags;\n+\t\t__u8\t\tprog_name[BPF_OBJ_NAME_LEN];\n \t};\n \n \tstruct { /* anonymous struct used by BPF_OBJ_* commands */\n@@ -812,6 +816,11 @@ struct bpf_prog_info {\n \t__u32 xlated_prog_len;\n \t__aligned_u64 jited_prog_insns;\n \t__aligned_u64 xlated_prog_insns;\n+\t__u64 load_time;\t/* ns since boottime */\n+\t__u32 created_by_uid;\n+\t__u32 nr_map_ids;\n+\t__aligned_u64 map_ids;\n+\t__u8  name[BPF_OBJ_NAME_LEN];\n } __attribute__((aligned(8)));\n \n struct bpf_map_info {\n@@ -821,6 +830,7 @@ struct bpf_map_info {\n \t__u32 value_size;\n \t__u32 max_entries;\n \t__u32 map_flags;\n+\t__u8  name[BPF_OBJ_NAME_LEN];\n } __attribute__((aligned(8)));\n \n /* User bpf_sock_ops struct to access socket values and specify request ops\ndiff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c\nindex 1d6907d379c9..daf624e4c720 100644\n--- a/tools/lib/bpf/bpf.c\n+++ b/tools/lib/bpf/bpf.c\n@@ -46,6 +46,8 @@\n # endif\n #endif\n \n+#define min(x, y) ((x) < (y) ? (x) : (y))\n+\n static inline __u64 ptr_to_u64(const void *ptr)\n {\n \treturn (__u64) (unsigned long) ptr;\n@@ -57,10 +59,11 @@ static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr,\n \treturn syscall(__NR_bpf, cmd, attr, size);\n }\n \n-int bpf_create_map_node(enum bpf_map_type map_type, int key_size,\n-\t\t\tint value_size, int max_entries, __u32 map_flags,\n-\t\t\tint node)\n+int bpf_create_map_node(enum bpf_map_type map_type, const char *name,\n+\t\t\tint key_size, int value_size, int max_entries,\n+\t\t\t__u32 map_flags, int node)\n {\n+\t__u32 name_len = name ? strlen(name) : 0;\n \tunion bpf_attr attr;\n \n \tmemset(&attr, '\\0', sizeof(attr));\n@@ -70,6 +73,8 @@ int bpf_create_map_node(enum bpf_map_type map_type, int key_size,\n \tattr.value_size = value_size;\n \tattr.max_entries = max_entries;\n \tattr.map_flags = map_flags;\n+\tmemcpy(attr.map_name, name, min(name_len, BPF_OBJ_NAME_LEN - 1));\n+\n \tif (node >= 0) {\n \t\tattr.map_flags |= BPF_F_NUMA_NODE;\n \t\tattr.numa_node = node;\n@@ -81,14 +86,23 @@ int bpf_create_map_node(enum bpf_map_type map_type, int key_size,\n int bpf_create_map(enum bpf_map_type map_type, int key_size,\n \t\t   int value_size, int max_entries, __u32 map_flags)\n {\n-\treturn bpf_create_map_node(map_type, key_size, value_size,\n+\treturn bpf_create_map_node(map_type, NULL, key_size, value_size,\n \t\t\t\t   max_entries, map_flags, -1);\n }\n \n-int bpf_create_map_in_map_node(enum bpf_map_type map_type, int key_size,\n-\t\t\t       int inner_map_fd, int max_entries,\n+int bpf_create_map_name(enum bpf_map_type map_type, const char *name,\n+\t\t\tint key_size, int value_size, int max_entries,\n+\t\t\t__u32 map_flags)\n+{\n+\treturn bpf_create_map_node(map_type, name, key_size, value_size,\n+\t\t\t\t   max_entries, map_flags, -1);\n+}\n+\n+int bpf_create_map_in_map_node(enum bpf_map_type map_type, const char *name,\n+\t\t\t       int key_size, int inner_map_fd, int max_entries,\n \t\t\t       __u32 map_flags, int node)\n {\n+\t__u32 name_len = name ? strlen(name) : 0;\n \tunion bpf_attr attr;\n \n \tmemset(&attr, '\\0', sizeof(attr));\n@@ -99,6 +113,8 @@ int bpf_create_map_in_map_node(enum bpf_map_type map_type, int key_size,\n \tattr.inner_map_fd = inner_map_fd;\n \tattr.max_entries = max_entries;\n \tattr.map_flags = map_flags;\n+\tmemcpy(attr.map_name, name, min(name_len, BPF_OBJ_NAME_LEN - 1));\n+\n \tif (node >= 0) {\n \t\tattr.map_flags |= BPF_F_NUMA_NODE;\n \t\tattr.numa_node = node;\n@@ -107,19 +123,24 @@ int bpf_create_map_in_map_node(enum bpf_map_type map_type, int key_size,\n \treturn sys_bpf(BPF_MAP_CREATE, &attr, sizeof(attr));\n }\n \n-int bpf_create_map_in_map(enum bpf_map_type map_type, int key_size,\n-\t\t\t  int inner_map_fd, int max_entries, __u32 map_flags)\n+int bpf_create_map_in_map(enum bpf_map_type map_type, const char *name,\n+\t\t\t  int key_size, int inner_map_fd, int max_entries,\n+\t\t\t  __u32 map_flags)\n {\n-\treturn bpf_create_map_in_map_node(map_type, key_size, inner_map_fd,\n-\t\t\t\t\t  max_entries, map_flags, -1);\n+\treturn bpf_create_map_in_map_node(map_type, name, key_size,\n+\t\t\t\t\t  inner_map_fd, max_entries, map_flags,\n+\t\t\t\t\t  -1);\n }\n \n-int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,\n-\t\t     size_t insns_cnt, const char *license,\n-\t\t     __u32 kern_version, char *log_buf, size_t log_buf_sz)\n+int bpf_load_program_name(enum bpf_prog_type type, const char *name,\n+\t\t\t  const struct bpf_insn *insns,\n+\t\t\t  size_t insns_cnt, const char *license,\n+\t\t\t  __u32 kern_version, char *log_buf,\n+\t\t\t  size_t log_buf_sz)\n {\n \tint fd;\n \tunion bpf_attr attr;\n+\t__u32 name_len = name ? strlen(name) : 0;\n \n \tbzero(&attr, sizeof(attr));\n \tattr.prog_type = type;\n@@ -130,6 +151,7 @@ int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,\n \tattr.log_size = 0;\n \tattr.log_level = 0;\n \tattr.kern_version = kern_version;\n+\tmemcpy(attr.prog_name, name, min(name_len, BPF_OBJ_NAME_LEN - 1));\n \n \tfd = sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr));\n \tif (fd >= 0 || !log_buf || !log_buf_sz)\n@@ -143,6 +165,15 @@ int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,\n \treturn sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr));\n }\n \n+int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,\n+\t\t     size_t insns_cnt, const char *license,\n+\t\t     __u32 kern_version, char *log_buf,\n+\t\t     size_t log_buf_sz)\n+{\n+\treturn bpf_load_program_name(type, NULL, insns, insns_cnt, license,\n+\t\t\t\t     kern_version, log_buf, log_buf_sz);\n+}\n+\n int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,\n \t\t       size_t insns_cnt, int strict_alignment,\n \t\t       const char *license, __u32 kern_version,\ndiff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h\nindex b8ea5843c39e..118d00535a0d 100644\n--- a/tools/lib/bpf/bpf.h\n+++ b/tools/lib/bpf/bpf.h\n@@ -24,19 +24,28 @@\n #include <linux/bpf.h>\n #include <stddef.h>\n \n-int bpf_create_map_node(enum bpf_map_type map_type, int key_size,\n-\t\t\tint value_size, int max_entries, __u32 map_flags,\n-\t\t\tint node);\n+int bpf_create_map_node(enum bpf_map_type map_type, const char *name,\n+\t\t\tint key_size, int value_size, int max_entries,\n+\t\t\t__u32 map_flags, int node);\n+int bpf_create_map_name(enum bpf_map_type map_type, const char *name,\n+\t\t\tint key_size, int value_size, int max_entries,\n+\t\t\t__u32 map_flags);\n int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,\n \t\t   int max_entries, __u32 map_flags);\n-int bpf_create_map_in_map_node(enum bpf_map_type map_type, int key_size,\n-\t\t\t       int inner_map_fd, int max_entries,\n+int bpf_create_map_in_map_node(enum bpf_map_type map_type, const char *name,\n+\t\t\t       int key_size, int inner_map_fd, int max_entries,\n \t\t\t       __u32 map_flags, int node);\n-int bpf_create_map_in_map(enum bpf_map_type map_type, int key_size,\n-\t\t\t  int inner_map_fd, int max_entries, __u32 map_flags);\n+int bpf_create_map_in_map(enum bpf_map_type map_type, const char *name,\n+\t\t\t  int key_size, int inner_map_fd, int max_entries,\n+\t\t\t  __u32 map_flags);\n \n /* Recommend log buffer size */\n #define BPF_LOG_BUF_SIZE 65536\n+int bpf_load_program_name(enum bpf_prog_type type, const char *name,\n+\t\t\t  const struct bpf_insn *insns,\n+\t\t\t  size_t insns_cnt, const char *license,\n+\t\t\t  __u32 kern_version, char *log_buf,\n+\t\t\t  size_t log_buf_sz);\n int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,\n \t\t     size_t insns_cnt, const char *license,\n \t\t     __u32 kern_version, char *log_buf,\ndiff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c\nindex 35f6dfcdc565..4f402dcdf372 100644\n--- a/tools/lib/bpf/libbpf.c\n+++ b/tools/lib/bpf/libbpf.c\n@@ -171,6 +171,7 @@ int libbpf_strerror(int err, char *buf, size_t size)\n struct bpf_program {\n \t/* Index in elf obj file, for relocation use. */\n \tint idx;\n+\tchar *name;\n \tchar *section_name;\n \tstruct bpf_insn *insns;\n \tsize_t insns_cnt;\n@@ -283,6 +284,7 @@ static void bpf_program__exit(struct bpf_program *prog)\n \tprog->clear_priv = NULL;\n \n \tbpf_program__unload(prog);\n+\tzfree(&prog->name);\n \tzfree(&prog->section_name);\n \tzfree(&prog->insns);\n \tzfree(&prog->reloc_desc);\n@@ -293,26 +295,27 @@ static void bpf_program__exit(struct bpf_program *prog)\n }\n \n static int\n-bpf_program__init(void *data, size_t size, char *name, int idx,\n-\t\t    struct bpf_program *prog)\n+bpf_program__init(void *data, size_t size, char *section_name, int idx,\n+\t\t  struct bpf_program *prog)\n {\n \tif (size < sizeof(struct bpf_insn)) {\n-\t\tpr_warning(\"corrupted section '%s'\\n\", name);\n+\t\tpr_warning(\"corrupted section '%s'\\n\", section_name);\n \t\treturn -EINVAL;\n \t}\n \n \tbzero(prog, sizeof(*prog));\n \n-\tprog->section_name = strdup(name);\n+\tprog->section_name = strdup(section_name);\n \tif (!prog->section_name) {\n-\t\tpr_warning(\"failed to alloc name for prog %s\\n\",\n-\t\t\t   name);\n+\t\tpr_warning(\"failed to alloc name for prog under section %s\\n\",\n+\t\t\t   section_name);\n \t\tgoto errout;\n \t}\n \n \tprog->insns = malloc(size);\n \tif (!prog->insns) {\n-\t\tpr_warning(\"failed to alloc insns for %s\\n\", name);\n+\t\tpr_warning(\"failed to alloc insns for prog under section %s\\n\",\n+\t\t\t   section_name);\n \t\tgoto errout;\n \t}\n \tprog->insns_cnt = size / sizeof(struct bpf_insn);\n@@ -331,12 +334,12 @@ bpf_program__init(void *data, size_t size, char *name, int idx,\n \n static int\n bpf_object__add_program(struct bpf_object *obj, void *data, size_t size,\n-\t\t\tchar *name, int idx)\n+\t\t\tchar *section_name, int idx)\n {\n \tstruct bpf_program prog, *progs;\n \tint nr_progs, err;\n \n-\terr = bpf_program__init(data, size, name, idx, &prog);\n+\terr = bpf_program__init(data, size, section_name, idx, &prog);\n \tif (err)\n \t\treturn err;\n \n@@ -350,8 +353,8 @@ bpf_object__add_program(struct bpf_object *obj, void *data, size_t size,\n \t\t * is still valid, so don't need special treat for\n \t\t * bpf_close_object().\n \t\t */\n-\t\tpr_warning(\"failed to alloc a new program '%s'\\n\",\n-\t\t\t   name);\n+\t\tpr_warning(\"failed to alloc a new program under section '%s'\\n\",\n+\t\t\t   section_name);\n \t\tbpf_program__exit(&prog);\n \t\treturn -ENOMEM;\n \t}\n@@ -364,6 +367,54 @@ bpf_object__add_program(struct bpf_object *obj, void *data, size_t size,\n \treturn 0;\n }\n \n+static int\n+bpf_object__init_prog_names(struct bpf_object *obj)\n+{\n+\tElf_Data *symbols = obj->efile.symbols;\n+\tstruct bpf_program *prog;\n+\tsize_t pi, si;\n+\n+\tfor (pi = 0; pi < obj->nr_programs; pi++) {\n+\t\tchar *name = NULL;\n+\n+\t\tprog = &obj->programs[pi];\n+\n+\t\tfor (si = 0; si < symbols->d_size / sizeof(GElf_Sym) && !name;\n+\t\t     si++) {\n+\t\t\tGElf_Sym sym;\n+\n+\t\t\tif (!gelf_getsym(symbols, si, &sym))\n+\t\t\t\tcontinue;\n+\t\t\tif (sym.st_shndx != prog->idx)\n+\t\t\t\tcontinue;\n+\n+\t\t\tname = elf_strptr(obj->efile.elf,\n+\t\t\t\t\t  obj->efile.strtabidx,\n+\t\t\t\t\t  sym.st_name);\n+\t\t\tif (!name) {\n+\t\t\t\tpr_warning(\"failed to get sym name string for prog %s\\n\",\n+\t\t\t\t\t   prog->section_name);\n+\t\t\t\treturn -LIBBPF_ERRNO__LIBELF;\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (!name) {\n+\t\t\tpr_warning(\"failed to find sym for prog %s\\n\",\n+\t\t\t\t   prog->section_name);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n+\t\tprog->name = strdup(name);\n+\t\tif (!prog->name) {\n+\t\t\tpr_warning(\"failed to allocate memory for prog sym %s\\n\",\n+\t\t\t\t   name);\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n static struct bpf_object *bpf_object__new(const char *path,\n \t\t\t\t\t  void *obj_buf,\n \t\t\t\t\t  size_t obj_buf_sz)\n@@ -766,8 +817,12 @@ static int bpf_object__elf_collect(struct bpf_object *obj)\n \t\tpr_warning(\"Corrupted ELF file: index of strtab invalid\\n\");\n \t\treturn LIBBPF_ERRNO__FORMAT;\n \t}\n-\tif (obj->efile.maps_shndx >= 0)\n+\tif (obj->efile.maps_shndx >= 0) {\n \t\terr = bpf_object__init_maps(obj);\n+\t\tif (err)\n+\t\t\tgoto out;\n+\t}\n+\terr = bpf_object__init_prog_names(obj);\n out:\n \treturn err;\n }\n@@ -870,11 +925,12 @@ bpf_object__create_maps(struct bpf_object *obj)\n \t\tstruct bpf_map_def *def = &obj->maps[i].def;\n \t\tint *pfd = &obj->maps[i].fd;\n \n-\t\t*pfd = bpf_create_map(def->type,\n-\t\t\t\t      def->key_size,\n-\t\t\t\t      def->value_size,\n-\t\t\t\t      def->max_entries,\n-\t\t\t\t      0);\n+\t\t*pfd = bpf_create_map_name(def->type,\n+\t\t\t\t\t   obj->maps[i].name,\n+\t\t\t\t\t   def->key_size,\n+\t\t\t\t\t   def->value_size,\n+\t\t\t\t\t   def->max_entries,\n+\t\t\t\t\t   0);\n \t\tif (*pfd < 0) {\n \t\t\tsize_t j;\n \t\t\tint err = *pfd;\n@@ -982,7 +1038,7 @@ static int bpf_object__collect_reloc(struct bpf_object *obj)\n }\n \n static int\n-load_program(enum bpf_prog_type type, struct bpf_insn *insns,\n+load_program(enum bpf_prog_type type, const char *name, struct bpf_insn *insns,\n \t     int insns_cnt, char *license, u32 kern_version, int *pfd)\n {\n \tint ret;\n@@ -995,8 +1051,8 @@ load_program(enum bpf_prog_type type, struct bpf_insn *insns,\n \tif (!log_buf)\n \t\tpr_warning(\"Alloc log buffer for bpf loader error, continue without log\\n\");\n \n-\tret = bpf_load_program(type, insns, insns_cnt, license,\n-\t\t\t       kern_version, log_buf, BPF_LOG_BUF_SIZE);\n+\tret = bpf_load_program_name(type, name, insns, insns_cnt, license,\n+\t\t\t\t    kern_version, log_buf, BPF_LOG_BUF_SIZE);\n \n \tif (ret >= 0) {\n \t\t*pfd = ret;\n@@ -1021,9 +1077,9 @@ load_program(enum bpf_prog_type type, struct bpf_insn *insns,\n \t\tif (type != BPF_PROG_TYPE_KPROBE) {\n \t\t\tint fd;\n \n-\t\t\tfd = bpf_load_program(BPF_PROG_TYPE_KPROBE, insns,\n-\t\t\t\t\t      insns_cnt, license, kern_version,\n-\t\t\t\t\t      NULL, 0);\n+\t\t\tfd = bpf_load_program_name(BPF_PROG_TYPE_KPROBE, name,\n+\t\t\t\t\t\t   insns, insns_cnt, license,\n+\t\t\t\t\t\t   kern_version, NULL, 0);\n \t\t\tif (fd >= 0) {\n \t\t\t\tclose(fd);\n \t\t\t\tret = -LIBBPF_ERRNO__PROGTYPE;\n@@ -1067,8 +1123,8 @@ bpf_program__load(struct bpf_program *prog,\n \t\t\tpr_warning(\"Program '%s' is inconsistent: nr(%d) != 1\\n\",\n \t\t\t\t   prog->section_name, prog->instances.nr);\n \t\t}\n-\t\terr = load_program(prog->type, prog->insns, prog->insns_cnt,\n-\t\t\t\t   license, kern_version, &fd);\n+\t\terr = load_program(prog->type, prog->name, prog->insns,\n+\t\t\t\t   prog->insns_cnt, license, kern_version, &fd);\n \t\tif (!err)\n \t\t\tprog->instances.fds[0] = fd;\n \t\tgoto out;\n@@ -1096,7 +1152,8 @@ bpf_program__load(struct bpf_program *prog,\n \t\t\tcontinue;\n \t\t}\n \n-\t\terr = load_program(prog->type, result.new_insn_ptr,\n+\t\terr = load_program(prog->type, prog->name,\n+\t\t\t\t   result.new_insn_ptr,\n \t\t\t\t   result.new_insn_cnt,\n \t\t\t\t   license, kern_version, &fd);\n \ndiff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c\nindex a0426147523d..290d5056c165 100644\n--- a/tools/testing/selftests/bpf/test_verifier.c\n+++ b/tools/testing/selftests/bpf/test_verifier.c\n@@ -6939,7 +6939,7 @@ static int create_map_in_map(void)\n \t\treturn inner_map_fd;\n \t}\n \n-\touter_map_fd = bpf_create_map_in_map(BPF_MAP_TYPE_ARRAY_OF_MAPS,\n+\touter_map_fd = bpf_create_map_in_map(BPF_MAP_TYPE_ARRAY_OF_MAPS, NULL,\n \t\t\t\t\t     sizeof(int), inner_map_fd, 1, 0);\n \tif (outer_map_fd < 0)\n \t\tprintf(\"Failed to create array of maps '%s'!\\n\",\n",
    "prefixes": [
        "net-next",
        "3/5"
    ]
}