Commit c9f766bc authored by David S. Miller's avatar David S. Miller

Merge branch 'bpf-obj-name-misc'

Martin KaFai Lau says:

====================
bpf: Misc improvements and a new usage on bpf obj name

The first two patches make improvements on the bpf obj name.

The last patch adds the prog name to kallsyms.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents f192970d 368211fb
...@@ -56,7 +56,7 @@ struct bpf_map { ...@@ -56,7 +56,7 @@ struct bpf_map {
struct work_struct work; struct work_struct work;
atomic_t usercnt; atomic_t usercnt;
struct bpf_map *inner_map_meta; struct bpf_map *inner_map_meta;
u8 name[BPF_OBJ_NAME_LEN]; char name[BPF_OBJ_NAME_LEN];
}; };
/* function argument constraints */ /* function argument constraints */
...@@ -189,7 +189,7 @@ struct bpf_prog_aux { ...@@ -189,7 +189,7 @@ struct bpf_prog_aux {
struct bpf_prog *prog; struct bpf_prog *prog;
struct user_struct *user; struct user_struct *user;
u64 load_time; /* ns since boottime */ u64 load_time; /* ns since boottime */
u8 name[BPF_OBJ_NAME_LEN]; char name[BPF_OBJ_NAME_LEN];
union { union {
struct work_struct work; struct work_struct work;
struct rcu_head rcu; struct rcu_head rcu;
......
...@@ -230,7 +230,7 @@ union bpf_attr { ...@@ -230,7 +230,7 @@ union bpf_attr {
__u32 numa_node; /* numa node (effective only if __u32 numa_node; /* numa node (effective only if
* BPF_F_NUMA_NODE is set). * BPF_F_NUMA_NODE is set).
*/ */
__u8 map_name[BPF_OBJ_NAME_LEN]; char map_name[BPF_OBJ_NAME_LEN];
}; };
struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
...@@ -253,7 +253,7 @@ union bpf_attr { ...@@ -253,7 +253,7 @@ union bpf_attr {
__aligned_u64 log_buf; /* user supplied buffer */ __aligned_u64 log_buf; /* user supplied buffer */
__u32 kern_version; /* checked when prog_type=kprobe */ __u32 kern_version; /* checked when prog_type=kprobe */
__u32 prog_flags; __u32 prog_flags;
__u8 prog_name[BPF_OBJ_NAME_LEN]; char prog_name[BPF_OBJ_NAME_LEN];
}; };
struct { /* anonymous struct used by BPF_OBJ_* commands */ struct { /* anonymous struct used by BPF_OBJ_* commands */
...@@ -888,7 +888,7 @@ struct bpf_prog_info { ...@@ -888,7 +888,7 @@ struct bpf_prog_info {
__u32 created_by_uid; __u32 created_by_uid;
__u32 nr_map_ids; __u32 nr_map_ids;
__aligned_u64 map_ids; __aligned_u64 map_ids;
__u8 name[BPF_OBJ_NAME_LEN]; char name[BPF_OBJ_NAME_LEN];
} __attribute__((aligned(8))); } __attribute__((aligned(8)));
struct bpf_map_info { struct bpf_map_info {
...@@ -898,7 +898,7 @@ struct bpf_map_info { ...@@ -898,7 +898,7 @@ struct bpf_map_info {
__u32 value_size; __u32 value_size;
__u32 max_entries; __u32 max_entries;
__u32 map_flags; __u32 map_flags;
__u8 name[BPF_OBJ_NAME_LEN]; char name[BPF_OBJ_NAME_LEN];
} __attribute__((aligned(8))); } __attribute__((aligned(8)));
/* User bpf_sock_ops struct to access socket values and specify request ops /* User bpf_sock_ops struct to access socket values and specify request ops
......
...@@ -309,12 +309,25 @@ bpf_get_prog_addr_region(const struct bpf_prog *prog, ...@@ -309,12 +309,25 @@ bpf_get_prog_addr_region(const struct bpf_prog *prog,
static void bpf_get_prog_name(const struct bpf_prog *prog, char *sym) static void bpf_get_prog_name(const struct bpf_prog *prog, char *sym)
{ {
const char *end = sym + KSYM_NAME_LEN;
BUILD_BUG_ON(sizeof("bpf_prog_") + BUILD_BUG_ON(sizeof("bpf_prog_") +
sizeof(prog->tag) * 2 + 1 > KSYM_NAME_LEN); sizeof(prog->tag) * 2 +
/* name has been null terminated.
* We should need +1 for the '_' preceding
* the name. However, the null character
* is double counted between the name and the
* sizeof("bpf_prog_") above, so we omit
* the +1 here.
*/
sizeof(prog->aux->name) > KSYM_NAME_LEN);
sym += snprintf(sym, KSYM_NAME_LEN, "bpf_prog_"); sym += snprintf(sym, KSYM_NAME_LEN, "bpf_prog_");
sym = bin2hex(sym, prog->tag, sizeof(prog->tag)); sym = bin2hex(sym, prog->tag, sizeof(prog->tag));
*sym = 0; if (prog->aux->name[0])
snprintf(sym, (size_t)(end - sym), "_%s", prog->aux->name);
else
*sym = 0;
} }
static __always_inline unsigned long static __always_inline unsigned long
......
...@@ -322,6 +322,8 @@ static int bpf_obj_name_cpy(char *dst, const char *src) ...@@ -322,6 +322,8 @@ static int bpf_obj_name_cpy(char *dst, const char *src)
{ {
const char *end = src + BPF_OBJ_NAME_LEN; const char *end = src + BPF_OBJ_NAME_LEN;
memset(dst, 0, BPF_OBJ_NAME_LEN);
/* Copy all isalnum() and '_' char */ /* Copy all isalnum() and '_' char */
while (src < end && *src) { while (src < end && *src) {
if (!isalnum(*src) && *src != '_') if (!isalnum(*src) && *src != '_')
...@@ -333,9 +335,6 @@ static int bpf_obj_name_cpy(char *dst, const char *src) ...@@ -333,9 +335,6 @@ static int bpf_obj_name_cpy(char *dst, const char *src)
if (src == end) if (src == end)
return -EINVAL; return -EINVAL;
/* '\0' terminates dst */
*dst = 0;
return 0; return 0;
} }
......
...@@ -230,7 +230,7 @@ union bpf_attr { ...@@ -230,7 +230,7 @@ union bpf_attr {
__u32 numa_node; /* numa node (effective only if __u32 numa_node; /* numa node (effective only if
* BPF_F_NUMA_NODE is set). * BPF_F_NUMA_NODE is set).
*/ */
__u8 map_name[BPF_OBJ_NAME_LEN]; char map_name[BPF_OBJ_NAME_LEN];
}; };
struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
...@@ -253,7 +253,7 @@ union bpf_attr { ...@@ -253,7 +253,7 @@ union bpf_attr {
__aligned_u64 log_buf; /* user supplied buffer */ __aligned_u64 log_buf; /* user supplied buffer */
__u32 kern_version; /* checked when prog_type=kprobe */ __u32 kern_version; /* checked when prog_type=kprobe */
__u32 prog_flags; __u32 prog_flags;
__u8 prog_name[BPF_OBJ_NAME_LEN]; char prog_name[BPF_OBJ_NAME_LEN];
}; };
struct { /* anonymous struct used by BPF_OBJ_* commands */ struct { /* anonymous struct used by BPF_OBJ_* commands */
...@@ -871,7 +871,7 @@ struct bpf_prog_info { ...@@ -871,7 +871,7 @@ struct bpf_prog_info {
__u32 created_by_uid; __u32 created_by_uid;
__u32 nr_map_ids; __u32 nr_map_ids;
__aligned_u64 map_ids; __aligned_u64 map_ids;
__u8 name[BPF_OBJ_NAME_LEN]; char name[BPF_OBJ_NAME_LEN];
} __attribute__((aligned(8))); } __attribute__((aligned(8)));
struct bpf_map_info { struct bpf_map_info {
...@@ -881,7 +881,7 @@ struct bpf_map_info { ...@@ -881,7 +881,7 @@ struct bpf_map_info {
__u32 value_size; __u32 value_size;
__u32 max_entries; __u32 max_entries;
__u32 map_flags; __u32 map_flags;
__u8 name[BPF_OBJ_NAME_LEN]; char name[BPF_OBJ_NAME_LEN];
} __attribute__((aligned(8))); } __attribute__((aligned(8)));
/* User bpf_sock_ops struct to access socket values and specify request ops /* User bpf_sock_ops struct to access socket values and specify request ops
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment