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: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
c9f766bc6e
|
@ -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 {
|
||||||
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 {
|
||||||
__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 {
|
||||||
__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 {
|
||||||
__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 {
|
||||||
__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,
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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 {
|
||||||
__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 {
|
||||||
__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 {
|
||||||
__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 {
|
||||||
__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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче