Hi Kazu,
Thanks for catching this -- queued for crash-7.2.9:
https://github.com/crash-utility/crash/commit/af71d71f35372df7308788a6d49...
Dave
----- Original Message -----
Fix for the "bpf -m|-M" options on Linux 5.3 and later
kernels that
contain commit 3539b96e041c06e4317082816d90ec09160aeb11, titled
"bpf: group memory related fields in struct bpf_map_memory".
Without the patch, the options prints "(unknown)" for MEMLOCK and UID.
Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
---
bpf.c | 22 ++++++++++++++++++++--
defs.h | 3 +++
symbols.c | 6 ++++++
3 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/bpf.c b/bpf.c
index 056e286..39ced88 100644
--- a/bpf.c
+++ b/bpf.c
@@ -202,6 +202,13 @@ bpf_init(struct bpf_info *bpf)
MEMBER_OFFSET_INIT(bpf_map_user, "bpf_map", "user");
MEMBER_OFFSET_INIT(user_struct_uid, "user_struct", "uid");
+ /* Linux 5.3 */
+ MEMBER_OFFSET_INIT(bpf_map_memory, "bpf_map", "memory");
+ if (VALID_MEMBER(bpf_map_memory)) {
+ MEMBER_OFFSET_INIT(bpf_map_memory_pages, "bpf_map_memory",
"pages");
+ MEMBER_OFFSET_INIT(bpf_map_memory_user, "bpf_map_memory",
"user");
+ }
+
if (!bpf_type_size_init()) {
bpf->status = FALSE;
command_not_supported();
@@ -576,7 +583,11 @@ do_map_only:
fprintf(fp, "(unknown)");
fprintf(fp, " MEMLOCK: ");
- if (VALID_MEMBER(bpf_map_pages)) {
+ if (VALID_MEMBER(bpf_map_memory) && VALID_MEMBER(bpf_map_memory_pages)) {
+ map_pages = UINT(bpf->bpf_map_buf + OFFSET(bpf_map_memory)
+ + OFFSET(bpf_map_memory_pages));
+ fprintf(fp, "%d\n", map_pages * PAGESIZE());
+ } else if (VALID_MEMBER(bpf_map_pages)) {
map_pages = UINT(bpf->bpf_map_buf + OFFSET(bpf_map_pages));
fprintf(fp, "%d\n", map_pages * PAGESIZE());
} else
@@ -594,8 +605,15 @@ do_map_only:
fprintf(fp, "(unknown)\n");
fprintf(fp, " UID: ");
- if (VALID_MEMBER(bpf_map_user) && VALID_MEMBER(user_struct_uid)) {
+ if (VALID_MEMBER(bpf_map_memory) && VALID_MEMBER(bpf_map_memory_user))
+ user = ULONG(bpf->bpf_map_buf + OFFSET(bpf_map_memory)
+ + OFFSET(bpf_map_memory_user));
+ else if (VALID_MEMBER(bpf_map_user))
user = ULONG(bpf->bpf_map_buf + OFFSET(bpf_map_user));
+ else
+ user = 0;
+
+ if (user && VALID_MEMBER(user_struct_uid)) {
if (readmem(user + OFFSET(user_struct_uid), KVADDR, &uid, sizeof(uint),
"user_struct.uid", QUIET|RETURN_ON_ERROR))
fprintf(fp, "%d\n", uid);
diff --git a/defs.h b/defs.h
index ac24a5d..fbd19b0 100644
--- a/defs.h
+++ b/defs.h
@@ -2075,6 +2075,9 @@ struct offset_table { /* stash of
commonly-used offsets */
long device_private_knode_class;
long timerqueue_head_rb_root;
long rb_root_cached_rb_leftmost;
+ long bpf_map_memory;
+ long bpf_map_memory_pages;
+ long bpf_map_memory_user;
};
struct size_table { /* stash of commonly-used sizes */
diff --git a/symbols.c b/symbols.c
index f04e8b5..f1f659b 100644
--- a/symbols.c
+++ b/symbols.c
@@ -10479,6 +10479,12 @@ dump_offset_table(char *spec, ulong makestruct)
OFFSET(bpf_map_name));
fprintf(fp, " bpf_map_user: %ld\n",
OFFSET(bpf_map_user));
+ fprintf(fp, " bpf_map_memory: %ld\n",
+ OFFSET(bpf_map_memory));
+ fprintf(fp, " bpf_map_memory_pages: %ld\n",
+ OFFSET(bpf_map_memory_pages));
+ fprintf(fp, " bpf_map_memory_user: %ld\n",
+ OFFSET(bpf_map_memory_user));
fprintf(fp, " bpf_prog_aux_used_map_cnt: %ld\n",
OFFSET(bpf_prog_aux_used_map_cnt));
--
2.24.1