Re: Ubuntu kernels and die__process: DW_TAG ... got INVALID!

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux