* Ubuntu kernels and die__process: DW_TAG ... got INVALID! @ 2022-10-04 21:10 Bitweasil 2022-10-05 12:20 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 4+ messages in thread From: Bitweasil @ 2022-10-04 21:10 UTC (permalink / raw) To: dwarves When trying to extract the layout of kernel structures that should exist on recent kernels from the Ubuntu debug kernel repo, I get the following error: die__process: DW_TAG_compile_unit, DW_TAG_type_unit or DW_TAG_partial_unit expected got INVALID! pahole: type 'mount' not found As far as I can tell, 'struct mount' should still exist - and I can pull other structures out without trouble. The issue starts appearing somewhere in the 5.15 kernel version - earlier kernels work exactly as expected and I can extract the full offsets. https://elixir.bootlin.com/linux/v5.15.48/source/fs/mount.h indicates that 'struct mount' still exists in the source, and it remains present into the 6.0 kernel with no substantial changes. I can also produce the same response with some of the other structures in that file - mountpoint, mnt_namespace, and mnt_pcp all lead to the same error message. I've tried building pahole from head (Oct 4, 2022, e819d737) without any changes to the behavior, and v1.21 and 1.24 both lead to the same results. Steps to reproduce (warning, will take ~10GB - the unzipped kernel debug symbols are rather large): cd /tmp wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb ar x linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb tar -xf data.tar.xz cd usr/lib/debug/boot pahole -C mount vmlinux-5.15.0-48-generic die__process: DW_TAG_compile_unit, DW_TAG_type_unit or DW_TAG_partial_unit expected got INVALID! pahole: type 'mount' not found Any suggestions on how to resolve this? I'm not familiar enough with the various debug formats to know how to troubleshoot beyond this point right now. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Ubuntu kernels and die__process: DW_TAG ... got INVALID! 2022-10-04 21:10 Ubuntu kernels and die__process: DW_TAG ... got INVALID! Bitweasil @ 2022-10-05 12:20 ` Arnaldo Carvalho de Melo 2022-10-05 16:59 ` Bitweasil 0 siblings, 1 reply; 4+ messages in thread From: Arnaldo Carvalho de Melo @ 2022-10-05 12:20 UTC (permalink / raw) To: Bitweasil; +Cc: dwarves Em Tue, Oct 04, 2022 at 03:10:06PM -0600, Bitweasil escreveu: > When trying to extract the layout of kernel structures that should exist on > recent kernels from the Ubuntu debug kernel repo, I get the following error: > > die__process: DW_TAG_compile_unit, DW_TAG_type_unit or DW_TAG_partial_unit > expected got INVALID! > pahole: type 'mount' not found > > As far as I can tell, 'struct mount' should still exist - and I can pull > other structures out without trouble. The issue starts appearing somewhere > in the 5.15 kernel version - earlier kernels work exactly as expected and I > can extract the full offsets. > > https://elixir.bootlin.com/linux/v5.15.48/source/fs/mount.h indicates that > 'struct mount' still exists in the source, and it remains present into the > 6.0 kernel with no substantial changes. I can also produce the same response > with some of the other structures in that file - mountpoint, mnt_namespace, > and mnt_pcp all lead to the same error message. > > I've tried building pahole from head (Oct 4, 2022, e819d737) without any > changes to the behavior, and v1.21 and 1.24 both lead to the same results. Are you sure? The error message should be this in 1.24: because: if (tag == DW_TAG_skeleton_unit) { static bool warned; if (!warned) { fprintf(stderr, "WARNING: DW_TAG_skeleton_unit used, please look for a .dwo file and use it instead.\n" " A future version of pahole will support do this automagically.\n"); warned = true; } return 0; // so that other units can be processed } if (tag == DW_TAG_partial_unit) { static bool warned; if (!warned) { fprintf(stderr, "WARNING: DW_TAG_partial_unit used, some types will not be considered!\n" " Probably this was optimized using a tool like 'dwz'\n" " A future version of pahole will support this.\n"); warned = true; } return 0; // so that other units can be processed } if (tag != DW_TAG_compile_unit && tag != DW_TAG_type_unit) { fprintf(stderr, "%s: DW_TAG_compile_unit, DW_TAG_type_unit, DW_TAG_partial_unit or DW_TAG_skeleton_unit expected got %s (0x%x)!\n", __FUNCTION__, dwarf_tag_name(tag), tag); return -EINVAL; } But its strange, there are no units other than DW_TAG_compile_unit in that vmlinux file: ⬢[acme@toolbox boot]$ readelf -wi vmlinux-5.15.0-48-generic | grep 'DW_TAG_.*_unit' | grep -v DW_TAG_compile_unit ⬢[acme@toolbox boot]$ > Steps to reproduce (warning, will take ~10GB - the unzipped kernel debug > symbols are rather large): > cd /tmp > wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > ar x linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > tar -xf data.tar.xz > cd usr/lib/debug/boot > pahole -C mount vmlinux-5.15.0-48-generic > die__process: DW_TAG_compile_unit, DW_TAG_type_unit or DW_TAG_partial_unit > expected got INVALID! > pahole: type 'mount' not found > Any suggestions on how to resolve this? I'm not familiar enough with the > various debug formats to know how to troubleshoot beyond this point right > now. Works for me: ⬢[acme@toolbox pahole]$ wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb --2022-10-05 09:11:56-- http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb Resolving ddebs.ubuntu.com (ddebs.ubuntu.com)... 185.125.190.17, 91.189.91.48, 91.189.91.49, ... Connecting to ddebs.ubuntu.com (ddebs.ubuntu.com)|185.125.190.17|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1055842672 (1007M) [application/vnd.debian.binary-package] Saving to: ‘linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb’ linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.dde 100%[===================================================================================================================================================================>] 1007M 13.3MB/s in 74s 2022-10-05 09:13:11 (13.5 MB/s) - ‘linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb’ saved [1055842672/1055842672] ⬢[acme@toolbox pahole]$ mkdir ubuntu-kernel ⬢[acme@toolbox pahole]$ mv linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb ubuntu-kernel ⬢[acme@toolbox pahole]$ cd ubuntu-kernel ⬢[acme@toolbox ubuntu-kernel]$ ls -la total 1031148 drwxr-xr-x. 1 acme acme 138 Oct 5 09:13 . drwxrwxr-x. 1 acme acme 5074 Oct 5 09:13 .. -rw-r--r--. 1 acme acme 1055842672 Aug 31 08:39 linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb ⬢[acme@toolbox ubuntu-kernel]$ ar x linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb ⬢[acme@toolbox ubuntu-kernel]$ ls -la total 2062252 drwxr-xr-x. 1 acme acme 214 Oct 5 09:13 . drwxrwxr-x. 1 acme acme 5074 Oct 5 09:13 .. -rw-r--r--. 1 acme acme 155352 Oct 5 09:13 control.tar.xz -rw-r--r--. 1 acme acme 1055687128 Oct 5 09:13 data.tar.xz -rw-r--r--. 1 acme acme 4 Oct 5 09:13 debian-binary -rw-r--r--. 1 acme acme 1055842672 Aug 31 08:39 linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb ⬢[acme@toolbox ubuntu-kernel]$ tar -xf data.tar.xz ⬢[acme@toolbox ubuntu-kernel]$ cd usr/lib/debug/boot ⬢[acme@toolbox boot]$ ls -la total 719136 drwxr-xr-x. 1 acme acme 50 Aug 26 06:12 . drwxr-xr-x. 1 acme acme 14 Oct 5 09:13 .. -rw-r--r--. 1 acme acme 736393784 Aug 26 06:12 vmlinux-5.15.0-48-generic ⬢[acme@toolbox boot]$ ls -la total 719136 drwxr-xr-x. 1 acme acme 50 Aug 26 06:12 . drwxr-xr-x. 1 acme acme 14 Oct 5 09:13 .. -rw-r--r--. 1 acme acme 736393784 Aug 26 06:12 vmlinux-5.15.0-48-generic ⬢[acme@toolbox boot]$ pahole -C mount vmlinux-5.15.0-48-generic struct mount { struct hlist_node mnt_hash; /* 0 16 */ struct mount * mnt_parent; /* 16 8 */ struct dentry * mnt_mountpoint; /* 24 8 */ struct vfsmount mnt; /* 32 32 */ /* --- cacheline 1 boundary (64 bytes) --- */ union { struct callback_head mnt_rcu __attribute__((__aligned__(8))); /* 64 16 */ struct llist_node mnt_llist; /* 64 8 */ } __attribute__((__aligned__(8))); /* 64 16 */ struct mnt_pcp * mnt_pcp; /* 80 8 */ struct list_head mnt_mounts; /* 88 16 */ struct list_head mnt_child; /* 104 16 */ struct list_head mnt_instance; /* 120 16 */ /* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */ const char * mnt_devname; /* 136 8 */ struct list_head mnt_list; /* 144 16 */ struct list_head mnt_expire; /* 160 16 */ struct list_head mnt_share; /* 176 16 */ /* --- cacheline 3 boundary (192 bytes) --- */ struct list_head mnt_slave_list; /* 192 16 */ struct list_head mnt_slave; /* 208 16 */ struct mount * mnt_master; /* 224 8 */ struct mnt_namespace * mnt_ns; /* 232 8 */ struct mountpoint * mnt_mp; /* 240 8 */ union { struct hlist_node mnt_mp_list; /* 248 16 */ struct hlist_node mnt_umount; /* 248 16 */ }; /* 248 16 */ /* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */ struct list_head mnt_umounting; /* 264 16 */ struct fsnotify_mark_connector * mnt_fsnotify_marks; /* 280 8 */ __u32 mnt_fsnotify_mask; /* 288 4 */ int mnt_id; /* 292 4 */ int mnt_group_id; /* 296 4 */ int mnt_expiry_mark; /* 300 4 */ struct hlist_head mnt_pins; /* 304 8 */ struct hlist_head mnt_stuck_children; /* 312 8 */ /* size: 320, cachelines: 5, members: 27 */ /* forced alignments: 1 */ } __attribute__((__aligned__(8))); ⬢[acme@toolbox boot]$ pahole --version v1.24 ⬢[acme@toolbox boot]$ And it even has BTF info, which makes processing much faster but without some attributes: ⬢[acme@toolbox boot]$ readelf -SW vmlinux-5.15.0-48-generic | grep -i btf [28] .BTF PROGBITS ffffffff8279d1e0 199d1e0 4ef6b2 00 A 0 0 1 [29] .BTF_ids PROGBITS ffffffff82c8c894 1e8c894 0005e8 00 A 0 0 1 ⬢[acme@toolbox boot]$ ⬢[acme@toolbox boot]$ pahole -F btf -C mount vmlinux-5.15.0-48-generic struct mount { struct hlist_node mnt_hash; /* 0 16 */ struct mount * mnt_parent; /* 16 8 */ struct dentry * mnt_mountpoint; /* 24 8 */ struct vfsmount mnt; /* 32 32 */ /* --- cacheline 1 boundary (64 bytes) --- */ union { struct callback_head mnt_rcu; /* 64 16 */ struct llist_node mnt_llist; /* 64 8 */ }; /* 64 16 */ struct mnt_pcp * mnt_pcp; /* 80 8 */ struct list_head mnt_mounts; /* 88 16 */ struct list_head mnt_child; /* 104 16 */ struct list_head mnt_instance; /* 120 16 */ /* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */ const char * mnt_devname; /* 136 8 */ struct list_head mnt_list; /* 144 16 */ struct list_head mnt_expire; /* 160 16 */ struct list_head mnt_share; /* 176 16 */ /* --- cacheline 3 boundary (192 bytes) --- */ struct list_head mnt_slave_list; /* 192 16 */ struct list_head mnt_slave; /* 208 16 */ struct mount * mnt_master; /* 224 8 */ struct mnt_namespace * mnt_ns; /* 232 8 */ struct mountpoint * mnt_mp; /* 240 8 */ union { struct hlist_node mnt_mp_list; /* 248 16 */ struct hlist_node mnt_umount; /* 248 16 */ }; /* 248 16 */ /* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */ struct list_head mnt_umounting; /* 264 16 */ struct fsnotify_mark_connector * mnt_fsnotify_marks; /* 280 8 */ __u32 mnt_fsnotify_mask; /* 288 4 */ int mnt_id; /* 292 4 */ int mnt_group_id; /* 296 4 */ int mnt_expiry_mark; /* 300 4 */ struct hlist_head mnt_pins; /* 304 8 */ struct hlist_head mnt_stuck_children; /* 312 8 */ /* size: 320, cachelines: 5, members: 27 */ }; ⬢[acme@toolbox boot]$ ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Ubuntu kernels and die__process: DW_TAG ... got INVALID! 2022-10-05 12:20 ` Arnaldo Carvalho de Melo @ 2022-10-05 16:59 ` Bitweasil 2022-10-05 18:31 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 4+ messages in thread From: Bitweasil @ 2022-10-05 16:59 UTC (permalink / raw) To: Arnaldo Carvalho de Melo; +Cc: dwarves On 10/5/22 06:20, Arnaldo Carvalho de Melo wrote: > Em Tue, Oct 04, 2022 at 03:10:06PM -0600, Bitweasil escreveu: >> When trying to extract the layout of kernel structures that should exist on >> recent kernels from the Ubuntu debug kernel repo, I get the following error: >> >> die__process: DW_TAG_compile_unit, DW_TAG_type_unit or DW_TAG_partial_unit >> expected got INVALID! >> pahole: type 'mount' not found >> >> As far as I can tell, 'struct mount' should still exist - and I can pull >> other structures out without trouble. The issue starts appearing somewhere >> in the 5.15 kernel version - earlier kernels work exactly as expected and I >> can extract the full offsets. >> >> https://elixir.bootlin.com/linux/v5.15.48/source/fs/mount.h indicates that >> 'struct mount' still exists in the source, and it remains present into the >> 6.0 kernel with no substantial changes. I can also produce the same response >> with some of the other structures in that file - mountpoint, mnt_namespace, >> and mnt_pcp all lead to the same error message. >> >> I've tried building pahole from head (Oct 4, 2022, e819d737) without any >> changes to the behavior, and v1.21 and 1.24 both lead to the same results. > Are you sure? The error message should be this in 1.24: > > because: > > if (tag == DW_TAG_skeleton_unit) { > static bool warned; > > if (!warned) { > fprintf(stderr, "WARNING: DW_TAG_skeleton_unit used, please look for a .dwo file and use it instead.\n" > " A future version of pahole will support do this automagically.\n"); > warned = true; > } > return 0; // so that other units can be processed > } > > if (tag == DW_TAG_partial_unit) { > static bool warned; > > if (!warned) { > fprintf(stderr, "WARNING: DW_TAG_partial_unit used, some types will not be considered!\n" > " Probably this was optimized using a tool like 'dwz'\n" > " A future version of pahole will support this.\n"); > warned = true; > } > return 0; // so that other units can be processed > } > > if (tag != DW_TAG_compile_unit && tag != DW_TAG_type_unit) { > fprintf(stderr, "%s: DW_TAG_compile_unit, DW_TAG_type_unit, DW_TAG_partial_unit or DW_TAG_skeleton_unit expected got %s (0x%x)!\n", > __FUNCTION__, dwarf_tag_name(tag), tag); > return -EINVAL; > } Yes, I recognize the error text is slightly different in 1.24, but it was the same error with either version. However, seeing that it worked for your system led to some experimentation, and I believe the issue is one of either libdw or libelf versions. I did my initial testing on Ubuntu 20.04, which has libdw/libelf 0.176-1.1build1 - and building 1.24 and head from source fail on that. If I add the "-F btf" flag, v1.21 on 20.04 is able to get the structure. However, on Ubuntu 22.04, with libdw/libelf 0.186-1build1, I get the expected results without "-F btf", even with pahole v1.22. This gives me several options that resolve the issue usefully - thank you for your prompt response and testing! -Bit > But its strange, there are no units other than DW_TAG_compile_unit in > that vmlinux file: > > ⬢[acme@toolbox boot]$ readelf -wi vmlinux-5.15.0-48-generic | grep 'DW_TAG_.*_unit' | grep -v DW_TAG_compile_unit > ⬢[acme@toolbox boot]$ > >> Steps to reproduce (warning, will take ~10GB - the unzipped kernel debug >> symbols are rather large): > >> cd /tmp >> wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb >> ar x linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb >> tar -xf data.tar.xz >> cd usr/lib/debug/boot >> pahole -C mount vmlinux-5.15.0-48-generic >> die__process: DW_TAG_compile_unit, DW_TAG_type_unit or DW_TAG_partial_unit >> expected got INVALID! >> pahole: type 'mount' not found >> Any suggestions on how to resolve this? I'm not familiar enough with the >> various debug formats to know how to troubleshoot beyond this point right >> now. > Works for me: > > ⬢[acme@toolbox pahole]$ wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > --2022-10-05 09:11:56-- http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > Resolving ddebs.ubuntu.com (ddebs.ubuntu.com)... 185.125.190.17, 91.189.91.48, 91.189.91.49, ... > Connecting to ddebs.ubuntu.com (ddebs.ubuntu.com)|185.125.190.17|:80... connected. > HTTP request sent, awaiting response... 200 OK > Length: 1055842672 (1007M) [application/vnd.debian.binary-package] > Saving to: ‘linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb’ > > linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.dde 100%[===================================================================================================================================================================>] 1007M 13.3MB/s in 74s > > 2022-10-05 09:13:11 (13.5 MB/s) - ‘linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb’ saved [1055842672/1055842672] > > ⬢[acme@toolbox pahole]$ mkdir ubuntu-kernel > ⬢[acme@toolbox pahole]$ mv linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb ubuntu-kernel > ⬢[acme@toolbox pahole]$ cd ubuntu-kernel > ⬢[acme@toolbox ubuntu-kernel]$ ls -la > total 1031148 > drwxr-xr-x. 1 acme acme 138 Oct 5 09:13 . > drwxrwxr-x. 1 acme acme 5074 Oct 5 09:13 .. > -rw-r--r--. 1 acme acme 1055842672 Aug 31 08:39 linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > ⬢[acme@toolbox ubuntu-kernel]$ ar x linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > ⬢[acme@toolbox ubuntu-kernel]$ ls -la > total 2062252 > drwxr-xr-x. 1 acme acme 214 Oct 5 09:13 . > drwxrwxr-x. 1 acme acme 5074 Oct 5 09:13 .. > -rw-r--r--. 1 acme acme 155352 Oct 5 09:13 control.tar.xz > -rw-r--r--. 1 acme acme 1055687128 Oct 5 09:13 data.tar.xz > -rw-r--r--. 1 acme acme 4 Oct 5 09:13 debian-binary > -rw-r--r--. 1 acme acme 1055842672 Aug 31 08:39 linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > ⬢[acme@toolbox ubuntu-kernel]$ tar -xf data.tar.xz > ⬢[acme@toolbox ubuntu-kernel]$ cd usr/lib/debug/boot > ⬢[acme@toolbox boot]$ ls -la > total 719136 > drwxr-xr-x. 1 acme acme 50 Aug 26 06:12 . > drwxr-xr-x. 1 acme acme 14 Oct 5 09:13 .. > -rw-r--r--. 1 acme acme 736393784 Aug 26 06:12 vmlinux-5.15.0-48-generic > ⬢[acme@toolbox boot]$ ls -la > total 719136 > drwxr-xr-x. 1 acme acme 50 Aug 26 06:12 . > drwxr-xr-x. 1 acme acme 14 Oct 5 09:13 .. > -rw-r--r--. 1 acme acme 736393784 Aug 26 06:12 vmlinux-5.15.0-48-generic > ⬢[acme@toolbox boot]$ pahole -C mount vmlinux-5.15.0-48-generic > struct mount { > struct hlist_node mnt_hash; /* 0 16 */ > struct mount * mnt_parent; /* 16 8 */ > struct dentry * mnt_mountpoint; /* 24 8 */ > struct vfsmount mnt; /* 32 32 */ > /* --- cacheline 1 boundary (64 bytes) --- */ > union { > struct callback_head mnt_rcu __attribute__((__aligned__(8))); /* 64 16 */ > struct llist_node mnt_llist; /* 64 8 */ > } __attribute__((__aligned__(8))); /* 64 16 */ > struct mnt_pcp * mnt_pcp; /* 80 8 */ > struct list_head mnt_mounts; /* 88 16 */ > struct list_head mnt_child; /* 104 16 */ > struct list_head mnt_instance; /* 120 16 */ > /* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */ > const char * mnt_devname; /* 136 8 */ > struct list_head mnt_list; /* 144 16 */ > struct list_head mnt_expire; /* 160 16 */ > struct list_head mnt_share; /* 176 16 */ > /* --- cacheline 3 boundary (192 bytes) --- */ > struct list_head mnt_slave_list; /* 192 16 */ > struct list_head mnt_slave; /* 208 16 */ > struct mount * mnt_master; /* 224 8 */ > struct mnt_namespace * mnt_ns; /* 232 8 */ > struct mountpoint * mnt_mp; /* 240 8 */ > union { > struct hlist_node mnt_mp_list; /* 248 16 */ > struct hlist_node mnt_umount; /* 248 16 */ > }; /* 248 16 */ > /* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */ > struct list_head mnt_umounting; /* 264 16 */ > struct fsnotify_mark_connector * mnt_fsnotify_marks; /* 280 8 */ > __u32 mnt_fsnotify_mask; /* 288 4 */ > int mnt_id; /* 292 4 */ > int mnt_group_id; /* 296 4 */ > int mnt_expiry_mark; /* 300 4 */ > struct hlist_head mnt_pins; /* 304 8 */ > struct hlist_head mnt_stuck_children; /* 312 8 */ > > /* size: 320, cachelines: 5, members: 27 */ > /* forced alignments: 1 */ > } __attribute__((__aligned__(8))); > > ⬢[acme@toolbox boot]$ pahole --version > v1.24 > ⬢[acme@toolbox boot]$ > > And it even has BTF info, which makes processing much faster but without > some attributes: > > ⬢[acme@toolbox boot]$ readelf -SW vmlinux-5.15.0-48-generic | grep -i btf > [28] .BTF PROGBITS ffffffff8279d1e0 199d1e0 4ef6b2 00 A 0 0 1 > [29] .BTF_ids PROGBITS ffffffff82c8c894 1e8c894 0005e8 00 A 0 0 1 > ⬢[acme@toolbox boot]$ > > ⬢[acme@toolbox boot]$ pahole -F btf -C mount vmlinux-5.15.0-48-generic > struct mount { > struct hlist_node mnt_hash; /* 0 16 */ > struct mount * mnt_parent; /* 16 8 */ > struct dentry * mnt_mountpoint; /* 24 8 */ > struct vfsmount mnt; /* 32 32 */ > /* --- cacheline 1 boundary (64 bytes) --- */ > union { > struct callback_head mnt_rcu; /* 64 16 */ > struct llist_node mnt_llist; /* 64 8 */ > }; /* 64 16 */ > struct mnt_pcp * mnt_pcp; /* 80 8 */ > struct list_head mnt_mounts; /* 88 16 */ > struct list_head mnt_child; /* 104 16 */ > struct list_head mnt_instance; /* 120 16 */ > /* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */ > const char * mnt_devname; /* 136 8 */ > struct list_head mnt_list; /* 144 16 */ > struct list_head mnt_expire; /* 160 16 */ > struct list_head mnt_share; /* 176 16 */ > /* --- cacheline 3 boundary (192 bytes) --- */ > struct list_head mnt_slave_list; /* 192 16 */ > struct list_head mnt_slave; /* 208 16 */ > struct mount * mnt_master; /* 224 8 */ > struct mnt_namespace * mnt_ns; /* 232 8 */ > struct mountpoint * mnt_mp; /* 240 8 */ > union { > struct hlist_node mnt_mp_list; /* 248 16 */ > struct hlist_node mnt_umount; /* 248 16 */ > }; /* 248 16 */ > /* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */ > struct list_head mnt_umounting; /* 264 16 */ > struct fsnotify_mark_connector * mnt_fsnotify_marks; /* 280 8 */ > __u32 mnt_fsnotify_mask; /* 288 4 */ > int mnt_id; /* 292 4 */ > int mnt_group_id; /* 296 4 */ > int mnt_expiry_mark; /* 300 4 */ > struct hlist_head mnt_pins; /* 304 8 */ > struct hlist_head mnt_stuck_children; /* 312 8 */ > > /* size: 320, cachelines: 5, members: 27 */ > }; > > ⬢[acme@toolbox boot]$ ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Ubuntu kernels and die__process: DW_TAG ... got INVALID! 2022-10-05 16:59 ` Bitweasil @ 2022-10-05 18:31 ` Arnaldo Carvalho de Melo 0 siblings, 0 replies; 4+ messages in thread From: Arnaldo Carvalho de Melo @ 2022-10-05 18:31 UTC (permalink / raw) To: Bitweasil; +Cc: dwarves Em Wed, Oct 05, 2022 at 10:59:10AM -0600, Bitweasil escreveu: > > On 10/5/22 06:20, Arnaldo Carvalho de Melo wrote: > > Em Tue, Oct 04, 2022 at 03:10:06PM -0600, Bitweasil escreveu: > > > When trying to extract the layout of kernel structures that should exist on > > > recent kernels from the Ubuntu debug kernel repo, I get the following error: > > > > > > die__process: DW_TAG_compile_unit, DW_TAG_type_unit or DW_TAG_partial_unit > > > expected got INVALID! > > > pahole: type 'mount' not found > > > > > > As far as I can tell, 'struct mount' should still exist - and I can pull > > > other structures out without trouble. The issue starts appearing somewhere > > > in the 5.15 kernel version - earlier kernels work exactly as expected and I > > > can extract the full offsets. > > > > > > https://elixir.bootlin.com/linux/v5.15.48/source/fs/mount.h indicates that > > > 'struct mount' still exists in the source, and it remains present into the > > > 6.0 kernel with no substantial changes. I can also produce the same response > > > with some of the other structures in that file - mountpoint, mnt_namespace, > > > and mnt_pcp all lead to the same error message. > > > > > > I've tried building pahole from head (Oct 4, 2022, e819d737) without any > > > changes to the behavior, and v1.21 and 1.24 both lead to the same results. > > Are you sure? The error message should be this in 1.24: > > > > because: > > > > if (tag == DW_TAG_skeleton_unit) { > > static bool warned; > > > > if (!warned) { > > fprintf(stderr, "WARNING: DW_TAG_skeleton_unit used, please look for a .dwo file and use it instead.\n" > > " A future version of pahole will support do this automagically.\n"); > > warned = true; > > } > > return 0; // so that other units can be processed > > } > > > > if (tag == DW_TAG_partial_unit) { > > static bool warned; > > > > if (!warned) { > > fprintf(stderr, "WARNING: DW_TAG_partial_unit used, some types will not be considered!\n" > > " Probably this was optimized using a tool like 'dwz'\n" > > " A future version of pahole will support this.\n"); > > warned = true; > > } > > return 0; // so that other units can be processed > > } > > > > if (tag != DW_TAG_compile_unit && tag != DW_TAG_type_unit) { > > fprintf(stderr, "%s: DW_TAG_compile_unit, DW_TAG_type_unit, DW_TAG_partial_unit or DW_TAG_skeleton_unit expected got %s (0x%x)!\n", > > __FUNCTION__, dwarf_tag_name(tag), tag); > > return -EINVAL; > > } > > Yes, I recognize the error text is slightly different in 1.24, but it was > the same error with either version. > > However, seeing that it worked for your system led to some experimentation, > and I believe the issue is one of either libdw or libelf versions. I did my > initial testing on Ubuntu 20.04, which has libdw/libelf 0.176-1.1build1 - > and building 1.24 and head from source fail on that. Humm, does it? I just tried building it on an ubuntu 20.04 container and it seems to work: root@0ed09bb9df94:~# cat /etc/os-release NAME="Ubuntu" VERSION="20.04.5 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.5 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=focal UBUNTU_CODENAME=focal root@0ed09bb9df94:~# cd /tmp root@0ed09bb9df94:/tmp# git clone git://git.kernel.org/pub/scm/devel/pahole/pahole.git Cloning into 'pahole'... remote: Enumerating objects: 11, done. remote: Counting objects: 100% (11/11), done. remote: Compressing objects: 100% (10/10), done. remote: Total 8364 (delta 3), reused 0 (delta 0), pack-reused 8353 Receiving objects: 100% (8364/8364), 2.08 MiB | 1.53 MiB/s, done. Resolving deltas: 100% (6025/6025), done. root@0ed09bb9df94:/tmp# cd pahole/ root@0ed09bb9df94:/tmp/pahole# mkdir build root@0ed09bb9df94:/tmp/pahole# cd build root@0ed09bb9df94:/tmp/pahole/build# cmake .. -- The C compiler identification is GNU 9.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Setting BUILD_SHARED_LIBS = ON -- Checking availability of DWARF and ELF development libraries -- Looking for dwfl_module_build_id in elf -- Looking for dwfl_module_build_id in elf - found -- Found dwarf.h header: /usr/include -- Found elfutils/libdw.h header: /usr/include -- Found libdw library: /usr/lib/x86_64-linux-gnu/libdw.so -- Found libelf library: /usr/lib/x86_64-linux-gnu/libelf.so -- Checking availability of DWARF and ELF development libraries - done -- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11") -- Checking availability of argp library -- Assuming argp is in libc -- Checking availability of argp library - done -- Checking availability of obstack library -- Assuming obstack is in libc -- Checking availability of obstack library - done -- Submodule update Submodule 'lib/bpf' (https://github.com/libbpf/libbpf) registered for path 'lib/bpf' Cloning into '/tmp/pahole/lib/bpf'... Submodule path 'lib/bpf': checked out '645500dd7d2d6b5bb76e4c0375d597d4f0c4814e' -- Submodule update - done -- Performing Test HAVE_REALLOCARRAY_SUPPORT -- Performing Test HAVE_REALLOCARRAY_SUPPORT - Success -- Configuring done -- Generating done -- Build files have been written to: /tmp/pahole/build root@0ed09bb9df94:/tmp/pahole/build# cd .. root@0ed09bb9df94:/tmp/pahole# make -C build make: Entering directory '/tmp/pahole/build' make[1]: Entering directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target bpf make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 1%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/bpf.c.o [ 3%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/bpf_prog_linfo.c.o [ 5%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/btf.c.o [ 7%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/btf_dump.c.o [ 9%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/gen_loader.c.o [ 10%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/hashmap.c.o [ 12%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/libbpf.c.o [ 14%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/libbpf_errno.c.o [ 16%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/libbpf_probes.c.o [ 18%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/linker.c.o [ 20%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/netlink.c.o [ 21%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/nlattr.c.o [ 23%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/relo_core.c.o [ 25%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/ringbuf.c.o [ 27%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/str_error.c.o [ 29%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/strset.c.o [ 30%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/usdt.c.o [ 32%] Building C object CMakeFiles/bpf.dir/lib/bpf/src/xsk.c.o make[2]: Leaving directory '/tmp/pahole/build' [ 32%] Built target bpf make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target dwarves make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 34%] Building C object CMakeFiles/dwarves.dir/dwarves.c.o [ 36%] Building C object CMakeFiles/dwarves.dir/dwarves_fprintf.c.o [ 38%] Building C object CMakeFiles/dwarves.dir/gobuffer.c.o [ 40%] Building C object CMakeFiles/dwarves.dir/ctf_loader.c.o [ 41%] Building C object CMakeFiles/dwarves.dir/libctf.c.o [ 43%] Building C object CMakeFiles/dwarves.dir/btf_encoder.c.o [ 45%] Building C object CMakeFiles/dwarves.dir/btf_loader.c.o [ 47%] Building C object CMakeFiles/dwarves.dir/dwarf_loader.c.o [ 49%] Building C object CMakeFiles/dwarves.dir/dutil.c.o [ 50%] Building C object CMakeFiles/dwarves.dir/elf_symtab.c.o [ 52%] Building C object CMakeFiles/dwarves.dir/rbtree.c.o [ 54%] Linking C shared library libdwarves.so make[2]: Leaving directory '/tmp/pahole/build' [ 54%] Built target dwarves make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target syscse make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 56%] Building C object CMakeFiles/syscse.dir/syscse.c.o [ 58%] Linking C executable syscse make[2]: Leaving directory '/tmp/pahole/build' [ 58%] Built target syscse make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target codiff make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 60%] Building C object CMakeFiles/codiff.dir/codiff.c.o [ 61%] Linking C executable codiff make[2]: Leaving directory '/tmp/pahole/build' [ 61%] Built target codiff make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target dtagnames make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 63%] Building C object CMakeFiles/dtagnames.dir/dtagnames.c.o [ 65%] Linking C executable dtagnames make[2]: Leaving directory '/tmp/pahole/build' [ 65%] Built target dtagnames make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target scncopy make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 67%] Building C object CMakeFiles/scncopy.dir/scncopy.c.o [ 69%] Building C object CMakeFiles/scncopy.dir/elfcreator.c.o [ 70%] Linking C executable scncopy make[2]: Leaving directory '/tmp/pahole/build' [ 70%] Built target scncopy make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target dwarves_emit make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 72%] Building C object CMakeFiles/dwarves_emit.dir/dwarves_emit.c.o [ 74%] Linking C shared library libdwarves_emit.so make[2]: Leaving directory '/tmp/pahole/build' [ 74%] Built target dwarves_emit make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target dwarves_reorganize make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 76%] Building C object CMakeFiles/dwarves_reorganize.dir/dwarves_reorganize.c.o [ 78%] Linking C shared library libdwarves_reorganize.so make[2]: Leaving directory '/tmp/pahole/build' [ 78%] Built target dwarves_reorganize make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target ctracer make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 80%] Building C object CMakeFiles/ctracer.dir/ctracer.c.o [ 81%] Linking C executable ctracer make[2]: Leaving directory '/tmp/pahole/build' [ 81%] Built target ctracer make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target pdwtags make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 83%] Building C object CMakeFiles/pdwtags.dir/pdwtags.c.o [ 85%] Linking C executable pdwtags make[2]: Leaving directory '/tmp/pahole/build' [ 85%] Built target pdwtags make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target pahole make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 87%] Building C object CMakeFiles/pahole.dir/pahole.c.o [ 89%] Linking C executable pahole make[2]: Leaving directory '/tmp/pahole/build' [ 89%] Built target pahole make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target pfunct make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 90%] Building C object CMakeFiles/pfunct.dir/pfunct.c.o [ 92%] Linking C executable pfunct make[2]: Leaving directory '/tmp/pahole/build' [ 92%] Built target pfunct make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target pglobal make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 94%] Building C object CMakeFiles/pglobal.dir/pglobal.c.o [ 96%] Linking C executable pglobal make[2]: Leaving directory '/tmp/pahole/build' [ 96%] Built target pglobal make[2]: Entering directory '/tmp/pahole/build' Scanning dependencies of target prefcnt make[2]: Leaving directory '/tmp/pahole/build' make[2]: Entering directory '/tmp/pahole/build' [ 98%] Building C object CMakeFiles/prefcnt.dir/prefcnt.c.o [100%] Linking C executable prefcnt make[2]: Leaving directory '/tmp/pahole/build' [100%] Built target prefcnt make[1]: Leaving directory '/tmp/pahole/build' make: Leaving directory '/tmp/pahole/build' root@0ed09bb9df94:/tmp/pahole# build/pahole --version v1.24 root@0ed09bb9df94:/tmp/pahole# git log --oneline -5 e819d73 (HEAD -> master, origin/master, origin/HEAD) pahole: Add "btf" to the format-path option man page f01e5f3 dwarf_loader: Support DW_TAG_label outside DW_TAG_lexblock b841207 pahole: Allow --compile to work with DWARF in addition to with BTF 6fdb014 dwarves: support DW_TAG_atomic_type d750714 (origin/nex) emit: Don't mark a enum with nr_members == 0 as printed, its just a fwd decl root@0ed09bb9df94:/tmp/pahole# root@0ed09bb9df94:/tmp/pahole# dpkg -l | egrep libdw\|elf ii libdw-dev:amd64 0.176-1.1build1 amd64 libdw1 development libraries and header files ii libdw1:amd64 0.176-1.1build1 amd64 library that provides access to the DWARF debug information ii libelf-dev:amd64 0.176-1.1build1 amd64 libelf1 development libraries and header files ii libelf1:amd64 0.176-1.1build1 amd64 library to read and write ELF files root@0ed09bb9df94:/tmp/pahole# - Arnaldo > If I add the "-F btf" flag, v1.21 on 20.04 is able to get the structure. Cool. > However, on Ubuntu 22.04, with libdw/libelf 0.186-1build1, I get the > expected results without "-F btf", even with pahole v1.22. Sure, there it manages to get it from DWARF, no need to get it from BTF, albeit the later is much faster to process. > This gives me several options that resolve the issue usefully - thank you > for your prompt response and testing! No problem, thanks for the report. > -Bit > > > But its strange, there are no units other than DW_TAG_compile_unit in > > that vmlinux file: > > > > ⬢[acme@toolbox boot]$ readelf -wi vmlinux-5.15.0-48-generic | grep 'DW_TAG_.*_unit' | grep -v DW_TAG_compile_unit > > ⬢[acme@toolbox boot]$ > > > Steps to reproduce (warning, will take ~10GB - the unzipped kernel debug > > > symbols are rather large): > > > cd /tmp > > > wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > > > ar x linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > > > tar -xf data.tar.xz > > > cd usr/lib/debug/boot > > > pahole -C mount vmlinux-5.15.0-48-generic > > > die__process: DW_TAG_compile_unit, DW_TAG_type_unit or DW_TAG_partial_unit > > > expected got INVALID! > > > pahole: type 'mount' not found > > > Any suggestions on how to resolve this? I'm not familiar enough with the > > > various debug formats to know how to troubleshoot beyond this point right > > > now. > > Works for me: > > > > ⬢[acme@toolbox pahole]$ wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > > --2022-10-05 09:11:56-- http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > > Resolving ddebs.ubuntu.com (ddebs.ubuntu.com)... 185.125.190.17, 91.189.91.48, 91.189.91.49, ... > > Connecting to ddebs.ubuntu.com (ddebs.ubuntu.com)|185.125.190.17|:80... connected. > > HTTP request sent, awaiting response... 200 OK > > Length: 1055842672 (1007M) [application/vnd.debian.binary-package] > > Saving to: ‘linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb’ > > > > linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.dde 100%[===================================================================================================================================================================>] 1007M 13.3MB/s in 74s > > > > 2022-10-05 09:13:11 (13.5 MB/s) - ‘linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb’ saved [1055842672/1055842672] > > > > ⬢[acme@toolbox pahole]$ mkdir ubuntu-kernel > > ⬢[acme@toolbox pahole]$ mv linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb ubuntu-kernel > > ⬢[acme@toolbox pahole]$ cd ubuntu-kernel > > ⬢[acme@toolbox ubuntu-kernel]$ ls -la > > total 1031148 > > drwxr-xr-x. 1 acme acme 138 Oct 5 09:13 . > > drwxrwxr-x. 1 acme acme 5074 Oct 5 09:13 .. > > -rw-r--r--. 1 acme acme 1055842672 Aug 31 08:39 linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > > ⬢[acme@toolbox ubuntu-kernel]$ ar x linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > > ⬢[acme@toolbox ubuntu-kernel]$ ls -la > > total 2062252 > > drwxr-xr-x. 1 acme acme 214 Oct 5 09:13 . > > drwxrwxr-x. 1 acme acme 5074 Oct 5 09:13 .. > > -rw-r--r--. 1 acme acme 155352 Oct 5 09:13 control.tar.xz > > -rw-r--r--. 1 acme acme 1055687128 Oct 5 09:13 data.tar.xz > > -rw-r--r--. 1 acme acme 4 Oct 5 09:13 debian-binary > > -rw-r--r--. 1 acme acme 1055842672 Aug 31 08:39 linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb > > ⬢[acme@toolbox ubuntu-kernel]$ tar -xf data.tar.xz > > ⬢[acme@toolbox ubuntu-kernel]$ cd usr/lib/debug/boot > > ⬢[acme@toolbox boot]$ ls -la > > total 719136 > > drwxr-xr-x. 1 acme acme 50 Aug 26 06:12 . > > drwxr-xr-x. 1 acme acme 14 Oct 5 09:13 .. > > -rw-r--r--. 1 acme acme 736393784 Aug 26 06:12 vmlinux-5.15.0-48-generic > > ⬢[acme@toolbox boot]$ ls -la > > total 719136 > > drwxr-xr-x. 1 acme acme 50 Aug 26 06:12 . > > drwxr-xr-x. 1 acme acme 14 Oct 5 09:13 .. > > -rw-r--r--. 1 acme acme 736393784 Aug 26 06:12 vmlinux-5.15.0-48-generic > > ⬢[acme@toolbox boot]$ pahole -C mount vmlinux-5.15.0-48-generic > > struct mount { > > struct hlist_node mnt_hash; /* 0 16 */ > > struct mount * mnt_parent; /* 16 8 */ > > struct dentry * mnt_mountpoint; /* 24 8 */ > > struct vfsmount mnt; /* 32 32 */ > > /* --- cacheline 1 boundary (64 bytes) --- */ > > union { > > struct callback_head mnt_rcu __attribute__((__aligned__(8))); /* 64 16 */ > > struct llist_node mnt_llist; /* 64 8 */ > > } __attribute__((__aligned__(8))); /* 64 16 */ > > struct mnt_pcp * mnt_pcp; /* 80 8 */ > > struct list_head mnt_mounts; /* 88 16 */ > > struct list_head mnt_child; /* 104 16 */ > > struct list_head mnt_instance; /* 120 16 */ > > /* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */ > > const char * mnt_devname; /* 136 8 */ > > struct list_head mnt_list; /* 144 16 */ > > struct list_head mnt_expire; /* 160 16 */ > > struct list_head mnt_share; /* 176 16 */ > > /* --- cacheline 3 boundary (192 bytes) --- */ > > struct list_head mnt_slave_list; /* 192 16 */ > > struct list_head mnt_slave; /* 208 16 */ > > struct mount * mnt_master; /* 224 8 */ > > struct mnt_namespace * mnt_ns; /* 232 8 */ > > struct mountpoint * mnt_mp; /* 240 8 */ > > union { > > struct hlist_node mnt_mp_list; /* 248 16 */ > > struct hlist_node mnt_umount; /* 248 16 */ > > }; /* 248 16 */ > > /* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */ > > struct list_head mnt_umounting; /* 264 16 */ > > struct fsnotify_mark_connector * mnt_fsnotify_marks; /* 280 8 */ > > __u32 mnt_fsnotify_mask; /* 288 4 */ > > int mnt_id; /* 292 4 */ > > int mnt_group_id; /* 296 4 */ > > int mnt_expiry_mark; /* 300 4 */ > > struct hlist_head mnt_pins; /* 304 8 */ > > struct hlist_head mnt_stuck_children; /* 312 8 */ > > > > /* size: 320, cachelines: 5, members: 27 */ > > /* forced alignments: 1 */ > > } __attribute__((__aligned__(8))); > > > > ⬢[acme@toolbox boot]$ pahole --version > > v1.24 > > ⬢[acme@toolbox boot]$ > > > > And it even has BTF info, which makes processing much faster but without > > some attributes: > > > > ⬢[acme@toolbox boot]$ readelf -SW vmlinux-5.15.0-48-generic | grep -i btf > > [28] .BTF PROGBITS ffffffff8279d1e0 199d1e0 4ef6b2 00 A 0 0 1 > > [29] .BTF_ids PROGBITS ffffffff82c8c894 1e8c894 0005e8 00 A 0 0 1 > > ⬢[acme@toolbox boot]$ > > > > ⬢[acme@toolbox boot]$ pahole -F btf -C mount vmlinux-5.15.0-48-generic > > struct mount { > > struct hlist_node mnt_hash; /* 0 16 */ > > struct mount * mnt_parent; /* 16 8 */ > > struct dentry * mnt_mountpoint; /* 24 8 */ > > struct vfsmount mnt; /* 32 32 */ > > /* --- cacheline 1 boundary (64 bytes) --- */ > > union { > > struct callback_head mnt_rcu; /* 64 16 */ > > struct llist_node mnt_llist; /* 64 8 */ > > }; /* 64 16 */ > > struct mnt_pcp * mnt_pcp; /* 80 8 */ > > struct list_head mnt_mounts; /* 88 16 */ > > struct list_head mnt_child; /* 104 16 */ > > struct list_head mnt_instance; /* 120 16 */ > > /* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */ > > const char * mnt_devname; /* 136 8 */ > > struct list_head mnt_list; /* 144 16 */ > > struct list_head mnt_expire; /* 160 16 */ > > struct list_head mnt_share; /* 176 16 */ > > /* --- cacheline 3 boundary (192 bytes) --- */ > > struct list_head mnt_slave_list; /* 192 16 */ > > struct list_head mnt_slave; /* 208 16 */ > > struct mount * mnt_master; /* 224 8 */ > > struct mnt_namespace * mnt_ns; /* 232 8 */ > > struct mountpoint * mnt_mp; /* 240 8 */ > > union { > > struct hlist_node mnt_mp_list; /* 248 16 */ > > struct hlist_node mnt_umount; /* 248 16 */ > > }; /* 248 16 */ > > /* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */ > > struct list_head mnt_umounting; /* 264 16 */ > > struct fsnotify_mark_connector * mnt_fsnotify_marks; /* 280 8 */ > > __u32 mnt_fsnotify_mask; /* 288 4 */ > > int mnt_id; /* 292 4 */ > > int mnt_group_id; /* 296 4 */ > > int mnt_expiry_mark; /* 300 4 */ > > struct hlist_head mnt_pins; /* 304 8 */ > > struct hlist_head mnt_stuck_children; /* 312 8 */ > > > > /* size: 320, cachelines: 5, members: 27 */ > > }; > > > > ⬢[acme@toolbox boot]$ -- - Arnaldo ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-10-05 18:31 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-10-04 21:10 Ubuntu kernels and die__process: DW_TAG ... got INVALID! Bitweasil 2022-10-05 12:20 ` Arnaldo Carvalho de Melo 2022-10-05 16:59 ` Bitweasil 2022-10-05 18:31 ` Arnaldo Carvalho de Melo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox