mirror of https://github.com/crash-utility/crash
Fix for "bpf -m|-M" options to appropriately display MEMLOCK and UID
Kernel commit 80ee81e0403c ("bpf: Eliminate rlimit-based memory accounting infra for bpf maps") removed the struct bpf_map_memory member from struct bpf_map at Linux 5.11. Without the patch, the "bpf -m|-M" options will print "(unknown)" for MEMLOCK and UID: crash> bpf -m 1 ID BPF_MAP BPF_MAP_TYPE MAP_FLAGS 1 ffff96ba41804400 ARRAY 00000000 KEY_SIZE: 4 VALUE_SIZE: 8 MAX_ENTRIES: 64 MEMLOCK: (unknown) NAME: "dist" UID: (unknown) Signed-off-by: Lianbo Jiang <lijiang@redhat.com> Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
This commit is contained in:
parent
5f390ed811
commit
1ecb351309
70
bpf.c
70
bpf.c
|
@ -63,6 +63,64 @@ static int do_old_idr(int, ulong, struct list_pair *);
|
||||||
#define PROG_VERBOSE (0x40)
|
#define PROG_VERBOSE (0x40)
|
||||||
#define MAP_VERBOSE (0x80)
|
#define MAP_VERBOSE (0x80)
|
||||||
|
|
||||||
|
static int map_is_per_cpu(int type)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* See the definition of bpf_map_type: include/uapi/linux/bpf.h */
|
||||||
|
#define BPF_MAP_TYPE_PERCPU_HASH (5UL)
|
||||||
|
#define BPF_MAP_TYPE_PERCPU_ARRAY (6UL)
|
||||||
|
#define BPF_MAP_TYPE_LRU_PERCPU_HASH (10UL)
|
||||||
|
#define BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE (21UL)
|
||||||
|
|
||||||
|
return type == BPF_MAP_TYPE_PERCPU_HASH ||
|
||||||
|
type == BPF_MAP_TYPE_PERCPU_ARRAY ||
|
||||||
|
type == BPF_MAP_TYPE_LRU_PERCPU_HASH ||
|
||||||
|
type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int map_is_fd_map(int type)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* See the definition of bpf_map_type: include/uapi/linux/bpf.h */
|
||||||
|
#define BPF_MAP_TYPE_PROG_ARRAY (3UL)
|
||||||
|
#define BPF_MAP_TYPE_PERF_EVENT_ARRAY (4UL)
|
||||||
|
#define BPF_MAP_TYPE_CGROUP_ARRAY (8UL)
|
||||||
|
#define BPF_MAP_TYPE_ARRAY_OF_MAPS (12UL)
|
||||||
|
#define BPF_MAP_TYPE_HASH_OF_MAPS (13UL)
|
||||||
|
|
||||||
|
return type == BPF_MAP_TYPE_PROG_ARRAY ||
|
||||||
|
type == BPF_MAP_TYPE_PERF_EVENT_ARRAY ||
|
||||||
|
type == BPF_MAP_TYPE_CGROUP_ARRAY ||
|
||||||
|
type == BPF_MAP_TYPE_ARRAY_OF_MAPS ||
|
||||||
|
type == BPF_MAP_TYPE_HASH_OF_MAPS;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong bpf_map_memory_size(int map_type, uint value_size,
|
||||||
|
uint key_size, uint max_entries)
|
||||||
|
{
|
||||||
|
ulong size;
|
||||||
|
uint valsize;
|
||||||
|
int cpus = 0;
|
||||||
|
|
||||||
|
if (map_is_per_cpu(map_type)) {
|
||||||
|
cpus = get_cpus_possible();
|
||||||
|
if (!cpus) {
|
||||||
|
error(WARNING, "cpu_possible_map does not exist, possible cpus: %d\n", cpus);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
valsize = roundup(value_size, 8) * cpus;
|
||||||
|
} else if (map_is_fd_map(map_type))
|
||||||
|
valsize = sizeof(uint);
|
||||||
|
else
|
||||||
|
valsize = value_size;
|
||||||
|
|
||||||
|
size = roundup((key_size + valsize), 8);
|
||||||
|
|
||||||
|
return roundup((max_entries * size), PAGESIZE());
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cmd_bpf(void)
|
cmd_bpf(void)
|
||||||
{
|
{
|
||||||
|
@ -332,7 +390,7 @@ do_bpf(ulong flags, ulong prog_id, ulong map_id, int radix)
|
||||||
{
|
{
|
||||||
struct bpf_info *bpf;
|
struct bpf_info *bpf;
|
||||||
int i, c, found, entries, type;
|
int i, c, found, entries, type;
|
||||||
uint uid, map_pages, key_size, value_size, max_entries;
|
uint uid, map_pages, key_size = 0, value_size = 0, max_entries = 0;
|
||||||
ulong bpf_prog_aux, bpf_func, end_func, addr, insnsi, user;
|
ulong bpf_prog_aux, bpf_func, end_func, addr, insnsi, user;
|
||||||
ulong do_progs, do_maps;
|
ulong do_progs, do_maps;
|
||||||
ulonglong load_time;
|
ulonglong load_time;
|
||||||
|
@ -572,6 +630,8 @@ do_map_only:
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
|
|
||||||
if (flags & (MAP_ID|MAP_VERBOSE)) {
|
if (flags & (MAP_ID|MAP_VERBOSE)) {
|
||||||
|
ulong msize = 0;
|
||||||
|
|
||||||
fprintf(fp, " KEY_SIZE: ");
|
fprintf(fp, " KEY_SIZE: ");
|
||||||
if (VALID_MEMBER(bpf_map_key_size)) {
|
if (VALID_MEMBER(bpf_map_key_size)) {
|
||||||
key_size = UINT(bpf->bpf_map_buf + OFFSET(bpf_map_key_size));
|
key_size = UINT(bpf->bpf_map_buf + OFFSET(bpf_map_key_size));
|
||||||
|
@ -602,8 +662,10 @@ do_map_only:
|
||||||
} else if (VALID_MEMBER(bpf_map_pages)) {
|
} else if (VALID_MEMBER(bpf_map_pages)) {
|
||||||
map_pages = UINT(bpf->bpf_map_buf + OFFSET(bpf_map_pages));
|
map_pages = UINT(bpf->bpf_map_buf + OFFSET(bpf_map_pages));
|
||||||
fprintf(fp, "%d\n", map_pages * PAGESIZE());
|
fprintf(fp, "%d\n", map_pages * PAGESIZE());
|
||||||
} else
|
} else if ((msize = bpf_map_memory_size(type, value_size, key_size, max_entries)))
|
||||||
fprintf(fp, "(unknown)\n");
|
fprintf(fp, "%ld\n", msize);
|
||||||
|
else
|
||||||
|
fprintf(fp, "(unknown)");
|
||||||
|
|
||||||
fprintf(fp, " NAME: ");
|
fprintf(fp, " NAME: ");
|
||||||
if (VALID_MEMBER(bpf_map_name)) {
|
if (VALID_MEMBER(bpf_map_name)) {
|
||||||
|
@ -632,7 +694,7 @@ do_map_only:
|
||||||
else
|
else
|
||||||
fprintf(fp, "(unknown)\n");
|
fprintf(fp, "(unknown)\n");
|
||||||
} else
|
} else
|
||||||
fprintf(fp, "(unknown)\n");
|
fprintf(fp, "(unused)\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & DUMP_STRUCT) {
|
if (flags & DUMP_STRUCT) {
|
||||||
|
|
Loading…
Reference in New Issue