dwarves_fprintf: Print cacheline boundaries in multiple union members

In 'struct audit_context' we have an union that have member structs that
straddles cacheline boundaries, the existing logic was showing those
cacheline boundaries only for the first struct in the union where that
straddling took place, all the subsequent structs where straddling also
takes place were not showing it, the struct:

struct audit_context {
<SNIP>
	union {
		struct {
			int        nargs;                /*   824     4 */

			/* XXX 4 bytes hole, try to pack */

			/* --- cacheline 13 boundary (832 bytes) --- */
			long int   args[6];              /*   832    48 */
		} socketcall;                            /*   824    56 */
		struct {
			kuid_t     uid;                  /*   824     4 */
			kgid_t     gid;                  /*   828     4 */
			umode_t    mode;                 /*   832     2 */

			/* XXX 2 bytes hole, try to pack */

			u32        osid;                 /*   836     4 */
			int        has_perm;             /*   840     4 */
			uid_t      perm_uid;             /*   844     4 */
			gid_t      perm_gid;             /*   848     4 */
			umode_t    perm_mode;            /*   852     2 */

			/* XXX 2 bytes hole, try to pack */

			long unsigned int qbytes;        /*   856     8 */
		} ipc;                                   /*   824    40 */
		struct {
			mqd_t      mqdes;                /*   824     4 */

			/* XXX 4 bytes hole, try to pack */

			struct mq_attr mqstat;           /*   832    64 */
		} mq_getsetattr;                         /*   824    72 */
		struct {
			mqd_t      mqdes;                /*   824     4 */
			int        sigev_signo;          /*   828     4 */
		} mq_notify;                             /*   824     8 */
		struct {
			mqd_t      mqdes;                /*   824     4 */

			/* XXX 4 bytes hole, try to pack */

			size_t     msg_len;              /*   832     8 */
			unsigned int msg_prio;           /*   840     4 */

			/* XXX 4 bytes hole, try to pack */

			struct timespec64 abs_timeout;   /*   848    16 */
		} mq_sendrecv;                           /*   824    40 */
		struct {
			int        oflag;                /*   824     4 */
			umode_t    mode;                 /*   828     2 */

			/* XXX 2 bytes hole, try to pack */

			struct mq_attr attr;             /*   832    64 */
		} mq_open;                               /*   824    72 */
		struct {
			pid_t      pid;                  /*   824     4 */
			struct audit_cap_data cap;       /*   828    32 */
		} capset;                                /*   824    36 */
		struct {
			int        fd;                   /*   824     4 */
			int        flags;                /*   828     4 */
		} mmap;                                  /*   824     8 */
		struct {
			int        argc;                 /*   824     4 */
		} execve;                                /*   824     4 */
		struct {
			char *     name;                 /*   824     8 */
		} module;                                /*   824     8 */
	};                                               /*   824    72 */
	/* --- cacheline 14 boundary (896 bytes) --- */
	int                        fds[2];               /*   896     8 */
	struct audit_proctitle     proctitle;            /*   904    16 */

	/* size: 920, cachelines: 15, members: 46 */
	/* sum members: 912, holes: 2, sum holes: 8 */
	/* last cacheline: 24 bytes */
};

With this fix:

struct audit_context {
<SNIP>
	union {
		struct {
			int        nargs;                /*   824     4 */

			/* XXX 4 bytes hole, try to pack */

			/* --- cacheline 13 boundary (832 bytes) --- */
			long int   args[6];              /*   832    48 */
		} socketcall;                            /*   824    56 */
		struct {
			kuid_t     uid;                  /*   824     4 */
			kgid_t     gid;                  /*   828     4 */
			/* --- cacheline 13 boundary (832 bytes) --- */
			umode_t    mode;                 /*   832     2 */

			/* XXX 2 bytes hole, try to pack */

			u32        osid;                 /*   836     4 */
			int        has_perm;             /*   840     4 */
			uid_t      perm_uid;             /*   844     4 */
			gid_t      perm_gid;             /*   848     4 */
			umode_t    perm_mode;            /*   852     2 */

			/* XXX 2 bytes hole, try to pack */

			long unsigned int qbytes;        /*   856     8 */
		} ipc;                                   /*   824    40 */
		struct {
			mqd_t      mqdes;                /*   824     4 */

			/* XXX 4 bytes hole, try to pack */

			/* --- cacheline 13 boundary (832 bytes) --- */
			struct mq_attr mqstat;           /*   832    64 */
		} mq_getsetattr;                         /*   824    72 */
		struct {
			mqd_t      mqdes;                /*   824     4 */
			int        sigev_signo;          /*   828     4 */
		} mq_notify;                             /*   824     8 */
		struct {
			mqd_t      mqdes;                /*   824     4 */

			/* XXX 4 bytes hole, try to pack */

			/* --- cacheline 13 boundary (832 bytes) --- */
			size_t     msg_len;              /*   832     8 */
			unsigned int msg_prio;           /*   840     4 */

			/* XXX 4 bytes hole, try to pack */

			struct timespec64 abs_timeout;   /*   848    16 */
		} mq_sendrecv;                           /*   824    40 */
		struct {
			int        oflag;                /*   824     4 */
			umode_t    mode;                 /*   828     2 */

			/* XXX 2 bytes hole, try to pack */

			/* --- cacheline 13 boundary (832 bytes) --- */
			struct mq_attr attr;             /*   832    64 */
		} mq_open;                               /*   824    72 */
		struct {
			pid_t      pid;                  /*   824     4 */
			struct audit_cap_data cap;       /*   828    32 */
		} capset;                                /*   824    36 */
		struct {
			int        fd;                   /*   824     4 */
			int        flags;                /*   828     4 */
		} mmap;                                  /*   824     8 */
		struct {
			int        argc;                 /*   824     4 */
		} execve;                                /*   824     4 */
		struct {
			char *     name;                 /*   824     8 */
		} module;                                /*   824     8 */
	};                                               /*   824    72 */
	/* --- cacheline 14 boundary (896 bytes) --- */
	int                        fds[2];               /*   896     8 */
	struct audit_proctitle     proctitle;            /*   904    16 */

	/* size: 920, cachelines: 15, members: 46 */
	/* sum members: 912, holes: 2, sum holes: 8 */
	/* last cacheline: 24 bytes */
};

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 file changed