bpf: Fix seq_show for BPF_MAP_TYPE_STRUCT_OPS
Instead of using bpf_struct_ops_map_lookup_elem() which is
not implemented, bpf_struct_ops_map_seq_show_elem() should
also use bpf_struct_ops_map_sys_lookup_elem() which does
an inplace update to the value. The change allocates
a value to pass to bpf_struct_ops_map_sys_lookup_elem().
[root@arch-fb-vm1 bpf]# cat /sys/fs/bpf/dctcp
{{{1}},BPF_STRUCT_OPS_STATE_INUSE,{{00000000df93eebc,00000000df93eebc},0,2, ...
Fixes: 85d33df357
("bpf: Introduce BPF_MAP_TYPE_STRUCT_OPS")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200114072647.3188298-1-kafai@fb.com
This commit is contained in:
parent
6dd42aa17f
commit
3b4130418f
|
@ -496,14 +496,20 @@ static void bpf_struct_ops_map_seq_show_elem(struct bpf_map *map, void *key,
|
||||||
struct seq_file *m)
|
struct seq_file *m)
|
||||||
{
|
{
|
||||||
void *value;
|
void *value;
|
||||||
|
int err;
|
||||||
|
|
||||||
value = bpf_struct_ops_map_lookup_elem(map, key);
|
value = kmalloc(map->value_size, GFP_USER | __GFP_NOWARN);
|
||||||
if (!value)
|
if (!value)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
btf_type_seq_show(btf_vmlinux, map->btf_vmlinux_value_type_id,
|
err = bpf_struct_ops_map_sys_lookup_elem(map, key, value);
|
||||||
value, m);
|
if (!err) {
|
||||||
seq_puts(m, "\n");
|
btf_type_seq_show(btf_vmlinux, map->btf_vmlinux_value_type_id,
|
||||||
|
value, m);
|
||||||
|
seq_puts(m, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
kfree(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bpf_struct_ops_map_free(struct bpf_map *map)
|
static void bpf_struct_ops_map_free(struct bpf_map *map)
|
||||||
|
|
Loading…
Reference in New Issue