All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Bitweasil <bitweasil@cryptohaze.com>
Cc: dwarves@vger.kernel.org
Subject: Re: Ubuntu kernels and die__process: DW_TAG ... got INVALID!
Date: Wed, 5 Oct 2022 09:20:59 -0300	[thread overview]
Message-ID: <Yz12qzXbbGPzH2Bl@kernel.org> (raw)
In-Reply-To: <17a34291-e28c-b08d-cfec-d455c72c4c54@cryptohaze.com>

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]$

  reply	other threads:[~2022-10-05 12:21 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-04 21:10 Ubuntu kernels and die__process: DW_TAG ... got INVALID! Bitweasil
2022-10-05 12:20 ` Arnaldo Carvalho de Melo [this message]
2022-10-05 16:59   ` Bitweasil
2022-10-05 18:31     ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Yz12qzXbbGPzH2Bl@kernel.org \
    --to=acme@kernel.org \
    --cc=bitweasil@cryptohaze.com \
    --cc=dwarves@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.