netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info
@ 2024-09-09 15:13 Christophe ROULLIER
  2024-09-09 15:35 ` Richard Cochran
  0 siblings, 1 reply; 7+ messages in thread
From: Christophe ROULLIER @ 2024-09-09 15:13 UTC (permalink / raw)
  To: Rahul Rameshbabu
  Cc: netdev, David S. Miller, Jakub Kicinski, Shuah Khan,
	Richard Cochran, Maciek Machnikowski

Hi Rahul, All,

I'm facing regression using ptp in STM32 platform with kernel v6.6.

When I use ptp4l I have now an error message :

ptp4l[116.627]: config item (null).step_window is 0
PTP_CLOCK_GETCAPS: Inappropriate ioctl for device
ptp4l[116.627]: clock is not adjustable
failed to create a clock

This regression was introduced in kernel v6.3 by commit "ptp: Add 
.getmaxphase callback to ptp_clock_info" SHA1: 
c3b60ab7a4dff6e6e608e685b70ddc3d6b2aca81:

     Author: Rahul Rameshbabu rrameshbabu@nvidia.com  2023-06-12 23:14:56
     Committer: David S. Miller davem@davemloft.net  2023-06-20 10:02:33
     Parent: 3a9a9a6139286584d1199f555fa4f96f592a3217 (testptp: Add 
support for testing ptp_clock_info .adjphase callback)
     Child:  67ac72a599d833ff7d9b210186a66d46c13f0a18 (net/mlx5: Add 
.getmaxphase ptp_clock_info callback)
     Follows: v6.1-rc1
     Precedes: v6.6-rc7

     ptp: Add .getmaxphase callback to ptp_clock_info

     Enables advertisement of the maximum offset supported by the phase 
control
     functionality of PHCs. The callback is used to return an error if 
an offset
     not supported by the PHC is used in ADJ_OFFSET. The ioctls
     PTP_CLOCK_GETCAPS and PTP_CLOCK_GETCAPS2 now advertise the maximum 
offset a
     PHC's phase control functionality is capable of supporting. 
Introduce new
     sysfs node, max_phase_adjustment.

     Cc: Jakub Kicinski kuba@kernel.org
     Cc: Shuah Khan shuah@kernel.org
     Cc: Richard Cochran richardcochran@gmail.com
     Cc: Maciek Machnikowski maciek@machnikowski.net
     Signed-off-by: Rahul Rameshbabu rrameshbabu@nvidia.com
     Acked-by: Richard Cochran richardcochran@gmail.com
     Signed-off-by: David S. Miller davem@davemloft.net

Is it normal behavior ? If yes could you please tell me what we need to 
change/update in stmmac driver to be compliant with your modifications ?

Thanks for your help/feedback.

Regards,
Christophe.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info
  2024-09-09 15:13 [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info Christophe ROULLIER
@ 2024-09-09 15:35 ` Richard Cochran
  2024-09-10  6:49   ` Christophe ROULLIER
  0 siblings, 1 reply; 7+ messages in thread
From: Richard Cochran @ 2024-09-09 15:35 UTC (permalink / raw)
  To: Christophe ROULLIER
  Cc: Rahul Rameshbabu, netdev, David S. Miller, Jakub Kicinski,
	Shuah Khan, Maciek Machnikowski

On Mon, Sep 09, 2024 at 05:13:02PM +0200, Christophe ROULLIER wrote:
> Hi Rahul, All,
> 
> I'm facing regression using ptp in STM32 platform with kernel v6.6.
> 
> When I use ptp4l I have now an error message :
> 
> ptp4l[116.627]: config item (null).step_window is 0
> PTP_CLOCK_GETCAPS: Inappropriate ioctl for device

Strange.  The ptp4l code does simply:

	err = ioctl(fd, PTP_CLOCK_GETCAPS, caps);
	if (err)
		perror("PTP_CLOCK_GETCAPS");

But this kernel change...

> This regression was introduced in kernel v6.3 by commit "ptp: Add
> .getmaxphase callback to ptp_clock_info" SHA1:
> c3b60ab7a4dff6e6e608e685b70ddc3d6b2aca81:

...should not have changed the ioctl magic number:

diff --git a/include/uapi/linux/ptp_clock.h b/include/uapi/linux/ptp_clock.h
index 1d108d597f66d..05cc35fc94acf 100644
--- a/include/uapi/linux/ptp_clock.h
+++ b/include/uapi/linux/ptp_clock.h
@@ -95,7 +95,8 @@ struct ptp_clock_caps {
 	int cross_timestamping;
 	/* Whether the clock supports adjust phase */
 	int adjust_phase;
-	int rsv[12];   /* Reserved for future use. */
+	int max_phase_adj; /* Maximum phase adjustment in nanoseconds. */
+	int rsv[11];       /* Reserved for future use. */
 };

Maybe the compiler added or removed padding?  What compilers did you
use?

Thanks,
Richard





^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info
  2024-09-09 15:35 ` Richard Cochran
@ 2024-09-10  6:49   ` Christophe ROULLIER
  2024-09-11  4:14     ` Richard Cochran
  0 siblings, 1 reply; 7+ messages in thread
From: Christophe ROULLIER @ 2024-09-10  6:49 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Rahul Rameshbabu, netdev, David S. Miller, Jakub Kicinski,
	Shuah Khan, Maciek Machnikowski

Hi Richard,

On 9/9/24 17:35, Richard Cochran wrote:
> On Mon, Sep 09, 2024 at 05:13:02PM +0200, Christophe ROULLIER wrote:
>> Hi Rahul, All,
>>
>> I'm facing regression using ptp in STM32 platform with kernel v6.6.
>>
>> When I use ptp4l I have now an error message :
>>
>> ptp4l[116.627]: config item (null).step_window is 0
>> PTP_CLOCK_GETCAPS: Inappropriate ioctl for device
> Strange.  The ptp4l code does simply:
>
> 	err = ioctl(fd, PTP_CLOCK_GETCAPS, caps);
> 	if (err)
> 		perror("PTP_CLOCK_GETCAPS");
>
> But this kernel change...
>
>> This regression was introduced in kernel v6.3 by commit "ptp: Add
>> .getmaxphase callback to ptp_clock_info" SHA1:
>> c3b60ab7a4dff6e6e608e685b70ddc3d6b2aca81:
> ...should not have changed the ioctl magic number:
>
> diff --git a/include/uapi/linux/ptp_clock.h b/include/uapi/linux/ptp_clock.h
> index 1d108d597f66d..05cc35fc94acf 100644
> --- a/include/uapi/linux/ptp_clock.h
> +++ b/include/uapi/linux/ptp_clock.h
> @@ -95,7 +95,8 @@ struct ptp_clock_caps {
>   	int cross_timestamping;
>   	/* Whether the clock supports adjust phase */
>   	int adjust_phase;
> -	int rsv[12];   /* Reserved for future use. */
> +	int max_phase_adj; /* Maximum phase adjustment in nanoseconds. */
> +	int rsv[11];       /* Reserved for future use. */
>   };
>
> Maybe the compiler added or removed padding?  What compilers did you
> use?

I've tested with platform 32bits and 64 bits and I have same error.

Toolchain/compiler used are:

aarch64-ostl-linux-gcc --version
aarch64-ostl-linux-gcc (GCC) 11.3.0
or

arm-ostl-linux-gnueabi-gcc --version
arm-ostl-linux-gnueabi-gcc (GCC) 12.2.0

Thanks,

Christophe

>
> Thanks,
> Richard
>
>
>
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info
  2024-09-10  6:49   ` Christophe ROULLIER
@ 2024-09-11  4:14     ` Richard Cochran
  2024-09-12 14:51       ` Christophe ROULLIER
  0 siblings, 1 reply; 7+ messages in thread
From: Richard Cochran @ 2024-09-11  4:14 UTC (permalink / raw)
  To: Christophe ROULLIER
  Cc: Rahul Rameshbabu, netdev, David S. Miller, Jakub Kicinski,
	Shuah Khan, Maciek Machnikowski

On Tue, Sep 10, 2024 at 08:49:57AM +0200, Christophe ROULLIER wrote:
> I've tested with platform 32bits and 64 bits and I have same error.
> 
> Toolchain/compiler used are:
> 
> aarch64-ostl-linux-gcc --version
> aarch64-ostl-linux-gcc (GCC) 11.3.0
> or
> 
> arm-ostl-linux-gnueabi-gcc --version
> arm-ostl-linux-gnueabi-gcc (GCC) 12.2.0

Something is off.

Can you run `pahole` on the ptp4l binaries that you are using, and
check the layout of `struct ptp_clock_caps` ?

It should look something like the ones below...

Thanks,
Richard

---
struct ptp_clock_caps1 {
        int                        max_adj;              /*     0     4 */
        int                        n_alarm;              /*     4     4 */
        int                        n_ext_ts;             /*     8     4 */
        int                        n_per_out;            /*    12     4 */
        int                        pps;                  /*    16     4 */
        int                        rsv[15];              /*    20    60 */

        /* size: 80, cachelines: 2, members: 6 */
        /* last cacheline: 16 bytes */
};
struct ptp_clock_caps2 {
        int                        max_adj;              /*     0     4 */
        int                        n_alarm;              /*     4     4 */
        int                        n_ext_ts;             /*     8     4 */
        int                        n_per_out;            /*    12     4 */
        int                        pps;                  /*    16     4 */
        int                        n_pins;               /*    20     4 */
        int                        cross_timestamping;   /*    24     4 */
        int                        adjust_phase;         /*    28     4 */
        int                        rsv[12];              /*    32    48 */

        /* size: 80, cachelines: 2, members: 9 */
        /* last cacheline: 16 bytes */
};
struct ptp_clock_caps3 {
        int                        max_adj;              /*     0     4 */
        int                        n_alarm;              /*     4     4 */
        int                        n_ext_ts;             /*     8     4 */
        int                        n_per_out;            /*    12     4 */
        int                        pps;                  /*    16     4 */
        int                        n_pins;               /*    20     4 */
        int                        cross_timestamping;   /*    24     4 */
        int                        adjust_phase;         /*    28     4 */
        int                        max_phase_adj;        /*    32     4 */
        int                        rsv[11];              /*    36    44 */

        /* size: 80, cachelines: 2, members: 10 */
        /* last cacheline: 16 bytes */
};

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info
  2024-09-11  4:14     ` Richard Cochran
@ 2024-09-12 14:51       ` Christophe ROULLIER
  2024-09-13  3:55         ` Richard Cochran
  0 siblings, 1 reply; 7+ messages in thread
From: Christophe ROULLIER @ 2024-09-12 14:51 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Rahul Rameshbabu, netdev, David S. Miller, Jakub Kicinski,
	Shuah Khan, Maciek Machnikowski

[-- Attachment #1: Type: text/plain, Size: 4262 bytes --]

Hi Richard,


I put in attachment result of pahole.

It is :

struct ptp_clock_caps {
     int                        max_adj;              /*     0 4 */
     int                        n_alarm;              /*     4 4 */
     int                        n_ext_ts;             /*     8 4 */
     int                        n_per_out;            /*    12 4 */
     int                        pps;                  /*    16 4 */
     int                        n_pins;               /*    20 4 */
     int                        cross_timestamping;   /*    24 4 */
     int                        adjust_phase;         /*    28 4 */
     int                        max_phase_adj;        /*    32 4 */
     int                        rsv[11];              /*    36 44 */

     /* size: 80, cachelines: 2, members: 10 */
     /* last cacheline: 16 bytes */
};

ptp4l used: ptp4l -v
4.1

Thanks,

BR

Christophe

On 9/11/24 06:14, Richard Cochran wrote:
> On Tue, Sep 10, 2024 at 08:49:57AM +0200, Christophe ROULLIER wrote:
>> I've tested with platform 32bits and 64 bits and I have same error.
>>
>> Toolchain/compiler used are:
>>
>> aarch64-ostl-linux-gcc --version
>> aarch64-ostl-linux-gcc (GCC) 11.3.0
>> or
>>
>> arm-ostl-linux-gnueabi-gcc --version
>> arm-ostl-linux-gnueabi-gcc (GCC) 12.2.0
> Something is off.
>
> Can you run `pahole` on the ptp4l binaries that you are using, and
> check the layout of `struct ptp_clock_caps` ?
>
> It should look something like the ones below...
>
> Thanks,
> Richard
>
> ---
> struct ptp_clock_caps1 {
>          int                        max_adj;              /*     0     4 */
>          int                        n_alarm;              /*     4     4 */
>          int                        n_ext_ts;             /*     8     4 */
>          int                        n_per_out;            /*    12     4 */
>          int                        pps;                  /*    16     4 */
>          int                        rsv[15];              /*    20    60 */
>
>          /* size: 80, cachelines: 2, members: 6 */
>          /* last cacheline: 16 bytes */
> };
> struct ptp_clock_caps2 {
>          int                        max_adj;              /*     0     4 */
>          int                        n_alarm;              /*     4     4 */
>          int                        n_ext_ts;             /*     8     4 */
>          int                        n_per_out;            /*    12     4 */
>          int                        pps;                  /*    16     4 */
>          int                        n_pins;               /*    20     4 */
>          int                        cross_timestamping;   /*    24     4 */
>          int                        adjust_phase;         /*    28     4 */
>          int                        rsv[12];              /*    32    48 */
>
>          /* size: 80, cachelines: 2, members: 9 */
>          /* last cacheline: 16 bytes */
> };
> struct ptp_clock_caps3 {
>          int                        max_adj;              /*     0     4 */
>          int                        n_alarm;              /*     4     4 */
>          int                        n_ext_ts;             /*     8     4 */
>          int                        n_per_out;            /*    12     4 */
>          int                        pps;                  /*    16     4 */
>          int                        n_pins;               /*    20     4 */
>          int                        cross_timestamping;   /*    24     4 */
>          int                        adjust_phase;         /*    28     4 */
>          int                        max_phase_adj;        /*    32     4 */
>          int                        rsv[11];              /*    36    44 */
>
>          /* size: 80, cachelines: 2, members: 10 */
>          /* last cacheline: 16 bytes */
> };

[-- Attachment #2: pahole_ptp4l_aarch64 --]
[-- Type: text/plain, Size: 98864 bytes --]

struct _IO_FILE {
	int                        _flags;               /*     0     4 */

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

	char *                     _IO_read_ptr;         /*     8     8 */
	char *                     _IO_read_end;         /*    16     8 */
	char *                     _IO_read_base;        /*    24     8 */
	char *                     _IO_write_base;       /*    32     8 */
	char *                     _IO_write_ptr;        /*    40     8 */
	char *                     _IO_write_end;        /*    48     8 */
	char *                     _IO_buf_base;         /*    56     8 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	char *                     _IO_buf_end;          /*    64     8 */
	char *                     _IO_save_base;        /*    72     8 */
	char *                     _IO_backup_base;      /*    80     8 */
	char *                     _IO_save_end;         /*    88     8 */
	struct _IO_marker *        _markers;             /*    96     8 */
	struct _IO_FILE *          _chain;               /*   104     8 */
	int                        _fileno;              /*   112     4 */
	int                        _flags2;              /*   116     4 */
	__off_t                    _old_offset;          /*   120     8 */
	/* --- cacheline 2 boundary (128 bytes) --- */
	short unsigned int         _cur_column;          /*   128     2 */
	signed char                _vtable_offset;       /*   130     1 */
	char                       _shortbuf[1];         /*   131     1 */

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

	_IO_lock_t *               _lock;                /*   136     8 */
	__off64_t                  _offset;              /*   144     8 */
	struct _IO_codecvt *       _codecvt;             /*   152     8 */
	struct _IO_wide_data *     _wide_data;           /*   160     8 */
	struct _IO_FILE *          _freeres_list;        /*   168     8 */
	void *                     _freeres_buf;         /*   176     8 */
	size_t                     __pad5;               /*   184     8 */
	/* --- cacheline 3 boundary (192 bytes) --- */
	int                        _mode;                /*   192     4 */
	char                       _unused2[20];         /*   196    20 */

	/* size: 216, cachelines: 4, members: 29 */
	/* sum members: 208, holes: 2, sum holes: 8 */
	/* last cacheline: 24 bytes */
};
struct ClockIdentity {
	Octet                      id[8];                /*     0     8 */

	/* size: 8, cachelines: 1, members: 1 */
	/* last cacheline: 8 bytes */
};
struct PortIdentity {
	struct ClockIdentity       clockIdentity;        /*     0     8 */
	UInteger16                 portNumber;           /*     8     2 */

	/* size: 10, cachelines: 1, members: 2 */
	/* last cacheline: 10 bytes */
};
struct option {
	const char  *              name;                 /*     0     8 */
	int                        has_arg;              /*     8     4 */

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

	int *                      flag;                 /*    16     8 */
	int                        val;                  /*    24     4 */

	/* size: 32, cachelines: 1, members: 4 */
	/* sum members: 24, holes: 1, sum holes: 4 */
	/* padding: 4 */
	/* last cacheline: 32 bytes */
};
struct sockaddr {
	sa_family_t                sa_family;            /*     0     2 */
	char                       sa_data[14];          /*     2    14 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct sockaddr_storage {
	sa_family_t                ss_family;            /*     0     2 */
	char                       __ss_padding[118];    /*     2   118 */
	/* --- cacheline 1 boundary (64 bytes) was 56 bytes ago --- */
	long unsigned int          __ss_align;           /*   120     8 */

	/* size: 128, cachelines: 2, members: 3 */
};
struct sockaddr_in {
	sa_family_t                sin_family;           /*     0     2 */
	in_port_t                  sin_port;             /*     2     2 */
	struct in_addr             sin_addr;             /*     4     4 */
	unsigned char              sin_zero[8];          /*     8     8 */

	/* size: 16, cachelines: 1, members: 4 */
	/* last cacheline: 16 bytes */
};
struct sockaddr_in6 {
	sa_family_t                sin6_family;          /*     0     2 */
	in_port_t                  sin6_port;            /*     2     2 */
	uint32_t                   sin6_flowinfo;        /*     4     4 */
	struct in6_addr            sin6_addr;            /*     8    16 */
	uint32_t                   sin6_scope_id;        /*    24     4 */

	/* size: 28, cachelines: 1, members: 5 */
	/* last cacheline: 28 bytes */
};
struct sockaddr_un {
	sa_family_t                sun_family;           /*     0     2 */
	char                       sun_path[108];        /*     2   108 */

	/* size: 110, cachelines: 2, members: 2 */
	/* last cacheline: 46 bytes */
};
struct in_addr {
	in_addr_t                  s_addr;               /*     0     4 */

	/* size: 4, cachelines: 1, members: 1 */
	/* last cacheline: 4 bytes */
};
struct in6_addr {
	union {
		uint8_t            __u6_addr8[16];       /*     0    16 */
		uint16_t           __u6_addr16[8];       /*     0    16 */
		uint32_t           __u6_addr32[4];       /*     0    16 */
	} __in6_u;                                       /*     0    16 */

	/* size: 16, cachelines: 1, members: 1 */
	/* last cacheline: 16 bytes */
};
struct sockaddr_ll {
	short unsigned int         sll_family;           /*     0     2 */
	short unsigned int         sll_protocol;         /*     2     2 */
	int                        sll_ifindex;          /*     4     4 */
	short unsigned int         sll_hatype;           /*     8     2 */
	unsigned char              sll_pkttype;          /*    10     1 */
	unsigned char              sll_halen;            /*    11     1 */
	unsigned char              sll_addr[8];          /*    12     8 */

	/* size: 20, cachelines: 1, members: 7 */
	/* last cacheline: 20 bytes */
};
struct address {
	socklen_t                  len;                  /*     0     4 */

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

	union {
		struct sockaddr_storage ss;              /*     8   128 */
		struct sockaddr_ll sll;                  /*     8    20 */
		struct sockaddr_in sin;                  /*     8    16 */
		struct sockaddr_in6 sin6;                /*     8    28 */
		struct sockaddr_un sun;                  /*     8   110 */
		struct sockaddr    sa;                   /*     8    16 */
	};                                               /*     8   128 */

	/* size: 136, cachelines: 3, members: 2 */
	/* sum members: 132, holes: 1, sum holes: 4 */
	/* last cacheline: 8 bytes */
};
struct unicast_master_address {
	struct {
		struct unicast_master_address * stqe_next; /*     0     8 */
	} list;                                          /*     0     8 */
	struct PortIdentity        portIdentity;         /*     8    10 */

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

	enum transport_type        type;                 /*    20     4 */
	enum unicast_state         state;                /*    24     4 */

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

	struct address             address;              /*    32   136 */
	/* --- cacheline 2 boundary (128 bytes) was 40 bytes ago --- */
	unsigned int               granted;              /*   168     4 */
	unsigned int               sydymsk;              /*   172     4 */
	time_t                     renewal_tmo;          /*   176     8 */

	/* size: 184, cachelines: 3, members: 8 */
	/* sum members: 178, holes: 2, sum holes: 6 */
	/* last cacheline: 56 bytes */
};
struct addrs_head {
	struct unicast_master_address * stqh_first;      /*     0     8 */
	struct unicast_master_address * * stqh_last;     /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct unicast_master_table {
	struct addrs_head          addrs;                /*     0    16 */
	struct {
		struct unicast_master_table * stqe_next; /*    16     8 */
	} list;                                          /*    16     8 */
	Integer8                   logQueryInterval;     /*    24     1 */

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

	int                        table_index;          /*    28     4 */
	int                        count;                /*    32     4 */
	int                        port;                 /*    36     4 */
	struct unicast_master_address peer_addr;         /*    40   184 */
	/* --- cacheline 3 boundary (192 bytes) was 32 bytes ago --- */
	char *                     peer_name;            /*   224     8 */

	/* size: 232, cachelines: 4, members: 8 */
	/* sum members: 229, holes: 1, sum holes: 3 */
	/* last cacheline: 40 bytes */
};
struct interfaces_head {
	struct interface *         stqh_first;           /*     0     8 */
	struct interface * *       stqh_last;            /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct ucmtab_head {
	struct unicast_master_table * stqh_first;        /*     0     8 */
	struct unicast_master_table * * stqh_last;       /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct config {
	struct interfaces_head     interfaces;           /*     0    16 */
	int                        n_interfaces;         /*    16     4 */

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

	struct option *            opts;                 /*    24     8 */
	struct hash *              htab;                 /*    32     8 */
	struct ucmtab_head         unicast_master_tables; /*    40    16 */

	/* size: 56, cachelines: 1, members: 5 */
	/* sum members: 52, holes: 1, sum holes: 4 */
	/* last cacheline: 56 bytes */
};
struct ClockQuality {
	UInteger8                  clockClass;           /*     0     1 */
	Enumeration8               clockAccuracy;        /*     1     1 */
	UInteger16                 offsetScaledLogVariance; /*     2     2 */

	/* size: 4, cachelines: 1, members: 3 */
	/* last cacheline: 4 bytes */
};
struct dataset {
	UInteger8                  priority1;            /*     0     1 */
	struct ClockIdentity       identity;             /*     1     8 */
	struct ClockQuality        quality;              /*     9     4 */
	UInteger8                  priority2;            /*    13     1 */
	UInteger8                  localPriority;        /*    14     1 */

	/* XXX 1 byte hole, try to pack */

	UInteger16                 stepsRemoved;         /*    16     2 */
	struct PortIdentity        sender;               /*    18    10 */
	struct PortIdentity        receiver;             /*    28    10 */

	/* size: 38, cachelines: 1, members: 8 */
	/* sum members: 37, holes: 1, sum holes: 1 */
	/* last cacheline: 38 bytes */
};
struct timespec {
	__time_t                   tv_sec;               /*     0     8 */
	__syscall_slong_t          tv_nsec;              /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct pollfd {
	int                        fd;                   /*     0     4 */
	short int                  events;               /*     4     2 */
	short int                  revents;              /*     6     2 */

	/* size: 8, cachelines: 1, members: 3 */
	/* last cacheline: 8 bytes */
};
struct Timestamp {
	uint16_t                   seconds_msb;          /*     0     2 */
	uint32_t                   seconds_lsb;          /*     2     4 */
	UInteger32                 nanoseconds;          /*     6     4 */

	/* size: 10, cachelines: 1, members: 3 */
	/* last cacheline: 10 bytes */
} __attribute__((__packed__));
struct timestamp {
	uint64_t                   sec;                  /*     0     8 */
	UInteger32                 nsec;                 /*     8     4 */

	/* size: 16, cachelines: 1, members: 2 */
	/* padding: 4 */
	/* last cacheline: 16 bytes */
};
struct PortAddress {
	Enumeration16              networkProtocol;      /*     0     2 */
	UInteger16                 addressLength;        /*     2     2 */
	Octet                      address[];            /*     4     0 */

	/* size: 4, cachelines: 1, members: 3 */
	/* last cacheline: 4 bytes */
};
struct PhysicalAddress {
	UInteger16                 length;               /*     0     2 */
	Octet                      address[];            /*     2     0 */

	/* size: 2, cachelines: 1, members: 2 */
	/* last cacheline: 2 bytes */
};
struct TLV {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Octet                      value[];              /*     4     0 */

	/* size: 4, cachelines: 1, members: 3 */
	/* last cacheline: 4 bytes */
};
struct PTPText {
	UInteger8                  length;               /*     0     1 */
	Octet                      text[];               /*     1     0 */

	/* size: 1, cachelines: 1, members: 2 */
	/* last cacheline: 1 bytes */
};
struct static_ptp_text {
	Octet                      text[256];            /*     0   256 */
	/* --- cacheline 4 boundary (256 bytes) --- */
	int                        length;               /*   256     4 */
	int                        max_symbols;          /*   260     4 */

	/* size: 264, cachelines: 5, members: 3 */
	/* last cacheline: 8 bytes */
};
struct fault_interval {
	enum fault_tmo_type        type;                 /*     0     4 */
	int32_t                    val;                  /*     4     4 */

	/* size: 8, cachelines: 1, members: 2 */
	/* last cacheline: 8 bytes */
};
struct defaultDS {
	UInteger8                  flags;                /*     0     1 */
	UInteger8                  reserved1;            /*     1     1 */
	UInteger16                 numberPorts;          /*     2     2 */
	UInteger8                  priority1;            /*     4     1 */
	struct ClockQuality        clockQuality;         /*     5     4 */
	UInteger8                  priority2;            /*     9     1 */
	struct ClockIdentity       clockIdentity;        /*    10     8 */
	UInteger8                  domainNumber;         /*    18     1 */
	UInteger8                  reserved2;            /*    19     1 */

	/* size: 20, cachelines: 1, members: 9 */
	/* last cacheline: 20 bytes */
} __attribute__((__packed__));
struct clock_description {
	struct static_ptp_text     productDescription;   /*     0   264 */
	/* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */
	struct static_ptp_text     revisionData;         /*   264   264 */
	/* --- cacheline 8 boundary (512 bytes) was 16 bytes ago --- */
	struct static_ptp_text     userDescription;      /*   528   264 */
	/* --- cacheline 12 boundary (768 bytes) was 24 bytes ago --- */
	Octet                      manufacturerIdentity[3]; /*   792     3 */

	/* size: 796, cachelines: 13, members: 4 */
	/* padding: 1 */
	/* last cacheline: 28 bytes */
};
struct currentDS {
	UInteger16                 stepsRemoved;         /*     0     2 */
	TimeInterval               offsetFromMaster;     /*     2     8 */
	TimeInterval               meanPathDelay;        /*    10     8 */

	/* size: 18, cachelines: 1, members: 3 */
	/* last cacheline: 18 bytes */
} __attribute__((__packed__));
struct parentDS {
	struct PortIdentity        parentPortIdentity;   /*     0    10 */
	UInteger8                  parentStats;          /*    10     1 */
	UInteger8                  reserved;             /*    11     1 */
	UInteger16                 observedParentOffsetScaledLogVariance; /*    12     2 */
	Integer32                  observedParentClockPhaseChangeRate; /*    14     4 */
	UInteger8                  grandmasterPriority1; /*    18     1 */
	struct ClockQuality        grandmasterClockQuality; /*    19     4 */
	UInteger8                  grandmasterPriority2; /*    23     1 */
	struct ClockIdentity       grandmasterIdentity;  /*    24     8 */

	/* size: 32, cachelines: 1, members: 9 */
	/* last cacheline: 32 bytes */
} __attribute__((__packed__));
struct parent_ds {
	struct parentDS            pds;                  /*     0    32 */
	struct ClockIdentity *     ptl;                  /*    32     8 */
	unsigned int               path_length;          /*    40     4 */

	/* size: 48, cachelines: 1, members: 3 */
	/* padding: 4 */
	/* last cacheline: 48 bytes */
};
struct timePropertiesDS {
	Integer16                  currentUtcOffset;     /*     0     2 */
	UInteger8                  flags;                /*     2     1 */
	Enumeration8               timeSource;           /*     3     1 */

	/* size: 4, cachelines: 1, members: 3 */
	/* last cacheline: 4 bytes */
};
struct fdarray {
	int                        fd[11];               /*     0    44 */

	/* size: 44, cachelines: 1, members: 1 */
	/* last cacheline: 44 bytes */
};
struct alternate_time_offset_indicator_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	UInteger8                  keyField;             /*     4     1 */
	Integer32                  currentOffset;        /*     5     4 */
	Integer32                  jumpSeconds;          /*     9     4 */
	struct {
		uint16_t           seconds_msb;          /*    13     2 */
		uint32_t           seconds_lsb;          /*    15     4 */
	} __attribute__((__packed__)) timeOfNextJump;    /*    13     6 */
	struct PTPText             displayName;          /*    19     1 */

	/* size: 20, cachelines: 1, members: 7 */
	/* last cacheline: 20 bytes */
} __attribute__((__packed__));
struct alternate_time_offset_name {
	UInteger8                  keyField;             /*     0     1 */
	struct PTPText             displayName;          /*     1     1 */

	/* size: 2, cachelines: 1, members: 2 */
	/* last cacheline: 2 bytes */
};
struct alternate_time_offset_properties {
	UInteger8                  keyField;             /*     0     1 */
	Integer32                  currentOffset;        /*     1     4 */
	Integer32                  jumpSeconds;          /*     5     4 */
	struct {
		uint16_t           seconds_msb;          /*     9     2 */
		uint32_t           seconds_lsb;          /*    11     4 */
	} __attribute__((__packed__)) timeOfNextJump;    /*     9     6 */
	uint8_t                    pad;                  /*    15     1 */

	/* size: 16, cachelines: 1, members: 5 */
	/* last cacheline: 16 bytes */
} __attribute__((__packed__));
struct management_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Enumeration16              id;                   /*     4     2 */
	Octet                      data[];               /*     6     0 */

	/* size: 6, cachelines: 1, members: 4 */
	/* last cacheline: 6 bytes */
};
struct management_tlv_datum {
	uint8_t                    val;                  /*     0     1 */
	uint8_t                    reserved;             /*     1     1 */

	/* size: 2, cachelines: 1, members: 2 */
	/* last cacheline: 2 bytes */
};
struct nsm_resp_tlv_foot {
	struct parentDS            parent;               /*     0    32 */
	struct currentDS           current;              /*    32    18 */
	struct timePropertiesDS    timeprop;             /*    50     4 */
	struct Timestamp           lastsync;             /*    54    10 */

	/* size: 64, cachelines: 1, members: 4 */
} __attribute__((__packed__));
struct Integer96 {
	uint16_t                   nanoseconds_msb;      /*     0     2 */
	uint64_t                   nanoseconds_lsb;      /*     2     8 */
	uint16_t                   fractional_nanoseconds; /*    10     2 */

	/* size: 12, cachelines: 1, members: 3 */
	/* last cacheline: 12 bytes */
} __attribute__((__packed__));
struct follow_up_info_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Octet                      id[3];                /*     4     3 */
	Octet                      subtype[3];           /*     7     3 */
	Integer32                  cumulativeScaledRateOffset; /*    10     4 */
	UInteger16                 gmTimeBaseIndicator;  /*    14     2 */
	ScaledNs                   lastGmPhaseChange;    /*    16    12 */
	Integer32                  scaledLastGmPhaseChange; /*    28     4 */

	/* size: 32, cachelines: 1, members: 8 */
	/* last cacheline: 32 bytes */
} __attribute__((__packed__));
struct time_status_np {
	int64_t                    master_offset;        /*     0     8 */
	int64_t                    ingress_time;         /*     8     8 */
	Integer32                  cumulativeScaledRateOffset; /*    16     4 */
	Integer32                  scaledLastGmPhaseChange; /*    20     4 */
	UInteger16                 gmTimeBaseIndicator;  /*    24     2 */
	ScaledNs                   lastGmPhaseChange;    /*    26    12 */
	Integer32                  gmPresent;            /*    38     4 */
	struct ClockIdentity       gmIdentity;           /*    42     8 */

	/* size: 50, cachelines: 1, members: 8 */
	/* last cacheline: 50 bytes */
} __attribute__((__packed__));
struct grandmaster_settings_np {
	struct ClockQuality        clockQuality;         /*     0     4 */
	Integer16                  utc_offset;           /*     4     2 */
	UInteger8                  time_flags;           /*     6     1 */
	Enumeration8               time_source;          /*     7     1 */

	/* size: 8, cachelines: 1, members: 4 */
	/* last cacheline: 8 bytes */
};
struct subscribe_events_np {
	uint16_t                   duration;             /*     0     2 */
	uint8_t                    bitmask[64];          /*     2    64 */

	/* size: 66, cachelines: 2, members: 2 */
	/* last cacheline: 2 bytes */
};
struct mgmt_clock_description {
	UInteger16 *               clockType;            /*     0     8 */
	struct PTPText *           physicalLayerProtocol; /*     8     8 */
	struct PhysicalAddress *   physicalAddress;      /*    16     8 */
	struct PortAddress *       protocolAddress;      /*    24     8 */
	Octet *                    manufacturerIdentity; /*    32     8 */
	struct PTPText *           productDescription;   /*    40     8 */
	struct PTPText *           revisionData;         /*    48     8 */
	struct PTPText *           userDescription;      /*    56     8 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	Octet *                    profileIdentity;      /*    64     8 */

	/* size: 72, cachelines: 2, members: 9 */
	/* last cacheline: 8 bytes */
};
struct tlv_extra {
	struct {
		struct tlv_extra * tqe_next;             /*     0     8 */
		struct tlv_extra * * tqe_prev;           /*     8     8 */
	} list;                                          /*     0    16 */
	struct TLV *               tlv;                  /*    16     8 */
	union {
		struct mgmt_clock_description cd;        /*    24    72 */
		struct nsm_resp_tlv_foot * foot;         /*    24     8 */
	};                                               /*    24    72 */

	/* size: 96, cachelines: 2, members: 3 */
	/* last cacheline: 32 bytes */
};
struct hw_timestamp {
	enum timestamp_type        type;                 /*     0     4 */

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

	tmv_t                      ts;                   /*     8     8 */
	tmv_t                      sw;                   /*    16     8 */

	/* size: 24, cachelines: 1, members: 3 */
	/* sum members: 20, holes: 1, sum holes: 4 */
	/* last cacheline: 24 bytes */
};
struct ptp_header {
	uint8_t                    tsmt;                 /*     0     1 */
	uint8_t                    ver;                  /*     1     1 */
	UInteger16                 messageLength;        /*     2     2 */
	UInteger8                  domainNumber;         /*     4     1 */
	Octet                      reserved1;            /*     5     1 */
	Octet                      flagField[2];         /*     6     2 */
	Integer64                  correction;           /*     8     8 */
	UInteger32                 reserved2;            /*    16     4 */
	struct PortIdentity        sourcePortIdentity;   /*    20    10 */
	UInteger16                 sequenceId;           /*    30     2 */
	UInteger8                  control;              /*    32     1 */
	Integer8                   logMessageInterval;   /*    33     1 */

	/* size: 34, cachelines: 1, members: 12 */
	/* last cacheline: 34 bytes */
} __attribute__((__packed__));
struct announce_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct Timestamp           originTimestamp;      /*    34    10 */
	Integer16                  currentUtcOffset;     /*    44     2 */
	Octet                      reserved;             /*    46     1 */
	UInteger8                  grandmasterPriority1; /*    47     1 */
	struct ClockQuality        grandmasterClockQuality; /*    48     4 */
	UInteger8                  grandmasterPriority2; /*    52     1 */
	struct ClockIdentity       grandmasterIdentity;  /*    53     8 */
	UInteger16                 stepsRemoved;         /*    61     2 */
	Enumeration8               timeSource;           /*    63     1 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	uint8_t                    suffix[];             /*    64     0 */

	/* size: 64, cachelines: 1, members: 11 */
} __attribute__((__packed__));
struct sync_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct Timestamp           originTimestamp;      /*    34    10 */
	uint8_t                    suffix[];             /*    44     0 */

	/* size: 44, cachelines: 1, members: 3 */
	/* last cacheline: 44 bytes */
} __attribute__((__packed__));
struct delay_req_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct Timestamp           originTimestamp;      /*    34    10 */
	uint8_t                    suffix[];             /*    44     0 */

	/* size: 44, cachelines: 1, members: 3 */
	/* last cacheline: 44 bytes */
} __attribute__((__packed__));
struct follow_up_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct Timestamp           preciseOriginTimestamp; /*    34    10 */
	uint8_t                    suffix[];             /*    44     0 */

	/* size: 44, cachelines: 1, members: 3 */
	/* last cacheline: 44 bytes */
} __attribute__((__packed__));
struct delay_resp_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct Timestamp           receiveTimestamp;     /*    34    10 */
	struct PortIdentity        requestingPortIdentity; /*    44    10 */
	uint8_t                    suffix[];             /*    54     0 */

	/* size: 54, cachelines: 1, members: 4 */
	/* last cacheline: 54 bytes */
} __attribute__((__packed__));
struct pdelay_req_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct Timestamp           originTimestamp;      /*    34    10 */
	struct PortIdentity        reserved;             /*    44    10 */
	uint8_t                    suffix[];             /*    54     0 */

	/* size: 54, cachelines: 1, members: 4 */
	/* last cacheline: 54 bytes */
} __attribute__((__packed__));
struct pdelay_resp_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct Timestamp           requestReceiptTimestamp; /*    34    10 */
	struct PortIdentity        requestingPortIdentity; /*    44    10 */
	uint8_t                    suffix[];             /*    54     0 */

	/* size: 54, cachelines: 1, members: 4 */
	/* last cacheline: 54 bytes */
} __attribute__((__packed__));
struct pdelay_resp_fup_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct Timestamp           responseOriginTimestamp; /*    34    10 */
	struct PortIdentity        requestingPortIdentity; /*    44    10 */
	uint8_t                    suffix[];             /*    54     0 */

	/* size: 54, cachelines: 1, members: 4 */
	/* last cacheline: 54 bytes */
} __attribute__((__packed__));
struct signaling_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct PortIdentity        targetPortIdentity;   /*    34    10 */
	uint8_t                    suffix[];             /*    44     0 */

	/* size: 44, cachelines: 1, members: 3 */
	/* last cacheline: 44 bytes */
} __attribute__((__packed__));
struct management_msg {
	struct ptp_header          hdr;                  /*     0    34 */
	struct PortIdentity        targetPortIdentity;   /*    34    10 */
	UInteger8                  startingBoundaryHops; /*    44     1 */
	UInteger8                  boundaryHops;         /*    45     1 */
	uint8_t                    flags;                /*    46     1 */
	uint8_t                    reserved;             /*    47     1 */
	uint8_t                    suffix[];             /*    48     0 */

	/* size: 48, cachelines: 1, members: 7 */
	/* last cacheline: 48 bytes */
};
struct message_data {
	uint8_t                    buffer[1500];         /*     0  1500 */

	/* size: 1500, cachelines: 24, members: 1 */
	/* last cacheline: 28 bytes */
};
struct ptp_message {
	union {
		struct ptp_header  header;               /*     0    34 */
		struct announce_msg announce;            /*     0    64 */
		struct sync_msg    sync;                 /*     0    44 */
		struct delay_req_msg delay_req;          /*     0    44 */
		struct follow_up_msg follow_up;          /*     0    44 */
		struct delay_resp_msg delay_resp;        /*     0    54 */
		struct pdelay_req_msg pdelay_req;        /*     0    54 */
		struct pdelay_resp_msg pdelay_resp;      /*     0    54 */
		struct pdelay_resp_fup_msg pdelay_resp_fup; /*     0    54 */
		struct signaling_msg signaling;          /*     0    44 */
		struct management_msg management;        /*     0    48 */
		struct message_data data;                /*     0  1500 */
	};                                               /*     0  1500 */
	/* --- cacheline 23 boundary (1472 bytes) was 28 bytes ago --- */
	int                        tail_room;            /*  1500     4 */
	int                        refcnt;               /*  1504     4 */

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

	struct {
		struct ptp_message * tqe_next;           /*  1512     8 */
		struct ptp_message * * tqe_prev;         /*  1520     8 */
	} list;                                          /*  1512    16 */
	struct {
		struct timestamp   pdu;                  /*  1528    16 */

		/* XXX last struct has 4 bytes of padding */

		/* --- cacheline 24 boundary (1536 bytes) was 8 bytes ago --- */
		struct timespec    host;                 /*  1544    16 */
	} ts;                                            /*  1528    32 */
	struct hw_timestamp        hwts;                 /*  1560    24 */
	struct address             address;              /*  1584   136 */
	/* --- cacheline 26 boundary (1664 bytes) was 56 bytes ago --- */
	struct tlv_list            tlv_list;             /*  1720    16 */

	/* size: 1736, cachelines: 28, members: 8 */
	/* sum members: 1732, holes: 1, sum holes: 4 */
	/* last cacheline: 8 bytes */
};
struct tlv_list {
	struct tlv_extra *         tqh_first;            /*     0     8 */
	struct tlv_extra * *       tqh_last;             /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct interface {
	struct {
		struct interface * stqe_next;            /*     0     8 */
	} list;                                          /*     0     8 */

	/* size: 8, cachelines: 1, members: 1 */
	/* last cacheline: 8 bytes */
};
struct foreign_clock {
	struct {
		struct foreign_clock * le_next;          /*     0     8 */
		struct foreign_clock * * le_prev;        /*     8     8 */
	} list;                                          /*     0    16 */
	struct messages            messages;             /*    16    16 */
	unsigned int               n_messages;           /*    32     4 */

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

	struct port *              port;                 /*    40     8 */
	struct dataset             dataset;              /*    48    38 */

	/* size: 88, cachelines: 2, members: 5 */
	/* sum members: 82, holes: 1, sum holes: 4 */
	/* padding: 2 */
	/* last cacheline: 24 bytes */
};
struct messages {
	struct ptp_message *       tqh_first;            /*     0     8 */
	struct ptp_message * *     tqh_last;             /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct port {
	struct {
		struct port *      le_next;              /*     0     8 */
		struct port * *    le_prev;              /*     8     8 */
	} list;                                          /*     0    16 */

	/* size: 16, cachelines: 1, members: 1 */
	/* last cacheline: 16 bytes */
};
struct stats_result {
	double                     min;                  /*     0     8 */
	double                     max;                  /*     8     8 */
	double                     max_abs;              /*    16     8 */
	double                     mean;                 /*    24     8 */
	double                     rms;                  /*    32     8 */
	double                     stddev;               /*    40     8 */

	/* size: 48, cachelines: 1, members: 6 */
	/* last cacheline: 48 bytes */
};
struct freq_estimator {
	tmv_t                      origin1;              /*     0     8 */
	tmv_t                      ingress1;             /*     8     8 */
	unsigned int               max_count;            /*    16     4 */
	unsigned int               count;                /*    20     4 */

	/* size: 24, cachelines: 1, members: 4 */
	/* last cacheline: 24 bytes */
};
struct clock_stats {
	struct stats *             offset;               /*     0     8 */
	struct stats *             freq;                 /*     8     8 */
	struct stats *             delay;                /*    16     8 */
	unsigned int               max_count;            /*    24     4 */

	/* size: 32, cachelines: 1, members: 4 */
	/* padding: 4 */
	/* last cacheline: 32 bytes */
};
struct clock_subscriber {
	struct {
		struct clock_subscriber * le_next;       /*     0     8 */
		struct clock_subscriber * * le_prev;     /*     8     8 */
	} list;                                          /*     0    16 */
	uint8_t                    events[64];           /*    16    64 */
	/* --- cacheline 1 boundary (64 bytes) was 16 bytes ago --- */
	struct PortIdentity        targetPortIdentity;   /*    80    10 */

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

	struct address             addr;                 /*    96   136 */
	/* --- cacheline 3 boundary (192 bytes) was 40 bytes ago --- */
	UInteger16                 sequenceId;           /*   232     2 */

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

	time_t                     expiration;           /*   240     8 */

	/* size: 248, cachelines: 4, members: 6 */
	/* sum members: 236, holes: 2, sum holes: 12 */
	/* last cacheline: 56 bytes */
};
struct time_zone {
	_Bool                      enabled;              /*     0     1 */

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

	int32_t                    current_offset;       /*     4     4 */
	int32_t                    jump_seconds;         /*     8     4 */
	uint16_t                   next_jump_msb;        /*    12     2 */

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

	uint32_t                   next_jump_lsb;        /*    16     4 */
	struct static_ptp_text     display_name;         /*    20   264 */

	/* size: 284, cachelines: 5, members: 6 */
	/* sum members: 279, holes: 2, sum holes: 5 */
	/* last cacheline: 28 bytes */
};
struct ports_head {
	struct port *              lh_first;             /*     0     8 */

	/* size: 8, cachelines: 1, members: 1 */
	/* last cacheline: 8 bytes */
};
struct clock_subscribers_head {
	struct clock_subscriber *  lh_first;             /*     0     8 */

	/* size: 8, cachelines: 1, members: 1 */
	/* last cacheline: 8 bytes */
};
struct clock {
	enum clock_type            type;                 /*     0     4 */

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

	struct config *            config;               /*     8     8 */
	clockid_t                  clkid;                /*    16     4 */

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

	struct servo *             servo;                /*    24     8 */
	enum servo_type            servo_type;           /*    32     4 */

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

	int                        (*dscmp)(struct dataset *, struct dataset *); /*    40     8 */
	struct defaultDS           dds;                  /*    48    20 */
	/* --- cacheline 1 boundary (64 bytes) was 4 bytes ago --- */
	struct dataset             default_dataset;      /*    68    38 */
	struct currentDS           cur;                  /*   106    18 */

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

	/* --- cacheline 2 boundary (128 bytes) --- */
	struct parent_ds           dad;                  /*   128    48 */

	/* XXX last struct has 4 bytes of padding */

	struct timePropertiesDS    tds;                  /*   176     4 */
	struct ClockIdentity       ptl[179];             /*   180  1432 */

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

	/* --- cacheline 25 boundary (1600 bytes) was 16 bytes ago --- */
	struct foreign_clock *     best;                 /*  1616     8 */
	struct ClockIdentity       best_id;              /*  1624     8 */
	struct ports_head          ports;                /*  1632     8 */
	struct port *              uds_rw_port;          /*  1640     8 */
	struct port *              uds_ro_port;          /*  1648     8 */
	struct pollfd *            pollfd;               /*  1656     8 */
	/* --- cacheline 26 boundary (1664 bytes) --- */
	int                        pollfd_valid;         /*  1664     4 */
	int                        nports;               /*  1668     4 */
	int                        last_port_number;     /*  1672     4 */
	int                        sde;                  /*  1676     4 */
	int                        free_running;         /*  1680     4 */
	int                        freq_est_interval;    /*  1684     4 */
	int                        local_sync_uncertain; /*  1688     4 */
	int                        write_phase_mode;     /*  1692     4 */
	int                        grand_master_capable; /*  1696     4 */
	int                        utc_timescale;        /*  1700     4 */
	int                        utc_offset_set;       /*  1704     4 */
	int                        leap_set;             /*  1708     4 */
	int                        kernel_leap;          /*  1712     4 */
	int                        utc_offset;           /*  1716     4 */
	int                        time_flags;           /*  1720     4 */
	int                        time_source;          /*  1724     4 */
	/* --- cacheline 27 boundary (1728 bytes) --- */
	UInteger8                  clock_class_threshold; /*  1728     1 */
	UInteger8                  max_steps_removed;    /*  1729     1 */

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

	enum servo_state           servo_state;          /*  1732     4 */
	enum timestamp_type        timestamping;         /*  1736     4 */

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

	tmv_t                      master_offset;        /*  1744     8 */
	tmv_t                      path_delay;           /*  1752     8 */
	tmv_t                      ingress_ts;           /*  1760     8 */
	tmv_t                      initial_delay;        /*  1768     8 */
	struct tsproc *            tsproc;               /*  1776     8 */
	struct freq_estimator      fest;                 /*  1784    24 */
	/* --- cacheline 28 boundary (1792 bytes) was 16 bytes ago --- */
	struct time_status_np      status;               /*  1808    50 */

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

	/* --- cacheline 29 boundary (1856 bytes) was 8 bytes ago --- */
	double                     master_local_rr;      /*  1864     8 */
	double                     nrr;                  /*  1872     8 */
	struct clock_description   desc;                 /*  1880   796 */

	/* XXX last struct has 1 byte of padding */
	/* XXX 4 bytes hole, try to pack */

	/* --- cacheline 41 boundary (2624 bytes) was 56 bytes ago --- */
	struct clock_stats         stats;                /*  2680    32 */

	/* XXX last struct has 4 bytes of padding */

	/* --- cacheline 42 boundary (2688 bytes) was 24 bytes ago --- */
	int                        stats_interval;       /*  2712     4 */

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

	struct clockcheck *        sanity_check;         /*  2720     8 */
	struct interface *         uds_rw_if;            /*  2728     8 */
	struct interface *         uds_ro_if;            /*  2736     8 */
	struct clock_subscribers_head subscribers;       /*  2744     8 */
	/* --- cacheline 43 boundary (2752 bytes) --- */
	struct monitor *           slave_event_monitor;  /*  2752     8 */
	int                        step_window_counter;  /*  2760     4 */
	int                        step_window;          /*  2764     4 */
	struct time_zone           tz[4];                /*  2768  1136 */

	/* size: 3904, cachelines: 61, members: 58 */
	/* sum members: 3864, holes: 10, sum holes: 40 */
	/* paddings: 3, sum paddings: 9 */
};
struct timeval {
	__time_t                   tv_sec;               /*     0     8 */
	__suseconds_t              tv_usec;              /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct timex {
	unsigned int               modes;                /*     0     4 */

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

	__syscall_slong_t          offset;               /*     8     8 */
	__syscall_slong_t          freq;                 /*    16     8 */
	__syscall_slong_t          maxerror;             /*    24     8 */
	__syscall_slong_t          esterror;             /*    32     8 */
	int                        status;               /*    40     4 */

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

	__syscall_slong_t          constant;             /*    48     8 */
	__syscall_slong_t          precision;            /*    56     8 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	__syscall_slong_t          tolerance;            /*    64     8 */
	struct timeval             time;                 /*    72    16 */
	__syscall_slong_t          tick;                 /*    88     8 */
	__syscall_slong_t          ppsfreq;              /*    96     8 */
	__syscall_slong_t          jitter;               /*   104     8 */
	int                        shift;                /*   112     4 */

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

	__syscall_slong_t          stabil;               /*   120     8 */
	/* --- cacheline 2 boundary (128 bytes) --- */
	__syscall_slong_t          jitcnt;               /*   128     8 */
	__syscall_slong_t          calcnt;               /*   136     8 */
	__syscall_slong_t          errcnt;               /*   144     8 */
	__syscall_slong_t          stbcnt;               /*   152     8 */
	int                        tai;                  /*   160     4 */

	/* Force padding: */
	int                        :32;
	int                        :32;
	int                        :32;
	int                        :32;
	int                        :32;
	int                        :32;
	int                        :32;
	int                        :32;
	int                        :32;
	int                        :32;
	int                        :32;

	/* size: 208, cachelines: 4, members: 20 */
	/* sum members: 152, holes: 3, sum holes: 12 */
	/* padding: 44 */
	/* last cacheline: 16 bytes */
};
struct clockcheck {
	int                        freq_limit;           /*     0     4 */
	int                        freq_known;           /*     4     4 */
	int                        current_freq;         /*     8     4 */
	int                        max_freq;             /*    12     4 */
	int                        min_freq;             /*    16     4 */

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

	uint64_t                   last_ts;              /*    24     8 */
	uint64_t                   last_mono_ts;         /*    32     8 */

	/* size: 40, cachelines: 1, members: 7 */
	/* sum members: 36, holes: 1, sum holes: 4 */
	/* last cacheline: 40 bytes */
};
struct config_enum {
	const char  *              label;                /*     0     8 */
	int                        value;                /*     8     4 */

	/* size: 16, cachelines: 1, members: 2 */
	/* padding: 4 */
	/* last cacheline: 16 bytes */
};
struct config_item {
	char                       label[64];            /*     0    64 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	enum config_type           type;                 /*    64     4 */

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

	struct config_enum *       tab;                  /*    72     8 */
	unsigned int               flags;                /*    80     4 */

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

	any_t                      val;                  /*    88     8 */
	any_t                      min;                  /*    96     8 */
	any_t                      max;                  /*   104     8 */

	/* size: 112, cachelines: 2, members: 7 */
	/* sum members: 104, holes: 2, sum holes: 8 */
	/* last cacheline: 48 bytes */
};
struct PortStats {
	uint64_t                   rxMsgType[16];        /*     0   128 */
	/* --- cacheline 2 boundary (128 bytes) --- */
	uint64_t                   txMsgType[16];        /*   128   128 */

	/* size: 256, cachelines: 4, members: 2 */
};
struct PortServiceStats {
	uint64_t                   announce_timeout;     /*     0     8 */
	uint64_t                   sync_timeout;         /*     8     8 */
	uint64_t                   delay_timeout;        /*    16     8 */
	uint64_t                   unicast_service_timeout; /*    24     8 */
	uint64_t                   unicast_request_timeout; /*    32     8 */
	uint64_t                   master_announce_timeout; /*    40     8 */
	uint64_t                   master_sync_timeout;  /*    48     8 */
	uint64_t                   qualification_timeout; /*    56     8 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	uint64_t                   sync_mismatch;        /*    64     8 */
	uint64_t                   followup_mismatch;    /*    72     8 */

	/* size: 80, cachelines: 2, members: 10 */
	/* last cacheline: 16 bytes */
};
struct port {
	struct {
		struct port *      le_next;              /*     0     8 */
		struct port * *    le_prev;              /*     8     8 */
	} list;                                          /*     0    16 */
	const char  *              name;                 /*    16     8 */
	char *                     log_name;             /*    24     8 */
	struct interface *         iface;                /*    32     8 */
	struct clock *             clock;                /*    40     8 */
	struct transport *         trp;                  /*    48     8 */
	enum timestamp_type        timestamping;         /*    56     4 */
	struct fdarray             fda;                  /*    60    44 */
	/* --- cacheline 1 boundary (64 bytes) was 40 bytes ago --- */
	int                        fault_fd;             /*   104     4 */
	int                        phc_index;            /*   108     4 */
	int                        phc_from_cmdline;     /*   112     4 */

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

	void                       (*dispatch)(struct port *, enum fsm_event, int); /*   120     8 */
	/* --- cacheline 2 boundary (128 bytes) --- */
	enum fsm_event             (*event)(struct port *, int); /*   128     8 */
	int                        jbod;                 /*   136     4 */

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

	struct foreign_clock *     best;                 /*   144     8 */
	enum syfu_state            syfu;                 /*   152     4 */

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

	struct ptp_message *       last_syncfup;         /*   160     8 */
	struct delay_req           delay_req;            /*   168    16 */
	struct ptp_message *       peer_delay_req;       /*   184     8 */
	/* --- cacheline 3 boundary (192 bytes) --- */
	struct ptp_message *       peer_delay_resp;      /*   192     8 */
	struct ptp_message *       peer_delay_fup;       /*   200     8 */
	int                        peer_portid_valid;    /*   208     4 */
	struct PortIdentity        peer_portid;          /*   212    10 */
	struct {
		UInteger16         announce;             /*   222     2 */
		UInteger16         delayreq;             /*   224     2 */
		UInteger16         signaling;            /*   226     2 */
		UInteger16         sync;                 /*   228     2 */
	} seqnum;                                        /*   222     8 */

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

	tmv_t                      peer_delay;           /*   232     8 */
	struct tsproc *            tsproc;               /*   240     8 */
	int                        log_sync_interval;    /*   248     4 */

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

	/* --- cacheline 4 boundary (256 bytes) --- */
	struct nrate_estimator     nrate;                /*   256    40 */

	/* XXX last struct has 4 bytes of padding */

	unsigned int               pdr_missing;          /*   296     4 */
	unsigned int               multiple_seq_pdr_count; /*   300     4 */
	unsigned int               multiple_pdr_detected; /*   304     4 */

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

	enum port_state            (*state_machine)(enum port_state, enum fsm_event, int); /*   312     8 */
	/* --- cacheline 5 boundary (320 bytes) --- */
	int                        bmca;                 /*   320     4 */
	int                        inhibit_announce;     /*   324     4 */
	int                        ignore_source_id;     /*   328     4 */
	int                        inhibit_delay_req;    /*   332     4 */
	struct PortIdentity        portIdentity;         /*   336    10 */

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

	enum port_state            state;                /*   348     4 */
	Integer64                  asymmetry;            /*   352     8 */
	enum as_capable            asCapable;            /*   360     4 */
	Integer8                   logMinDelayReqInterval; /*   364     1 */

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

	TimeInterval               peerMeanPathDelay;    /*   368     8 */
	Integer8                   initialLogAnnounceInterval; /*   376     1 */
	Integer8                   logAnnounceInterval;  /*   377     1 */
	UInteger8                  announceReceiptTimeout; /*   378     1 */

	/* XXX 1 byte hole, try to pack */

	int                        announce_span;        /*   380     4 */
	/* --- cacheline 6 boundary (384 bytes) --- */
	UInteger8                  syncReceiptTimeout;   /*   384     1 */
	UInteger8                  transportSpecific;    /*   385     1 */
	UInteger8                  localPriority;        /*   386     1 */
	Integer8                   initialLogSyncInterval; /*   387     1 */
	Integer8                   operLogSyncInterval;  /*   388     1 */
	Integer8                   logSyncInterval;      /*   389     1 */
	Enumeration8               delayMechanism;       /*   390     1 */
	Integer8                   logMinPdelayReqInterval; /*   391     1 */
	Integer8                   operLogPdelayReqInterval; /*   392     1 */
	Integer8                   logPdelayReqInterval; /*   393     1 */

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

	UInteger32                 neighborPropDelayThresh; /*   396     4 */
	int                        follow_up_info;       /*   400     4 */
	int                        freq_est_interval;    /*   404     4 */
	int                        hybrid_e2e;           /*   408     4 */
	int                        master_only;          /*   412     4 */
	int                        match_transport_specific; /*   416     4 */
	int                        msg_interval_request; /*   420     4 */
	int                        min_neighbor_prop_delay; /*   424     4 */
	int                        net_sync_monitor;     /*   428     4 */
	int                        path_trace_enabled;   /*   432     4 */
	int                        tc_spanning_tree;     /*   436     4 */
	Integer64                  rx_timestamp_offset;  /*   440     8 */
	/* --- cacheline 7 boundary (448 bytes) --- */
	Integer64                  tx_timestamp_offset;  /*   448     8 */
	int                        unicast_req_duration; /*   456     4 */
	enum link_state            link_status;          /*   460     4 */
	struct fault_interval      flt_interval_pertype[3]; /*   464    24 */
	enum fault_type            last_fault_type;      /*   488     4 */
	UInteger8                  versionNumber;        /*   492     1 */
	UInteger8                  delay_response_counter; /*   493     1 */
	UInteger8                  delay_response_timeout; /*   494     1 */
	_Bool                      iface_rate_tlv;       /*   495     1 */
	Integer64                  portAsymmetry;        /*   496     8 */
	struct PortStats           stats;                /*   504   256 */
	/* --- cacheline 11 boundary (704 bytes) was 56 bytes ago --- */
	struct PortServiceStats    service_stats;        /*   760    80 */
	/* --- cacheline 13 boundary (832 bytes) was 8 bytes ago --- */
	struct fm                  foreign_masters;      /*   840     8 */
	struct tct                 tc_transmitted;       /*   848    16 */
	struct ieee_c37_238_settings_np pwr;             /*   864    16 */
	struct unicast_master_table * unicast_master_table; /*   880     8 */
	struct unicast_service *   unicast_service;      /*   888     8 */
	/* --- cacheline 14 boundary (896 bytes) --- */
	int                        inhibit_multicast_service; /*   896     4 */

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

	struct monitor *           slave_event_monitor;  /*   904     8 */
	_Bool                      unicast_state_dirty;  /*   912     1 */

	/* size: 920, cachelines: 15, members: 88 */
	/* sum members: 879, holes: 11, sum holes: 34 */
	/* padding: 7 */
	/* paddings: 1, sum paddings: 4 */
	/* last cacheline: 24 bytes */
};
struct ieee_c37_238_settings_np {
	Enumeration16              version;              /*     0     2 */
	UInteger16                 grandmasterID;        /*     2     2 */
	UInteger32                 grandmasterTimeInaccuracy; /*     4     4 */
	UInteger32                 networkTimeInaccuracy; /*     8     4 */
	UInteger32                 totalTimeInaccuracy;  /*    12     4 */

	/* size: 16, cachelines: 1, members: 5 */
	/* last cacheline: 16 bytes */
};
struct nrate_estimator {
	double                     ratio;                /*     0     8 */
	tmv_t                      origin1;              /*     8     8 */
	tmv_t                      ingress1;             /*    16     8 */
	unsigned int               max_count;            /*    24     4 */
	unsigned int               count;                /*    28     4 */
	int                        ratio_valid;          /*    32     4 */

	/* size: 40, cachelines: 1, members: 6 */
	/* padding: 4 */
	/* last cacheline: 40 bytes */
};
struct tc_txd {
	struct {
		struct tc_txd *    tqe_next;             /*     0     8 */
		struct tc_txd * *  tqe_prev;             /*     8     8 */
	} list;                                          /*     0    16 */
	struct ptp_message *       msg;                  /*    16     8 */
	tmv_t                      residence;            /*    24     8 */
	int                        ingress_port;         /*    32     4 */

	/* size: 40, cachelines: 1, members: 4 */
	/* padding: 4 */
	/* last cacheline: 40 bytes */
};
struct delay_req {
	struct ptp_message *       tqh_first;            /*     0     8 */
	struct ptp_message * *     tqh_last;             /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct fm {
	struct foreign_clock *     lh_first;             /*     0     8 */

	/* size: 8, cachelines: 1, members: 1 */
	/* last cacheline: 8 bytes */
};
struct tct {
	struct tc_txd *            tqh_first;            /*     0     8 */
	struct tc_txd * *          tqh_last;             /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct filter {
	void                       (*destroy)(struct filter *); /*     0     8 */
	tmv_t                      (*sample)(struct filter *, tmv_t); /*     8     8 */
	void                       (*reset)(struct filter *); /*    16     8 */

	/* size: 24, cachelines: 1, members: 3 */
	/* last cacheline: 24 bytes */
};
struct mave {
	struct filter              filter;               /*     0    24 */
	int                        cnt;                  /*    24     4 */
	int                        len;                  /*    28     4 */
	int                        index;                /*    32     4 */

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

	tmv_t                      sum;                  /*    40     8 */
	tmv_t *                    val;                  /*    48     8 */

	/* size: 56, cachelines: 1, members: 6 */
	/* sum members: 52, holes: 1, sum holes: 4 */
	/* last cacheline: 56 bytes */
};
struct mmedian {
	struct filter              filter;               /*     0    24 */
	int                        cnt;                  /*    24     4 */
	int                        len;                  /*    28     4 */
	int                        index;                /*    32     4 */

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

	int *                      order;                /*    40     8 */
	tmv_t *                    samples;              /*    48     8 */

	/* size: 56, cachelines: 1, members: 6 */
	/* sum members: 52, holes: 1, sum holes: 4 */
	/* last cacheline: 56 bytes */
};
struct node {
	char *                     key;                  /*     0     8 */
	void *                     data;                 /*     8     8 */
	struct node *              next;                 /*    16     8 */

	/* size: 24, cachelines: 1, members: 3 */
	/* last cacheline: 24 bytes */
};
struct hash {
	struct node *              table[200];           /*     0  1600 */

	/* size: 1600, cachelines: 25, members: 1 */
};
struct sk_ts_info {
	int                        valid;                /*     0     4 */
	int                        phc_index;            /*     4     4 */
	unsigned int               so_timestamping;      /*     8     4 */
	unsigned int               tx_types;             /*    12     4 */
	unsigned int               rx_filters;           /*    16     4 */

	/* size: 20, cachelines: 1, members: 5 */
	/* last cacheline: 20 bytes */
};
struct sk_if_info {
	_Bool                      valid;                /*     0     1 */

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

	uint32_t                   speed;                /*     4     4 */
	uint64_t                   iface_bit_period;     /*     8     8 */

	/* size: 16, cachelines: 1, members: 3 */
	/* sum members: 13, holes: 1, sum holes: 3 */
	/* last cacheline: 16 bytes */
};
struct interface {
	struct {
		struct interface * stqe_next;            /*     0     8 */
	} list;                                          /*     0     8 */
	char                       name[109];            /*     8   109 */
	/* --- cacheline 1 boundary (64 bytes) was 53 bytes ago --- */
	char                       ts_label[109];        /*   117   109 */

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

	/* --- cacheline 3 boundary (192 bytes) was 36 bytes ago --- */
	struct sk_ts_info          ts_info;              /*   228    20 */
	struct sk_if_info          if_info;              /*   248    16 */
	/* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */
	int                        vclock;               /*   264     4 */

	/* size: 272, cachelines: 5, members: 6 */
	/* sum members: 266, holes: 1, sum holes: 2 */
	/* padding: 4 */
	/* last cacheline: 16 bytes */
};
struct slave_delay_timing_record {
	UInteger16                 sequenceId;           /*     0     2 */
	struct Timestamp           delayOriginTimestamp; /*     2    10 */
	TimeInterval               totalCorrectionField; /*    12     8 */
	struct Timestamp           delayResponseTimestamp; /*    20    10 */

	/* size: 30, cachelines: 1, members: 4 */
	/* last cacheline: 30 bytes */
} __attribute__((__packed__));
struct slave_delay_timing_data_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	struct PortIdentity        sourcePortIdentity;   /*     4    10 */
	struct slave_delay_timing_record record[];       /*    14     0 */

	/* size: 14, cachelines: 1, members: 4 */
	/* last cacheline: 14 bytes */
} __attribute__((__packed__));
struct slave_rx_sync_timing_record {
	UInteger16                 sequenceId;           /*     0     2 */
	struct Timestamp           syncOriginTimestamp;  /*     2    10 */
	TimeInterval               totalCorrectionField; /*    12     8 */
	Integer32                  scaledCumulativeRateOffset; /*    20     4 */
	struct Timestamp           syncEventIngressTimestamp; /*    24    10 */

	/* size: 34, cachelines: 1, members: 5 */
	/* last cacheline: 34 bytes */
} __attribute__((__packed__));
struct slave_rx_sync_timing_data_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	struct PortIdentity        sourcePortIdentity;   /*     4    10 */
	struct slave_rx_sync_timing_record record[];     /*    14     0 */

	/* size: 14, cachelines: 1, members: 4 */
	/* last cacheline: 14 bytes */
} __attribute__((__packed__));
struct monitor_message {
	struct ptp_message *       msg;                  /*     0     8 */
	int                        records_per_msg;      /*     8     4 */
	int                        count;                /*    12     4 */

	/* size: 16, cachelines: 1, members: 3 */
	/* last cacheline: 16 bytes */
};
struct monitor {
	struct port *              dst_port;             /*     0     8 */
	struct slave_rx_sync_timing_data_tlv * sync_tlv; /*     8     8 */
	struct slave_delay_timing_data_tlv * delay_tlv;  /*    16     8 */
	struct monitor_message     delay;                /*    24    16 */
	struct monitor_message     sync;                 /*    40    16 */

	/* size: 56, cachelines: 1, members: 5 */
	/* last cacheline: 56 bytes */
};
struct message_storage {
	unsigned char              reserved[24];         /*     0    24 */
	struct ptp_message         msg __attribute__((__aligned__(8))); /*    24  1736 */

	/* size: 1760, cachelines: 28, members: 2 */
	/* forced alignments: 1 */
	/* last cacheline: 32 bytes */
} __attribute__((__aligned__(8)));
struct msg_pool {
	struct ptp_message *       tqh_first;            /*     0     8 */
	struct ptp_message * *     tqh_last;             /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct ptp_clock_caps {
	int                        max_adj;              /*     0     4 */
	int                        n_alarm;              /*     4     4 */
	int                        n_ext_ts;             /*     8     4 */
	int                        n_per_out;            /*    12     4 */
	int                        pps;                  /*    16     4 */
	int                        n_pins;               /*    20     4 */
	int                        cross_timestamping;   /*    24     4 */
	int                        adjust_phase;         /*    28     4 */
	int                        max_phase_adj;        /*    32     4 */
	int                        rsv[11];              /*    36    44 */

	/* size: 80, cachelines: 2, members: 10 */
	/* last cacheline: 16 bytes */
};
struct ptp_pin_desc {
	char                       name[64];             /*     0    64 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	unsigned int               index;                /*    64     4 */
	unsigned int               func;                 /*    68     4 */
	unsigned int               chan;                 /*    72     4 */
	unsigned int               rsv[5];               /*    76    20 */

	/* size: 96, cachelines: 2, members: 5 */
	/* last cacheline: 32 bytes */
};
struct unicast_master_entry {
	struct PortIdentity        port_identity;        /*     0    10 */
	struct ClockQuality        clock_quality;        /*    10     4 */
	uint8_t                    selected;             /*    14     1 */
	Enumeration8               port_state;           /*    15     1 */
	UInteger8                  priority1;            /*    16     1 */
	UInteger8                  priority2;            /*    17     1 */
	struct PortAddress         address;              /*    18     4 */

	/* size: 22, cachelines: 1, members: 7 */
	/* last cacheline: 22 bytes */
};
struct itimerspec {
	struct timespec            it_interval;          /*     0    16 */
	struct timespec            it_value;             /*    16    16 */

	/* size: 32, cachelines: 1, members: 2 */
	/* last cacheline: 32 bytes */
};
struct portDS {
	struct PortIdentity        portIdentity;         /*     0    10 */
	Enumeration8               portState;            /*    10     1 */
	Integer8                   logMinDelayReqInterval; /*    11     1 */
	TimeInterval               peerMeanPathDelay;    /*    12     8 */
	Integer8                   logAnnounceInterval;  /*    20     1 */
	UInteger8                  announceReceiptTimeout; /*    21     1 */
	Integer8                   logSyncInterval;      /*    22     1 */
	Enumeration8               delayMechanism;       /*    23     1 */
	Integer8                   logMinPdelayReqInterval; /*    24     1 */
	UInteger8                  versionNumber;        /*    25     1 */

	/* size: 26, cachelines: 1, members: 10 */
	/* last cacheline: 26 bytes */
} __attribute__((__packed__));
struct management_error_status {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Enumeration16              error;                /*     4     2 */
	Enumeration16              id;                   /*     6     2 */
	Octet                      reserved[4];          /*     8     4 */
	Octet                      data[];               /*    12     0 */

	/* size: 12, cachelines: 1, members: 6 */
	/* last cacheline: 12 bytes */
};
struct nsm_resp_tlv_head {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	uint8_t                    port_state;           /*     4     1 */
	uint8_t                    reserved;             /*     5     1 */
	struct PortAddress         parent_addr;          /*     6     4 */

	/* size: 10, cachelines: 1, members: 5 */
	/* last cacheline: 10 bytes */
};
struct path_trace_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	struct ClockIdentity       cid[];                /*     4     0 */

	/* size: 4, cachelines: 1, members: 3 */
	/* last cacheline: 4 bytes */
};
struct ieee_c37_238_2011_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Octet                      id[3];                /*     4     3 */
	Octet                      subtype[3];           /*     7     3 */
	UInteger16                 grandmasterID;        /*    10     2 */
	UInteger32                 grandmasterTimeInaccuracy; /*    12     4 */
	UInteger32                 networkTimeInaccuracy; /*    16     4 */
	Octet                      pad[2];               /*    20     2 */

	/* size: 22, cachelines: 1, members: 8 */
	/* last cacheline: 22 bytes */
} __attribute__((__packed__));
struct ieee_c37_238_2017_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Octet                      id[3];                /*     4     3 */
	Octet                      subtype[3];           /*     7     3 */
	UInteger16                 grandmasterID;        /*    10     2 */
	UInteger32                 reserved1;            /*    12     4 */
	UInteger32                 totalTimeInaccuracy;  /*    16     4 */
	Octet                      pad[2];               /*    20     2 */

	/* size: 22, cachelines: 1, members: 8 */
	/* last cacheline: 22 bytes */
} __attribute__((__packed__));
struct port_ds_np {
	UInteger32                 neighborPropDelayThresh; /*     0     4 */
	Integer32                  asCapable;            /*     4     4 */

	/* size: 8, cachelines: 1, members: 2 */
	/* last cacheline: 8 bytes */
};
struct port_properties_np {
	struct PortIdentity        portIdentity;         /*     0    10 */
	uint8_t                    port_state;           /*    10     1 */
	uint8_t                    timestamping;         /*    11     1 */
	struct PTPText             interface;            /*    12     1 */

	/* size: 13, cachelines: 1, members: 4 */
	/* last cacheline: 13 bytes */
} __attribute__((__packed__));
struct port_hwclock_np {
	struct PortIdentity        portIdentity;         /*     0    10 */
	Integer32                  phc_index;            /*    10     4 */
	UInteger8                  flags;                /*    14     1 */
	uint8_t                    reserved;             /*    15     1 */

	/* size: 16, cachelines: 1, members: 4 */
	/* last cacheline: 16 bytes */
} __attribute__((__packed__));
struct port_stats_np {
	struct PortIdentity        portIdentity;         /*     0    10 */
	struct PortStats           stats;                /*    10   256 */

	/* size: 266, cachelines: 5, members: 2 */
	/* last cacheline: 10 bytes */
} __attribute__((__packed__));
struct port_service_stats_np {
	struct PortIdentity        portIdentity;         /*     0    10 */
	struct PortServiceStats    stats;                /*    10    80 */

	/* size: 90, cachelines: 2, members: 2 */
	/* last cacheline: 26 bytes */
} __attribute__((__packed__));
struct unicast_master_table_np {
	uint16_t                   actual_table_size;    /*     0     2 */
	struct unicast_master_entry unicast_masters[];   /*     2     0 */

	/* size: 2, cachelines: 1, members: 2 */
	/* last cacheline: 2 bytes */
};
struct organization_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Octet                      id[3];                /*     4     3 */
	Octet                      subtype[3];           /*     7     3 */

	/* size: 10, cachelines: 1, members: 4 */
	/* last cacheline: 10 bytes */
};
struct msg_interval_req_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Octet                      id[3];                /*     4     3 */
	Octet                      subtype[3];           /*     7     3 */
	Integer8                   linkDelayInterval;    /*    10     1 */
	Integer8                   timeSyncInterval;     /*    11     1 */
	Integer8                   announceInterval;     /*    12     1 */
	Octet                      flags;                /*    13     1 */
	Octet                      reserved[2];          /*    14     2 */

	/* size: 16, cachelines: 1, members: 9 */
	/* last cacheline: 16 bytes */
};
struct msg_interface_rate_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	Octet                      id[3];                /*     4     3 */
	Octet                      subtype[3];           /*     7     3 */
	UInteger64                 interfaceBitPeriod;   /*    10     8 */
	UInteger16                 numberOfBitsBeforeTimestamp; /*    18     2 */
	UInteger16                 numberOfBitsAfterTimestamp; /*    20     2 */

	/* size: 22, cachelines: 1, members: 7 */
	/* last cacheline: 22 bytes */
} __attribute__((__packed__));
struct pqueue {
	int                        len;                  /*     0     4 */
	int                        max;                  /*     4     4 */
	int                        (*cmp)(void *, void *); /*     8     8 */
	void * *                   data;                 /*    16     8 */

	/* size: 24, cachelines: 1, members: 4 */
	/* last cacheline: 24 bytes */
};
struct __va_list {
	void *                     __stack;              /*     0     8 */
	void *                     __gr_top;             /*     8     8 */
	void *                     __vr_top;             /*    16     8 */
	int                        __gr_offs;            /*    24     4 */
	int                        __vr_offs;            /*    28     4 */

	/* size: 32, cachelines: 1, members: 5 */
	/* last cacheline: 32 bytes */
};
struct iovec {
	void *                     iov_base;             /*     0     8 */
	size_t                     iov_len;              /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct msghdr {
	void *                     msg_name;             /*     0     8 */
	socklen_t                  msg_namelen;          /*     8     4 */

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

	struct iovec *             msg_iov;              /*    16     8 */
	size_t                     msg_iovlen;           /*    24     8 */
	void *                     msg_control;          /*    32     8 */
	size_t                     msg_controllen;       /*    40     8 */
	int                        msg_flags;            /*    48     4 */

	/* size: 56, cachelines: 1, members: 7 */
	/* sum members: 48, holes: 1, sum holes: 4 */
	/* padding: 4 */
	/* last cacheline: 56 bytes */
};
struct sockaddr_nl {
	__kernel_sa_family_t       nl_family;            /*     0     2 */
	short unsigned int         nl_pad;               /*     2     2 */
	__u32                      nl_pid;               /*     4     4 */
	__u32                      nl_groups;            /*     8     4 */

	/* size: 12, cachelines: 1, members: 4 */
	/* last cacheline: 12 bytes */
};
struct nlmsghdr {
	__u32                      nlmsg_len;            /*     0     4 */
	__u16                      nlmsg_type;           /*     4     2 */
	__u16                      nlmsg_flags;          /*     6     2 */
	__u32                      nlmsg_seq;            /*     8     4 */
	__u32                      nlmsg_pid;            /*    12     4 */

	/* size: 16, cachelines: 1, members: 5 */
	/* last cacheline: 16 bytes */
};
struct nlattr {
	__u16                      nla_len;              /*     0     2 */
	__u16                      nla_type;             /*     2     2 */

	/* size: 4, cachelines: 1, members: 2 */
	/* last cacheline: 4 bytes */
};
struct rtattr {
	short unsigned int         rta_len;              /*     0     2 */
	short unsigned int         rta_type;             /*     2     2 */

	/* size: 4, cachelines: 1, members: 2 */
	/* last cacheline: 4 bytes */
};
struct ifinfomsg {
	unsigned char              ifi_family;           /*     0     1 */
	unsigned char              __ifi_pad;            /*     1     1 */
	short unsigned int         ifi_type;             /*     2     2 */
	int                        ifi_index;            /*     4     4 */
	unsigned int               ifi_flags;            /*     8     4 */
	unsigned int               ifi_change;           /*    12     4 */

	/* size: 16, cachelines: 1, members: 6 */
	/* last cacheline: 16 bytes */
};
struct genlmsghdr {
	__u8                       cmd;                  /*     0     1 */
	__u8                       version;              /*     1     1 */
	__u16                      reserved;             /*     2     2 */

	/* size: 4, cachelines: 1, members: 3 */
	/* last cacheline: 4 bytes */
};
struct servo {
	double                     max_frequency;        /*     0     8 */
	double                     step_threshold;       /*     8     8 */
	double                     first_step_threshold; /*    16     8 */
	int                        first_update;         /*    24     4 */

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

	int64_t                    offset_threshold;     /*    32     8 */
	int                        num_offset_values;    /*    40     4 */
	int                        curr_offset_values;   /*    44     4 */
	void                       (*destroy)(struct servo *); /*    48     8 */
	double                     (*sample)(struct servo *, int64_t, uint64_t, double, enum servo_state *); /*    56     8 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	void                       (*sync_interval)(struct servo *, double); /*    64     8 */
	void                       (*reset)(struct servo *); /*    72     8 */
	double                     (*rate_ratio)(struct servo *); /*    80     8 */
	void                       (*leap)(struct servo *, int); /*    88     8 */

	/* size: 96, cachelines: 2, members: 13 */
	/* sum members: 92, holes: 1, sum holes: 4 */
	/* last cacheline: 32 bytes */
};
struct point {
	uint64_t                   x;                    /*     0     8 */
	uint64_t                   y;                    /*     8     8 */
	double                     w;                    /*    16     8 */

	/* size: 24, cachelines: 1, members: 3 */
	/* last cacheline: 24 bytes */
};
struct result {
	double                     slope;                /*     0     8 */
	double                     intercept;            /*     8     8 */
	double                     err;                  /*    16     8 */
	int                        err_updates;          /*    24     4 */

	/* size: 32, cachelines: 1, members: 4 */
	/* padding: 4 */
	/* last cacheline: 32 bytes */
};
struct linreg_servo {
	struct servo               servo;                /*     0    96 */
	/* --- cacheline 1 boundary (64 bytes) was 32 bytes ago --- */
	struct point               points[64];           /*    96  1536 */
	/* --- cacheline 25 boundary (1600 bytes) was 32 bytes ago --- */
	struct point               reference;            /*  1632    24 */
	unsigned int               num_points;           /*  1656     4 */
	unsigned int               last_point;           /*  1660     4 */
	/* --- cacheline 26 boundary (1664 bytes) --- */
	double                     x_remainder;          /*  1664     8 */
	uint64_t                   last_update;          /*  1672     8 */
	struct result              results[5];           /*  1680   160 */
	/* --- cacheline 28 boundary (1792 bytes) was 48 bytes ago --- */
	unsigned int               size;                 /*  1840     4 */

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

	double                     clock_freq;           /*  1848     8 */
	/* --- cacheline 29 boundary (1856 bytes) --- */
	double                     update_interval;      /*  1856     8 */
	double                     frequency_ratio;      /*  1864     8 */
	int                        leap;                 /*  1872     4 */

	/* size: 1880, cachelines: 30, members: 13 */
	/* sum members: 1872, holes: 1, sum holes: 4 */
	/* padding: 4 */
	/* last cacheline: 24 bytes */
};
struct shmTime {
	int                        mode;                 /*     0     4 */
	volatile int               count;                /*     4     4 */
	time_t                     clockTimeStampSec;    /*     8     8 */
	int                        clockTimeStampUSec;   /*    16     4 */

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

	time_t                     receiveTimeStampSec;  /*    24     8 */
	int                        receiveTimeStampUSec; /*    32     4 */
	int                        leap;                 /*    36     4 */
	int                        precision;            /*    40     4 */
	int                        nsamples;             /*    44     4 */
	volatile int               valid;                /*    48     4 */
	int                        clockTimeStampNSec;   /*    52     4 */
	int                        receiveTimeStampNSec; /*    56     4 */
	int                        dummy[8];             /*    60    32 */

	/* size: 96, cachelines: 2, members: 13 */
	/* sum members: 88, holes: 1, sum holes: 4 */
	/* padding: 4 */
	/* last cacheline: 32 bytes */
};
struct ntpshm_servo {
	struct servo               servo;                /*     0    96 */
	/* --- cacheline 1 boundary (64 bytes) was 32 bytes ago --- */
	struct shmTime *           shm;                  /*    96     8 */
	int                        leap;                 /*   104     4 */

	/* size: 112, cachelines: 2, members: 3 */
	/* padding: 4 */
	/* last cacheline: 48 bytes */
};
struct nullf_servo {
	struct servo               servo;                /*     0    96 */

	/* size: 96, cachelines: 2, members: 1 */
	/* last cacheline: 32 bytes */
};
struct pi_servo {
	struct servo               servo;                /*     0    96 */
	/* --- cacheline 1 boundary (64 bytes) was 32 bytes ago --- */
	int64_t                    offset[2];            /*    96    16 */
	uint64_t                   local[2];             /*   112    16 */
	/* --- cacheline 2 boundary (128 bytes) --- */
	double                     drift;                /*   128     8 */
	double                     kp;                   /*   136     8 */
	double                     ki;                   /*   144     8 */
	double                     last_freq;            /*   152     8 */
	int                        count;                /*   160     4 */

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

	double                     configured_pi_kp;     /*   168     8 */
	double                     configured_pi_ki;     /*   176     8 */
	double                     configured_pi_kp_scale; /*   184     8 */
	/* --- cacheline 3 boundary (192 bytes) --- */
	double                     configured_pi_kp_exponent; /*   192     8 */
	double                     configured_pi_kp_norm_max; /*   200     8 */
	double                     configured_pi_ki_scale; /*   208     8 */
	double                     configured_pi_ki_exponent; /*   216     8 */
	double                     configured_pi_ki_norm_max; /*   224     8 */

	/* size: 232, cachelines: 4, members: 16 */
	/* sum members: 228, holes: 1, sum holes: 4 */
	/* last cacheline: 40 bytes */
};
struct sock_sample {
	struct timeval             tv;                   /*     0    16 */
	double                     offset;               /*    16     8 */
	int                        pulse;                /*    24     4 */
	int                        leap;                 /*    28     4 */
	int                        _pad;                 /*    32     4 */
	int                        magic;                /*    36     4 */

	/* size: 40, cachelines: 1, members: 6 */
	/* last cacheline: 40 bytes */
};
struct sock_servo {
	struct servo               servo;                /*     0    96 */
	/* --- cacheline 1 boundary (64 bytes) was 32 bytes ago --- */
	int                        sock_fd;              /*    96     4 */
	int                        leap;                 /*   100     4 */

	/* size: 104, cachelines: 2, members: 3 */
	/* last cacheline: 40 bytes */
};
struct so_timestamping {
	int                        flags;                /*     0     4 */
	int                        bind_phc;             /*     4     4 */

	/* size: 8, cachelines: 1, members: 2 */
	/* last cacheline: 8 bytes */
};
struct hwtstamp_config {
	int                        flags;                /*     0     4 */
	int                        tx_type;              /*     4     4 */
	int                        rx_filter;            /*     8     4 */

	/* size: 12, cachelines: 1, members: 3 */
	/* last cacheline: 12 bytes */
};
struct ethtool_ts_info {
	__u32                      cmd;                  /*     0     4 */
	__u32                      so_timestamping;      /*     4     4 */
	__s32                      phc_index;            /*     8     4 */
	__u32                      tx_types;             /*    12     4 */
	__u32                      tx_reserved[3];       /*    16    12 */
	__u32                      rx_filters;           /*    28     4 */
	__u32                      rx_reserved[3];       /*    32    12 */

	/* size: 44, cachelines: 1, members: 7 */
	/* last cacheline: 44 bytes */
};
struct ethtool_link_settings {
	__u32                      cmd;                  /*     0     4 */
	__u32                      speed;                /*     4     4 */
	__u8                       duplex;               /*     8     1 */
	__u8                       port;                 /*     9     1 */
	__u8                       phy_address;          /*    10     1 */
	__u8                       autoneg;              /*    11     1 */
	__u8                       mdio_support;         /*    12     1 */
	__u8                       eth_tp_mdix;          /*    13     1 */
	__u8                       eth_tp_mdix_ctrl;     /*    14     1 */
	__s8                       link_mode_masks_nwords; /*    15     1 */
	__u8                       transceiver;          /*    16     1 */
	__u8                       master_slave_cfg;     /*    17     1 */
	__u8                       master_slave_state;   /*    18     1 */
	__u8                       rate_matching;        /*    19     1 */
	__u32                      reserved[7];          /*    20    28 */
	__u32                      link_mode_masks[];    /*    48     0 */

	/* size: 48, cachelines: 1, members: 16 */
	/* last cacheline: 48 bytes */
};
struct cmsghdr {
	size_t                     cmsg_len;             /*     0     8 */
	int                        cmsg_level;           /*     8     4 */
	int                        cmsg_type;            /*    12     4 */
	unsigned char              __cmsg_data[];        /*    16     0 */

	/* size: 16, cachelines: 1, members: 4 */
	/* last cacheline: 16 bytes */
};
struct ifmap {
	long unsigned int          mem_start;            /*     0     8 */
	long unsigned int          mem_end;              /*     8     8 */
	short unsigned int         base_addr;            /*    16     2 */
	unsigned char              irq;                  /*    18     1 */
	unsigned char              dma;                  /*    19     1 */
	unsigned char              port;                 /*    20     1 */

	/* size: 24, cachelines: 1, members: 6 */
	/* padding: 3 */
	/* last cacheline: 24 bytes */
};
struct ifreq {
	union {
		char               ifrn_name[16];        /*     0    16 */
	} ifr_ifrn;                                      /*     0    16 */
	union {
		struct sockaddr    ifru_addr;            /*    16    16 */
		struct sockaddr    ifru_dstaddr;         /*    16    16 */
		struct sockaddr    ifru_broadaddr;       /*    16    16 */
		struct sockaddr    ifru_netmask;         /*    16    16 */
		struct sockaddr    ifru_hwaddr;          /*    16    16 */
		short int          ifru_flags;           /*    16     2 */
		int                ifru_ivalue;          /*    16     4 */
		int                ifru_mtu;             /*    16     4 */
		struct ifmap       ifru_map;             /*    16    24 */
		char               ifru_slave[16];       /*    16    16 */
		char               ifru_newname[16];     /*    16    16 */
		__caddr_t          ifru_data;            /*    16     8 */
	} ifr_ifru;                                      /*    16    24 */

	/* size: 40, cachelines: 1, members: 2 */
	/* last cacheline: 40 bytes */
};
struct ifaddrs {
	struct ifaddrs *           ifa_next;             /*     0     8 */
	char *                     ifa_name;             /*     8     8 */
	unsigned int               ifa_flags;            /*    16     4 */

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

	struct sockaddr *          ifa_addr;             /*    24     8 */
	struct sockaddr *          ifa_netmask;          /*    32     8 */
	union {
		struct sockaddr *  ifu_broadaddr;        /*    40     8 */
		struct sockaddr *  ifu_dstaddr;          /*    40     8 */
	} ifa_ifu;                                       /*    40     8 */
	void *                     ifa_data;             /*    48     8 */

	/* size: 56, cachelines: 1, members: 7 */
	/* sum members: 52, holes: 1, sum holes: 4 */
	/* last cacheline: 56 bytes */
};
struct stats {
	unsigned int               num;                  /*     0     4 */

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

	double                     min;                  /*     8     8 */
	double                     max;                  /*    16     8 */
	double                     mean;                 /*    24     8 */
	double                     sum_sqr;              /*    32     8 */
	double                     sum_diff_sqr;         /*    40     8 */

	/* size: 48, cachelines: 1, members: 6 */
	/* sum members: 44, holes: 1, sum holes: 4 */
	/* last cacheline: 48 bytes */
};
struct tc_pool {
	struct tc_txd *            tqh_first;            /*     0     8 */
	struct tc_txd * *          tqh_last;             /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct sock_filter {
	__u16                      code;                 /*     0     2 */
	__u8                       jt;                   /*     2     1 */
	__u8                       jf;                   /*     3     1 */
	__u32                      k;                    /*     4     4 */

	/* size: 8, cachelines: 1, members: 4 */
	/* last cacheline: 8 bytes */
};
struct sock_fprog {
	short unsigned int         len;                  /*     0     2 */

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

	struct sock_filter *       filter;               /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* sum members: 10, holes: 1, sum holes: 6 */
	/* last cacheline: 16 bytes */
};
struct packet_mreq {
	int                        mr_ifindex;           /*     0     4 */
	short unsigned int         mr_type;              /*     4     2 */
	short unsigned int         mr_alen;              /*     6     2 */
	unsigned char              mr_address[8];        /*     8     8 */

	/* size: 16, cachelines: 1, members: 4 */
	/* last cacheline: 16 bytes */
};
struct eth_hdr {
	eth_addr                   dst;                  /*     0     6 */
	eth_addr                   src;                  /*     6     6 */
	uint16_t                   type;                 /*    12     2 */

	/* size: 14, cachelines: 1, members: 3 */
	/* last cacheline: 14 bytes */
};
struct transport {
	enum transport_type        type;                 /*     0     4 */

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

	struct config *            cfg;                  /*     8     8 */
	int                        (*close)(struct transport *, struct fdarray *); /*    16     8 */
	int                        (*open)(struct transport *, struct interface *, struct fdarray *, enum timestamp_type); /*    24     8 */
	int                        (*recv)(struct transport *, int, void *, int, struct address *, struct hw_timestamp *); /*    32     8 */
	int                        (*send)(struct transport *, struct fdarray *, enum transport_event, int, void *, int, struct address *, struct hw_timestamp *); /*    40     8 */
	void                       (*release)(struct transport *); /*    48     8 */
	int                        (*physical_addr)(struct transport *, uint8_t *); /*    56     8 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	int                        (*protocol_addr)(struct transport *, uint8_t *); /*    64     8 */

	/* size: 72, cachelines: 2, members: 9 */
	/* sum members: 68, holes: 1, sum holes: 4 */
	/* last cacheline: 8 bytes */
};
struct raw {
	struct transport           t;                    /*     0    72 */
	/* --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- */
	struct address             src_addr;             /*    72   136 */
	/* --- cacheline 3 boundary (192 bytes) was 16 bytes ago --- */
	struct address             ptp_addr;             /*   208   136 */
	/* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */
	struct address             p2p_addr;             /*   344   136 */
	/* --- cacheline 7 boundary (448 bytes) was 32 bytes ago --- */
	int                        vlan;                 /*   480     4 */

	/* size: 488, cachelines: 8, members: 5 */
	/* padding: 4 */
	/* last cacheline: 40 bytes */
};
struct ip_mreqn {
	struct in_addr             imr_multiaddr;        /*     0     4 */
	struct in_addr             imr_address;          /*     4     4 */
	int                        imr_ifindex;          /*     8     4 */

	/* size: 12, cachelines: 1, members: 3 */
	/* last cacheline: 12 bytes */
};
struct udp {
	struct transport           t;                    /*     0    72 */
	/* --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- */
	struct address             ip;                   /*    72   136 */
	/* --- cacheline 3 boundary (192 bytes) was 16 bytes ago --- */
	struct address             mac;                  /*   208   136 */

	/* size: 344, cachelines: 6, members: 3 */
	/* last cacheline: 24 bytes */
};
struct ipv6_mreq {
	struct in6_addr            ipv6mr_multiaddr;     /*     0    16 */
	unsigned int               ipv6mr_interface;     /*    16     4 */

	/* size: 20, cachelines: 1, members: 2 */
	/* last cacheline: 20 bytes */
};
struct udp6 {
	struct transport           t;                    /*     0    72 */
	/* --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- */
	int                        index;                /*    72     4 */

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

	struct address             ip;                   /*    80   136 */
	/* --- cacheline 3 boundary (192 bytes) was 24 bytes ago --- */
	struct address             mac;                  /*   216   136 */
	/* --- cacheline 5 boundary (320 bytes) was 32 bytes ago --- */
	struct in6_addr            mc6_addr[2];          /*   352    32 */

	/* size: 384, cachelines: 6, members: 5 */
	/* sum members: 380, holes: 1, sum holes: 4 */
};
struct uds {
	struct transport           t;                    /*     0    72 */
	/* --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- */
	struct address             address;              /*    72   136 */

	/* size: 208, cachelines: 4, members: 2 */
	/* last cacheline: 16 bytes */
};
struct ack_cancel_unicast_xmit_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	uint8_t                    message_type_flags;   /*     4     1 */
	uint8_t                    reserved;             /*     5     1 */

	/* size: 6, cachelines: 1, members: 4 */
	/* last cacheline: 6 bytes */
};
struct cancel_unicast_xmit_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	uint8_t                    message_type_flags;   /*     4     1 */
	uint8_t                    reserved;             /*     5     1 */

	/* size: 6, cachelines: 1, members: 4 */
	/* last cacheline: 6 bytes */
};
struct grant_unicast_xmit_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	uint8_t                    message_type;         /*     4     1 */
	Integer8                   logInterMessagePeriod; /*     5     1 */
	UInteger32                 durationField;        /*     6     4 */
	uint8_t                    reserved;             /*    10     1 */
	uint8_t                    flags;                /*    11     1 */

	/* size: 12, cachelines: 1, members: 7 */
	/* last cacheline: 12 bytes */
} __attribute__((__packed__));
struct request_unicast_xmit_tlv {
	Enumeration16              type;                 /*     0     2 */
	UInteger16                 length;               /*     2     2 */
	uint8_t                    message_type;         /*     4     1 */
	Integer8                   logInterMessagePeriod; /*     5     1 */
	UInteger32                 durationField;        /*     6     4 */

	/* size: 10, cachelines: 1, members: 5 */
	/* last cacheline: 10 bytes */
} __attribute__((__packed__));
struct tlv_pool {
	struct tlv_extra *         tqh_first;            /*     0     8 */
	struct tlv_extra * *       tqh_last;             /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct tsproc {
	enum tsproc_mode           mode;                 /*     0     4 */

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

	double                     clock_rate_ratio;     /*     8     8 */
	tmv_t                      t1;                   /*    16     8 */
	tmv_t                      t2;                   /*    24     8 */
	tmv_t                      t3;                   /*    32     8 */
	tmv_t                      t4;                   /*    40     8 */
	tmv_t                      filtered_delay;       /*    48     8 */
	int                        filtered_delay_valid; /*    56     4 */

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

	/* --- cacheline 1 boundary (64 bytes) --- */
	struct filter *            delay_filter;         /*    64     8 */

	/* size: 72, cachelines: 2, members: 9 */
	/* sum members: 64, holes: 2, sum holes: 8 */
	/* last cacheline: 8 bytes */
};
struct unicast_service {
	struct usi                 intervals;            /*     0     8 */
	struct pqueue *            queue;                /*     8     8 */

	/* size: 16, cachelines: 1, members: 2 */
	/* last cacheline: 16 bytes */
};
struct unicast_client_address {
	struct {
		struct unicast_client_address * le_next; /*     0     8 */
		struct unicast_client_address * * le_prev; /*     8     8 */
	} list;                                          /*     0    16 */
	struct PortIdentity        portIdentity;         /*    16    10 */
	struct {
		UInteger16         announce;             /*    26     2 */
		UInteger16         sync;                 /*    28     2 */
	} seqnum;                                        /*    26     4 */

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

	unsigned int               message_types;        /*    32     4 */

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

	struct address             addr;                 /*    40   136 */
	/* --- cacheline 2 boundary (128 bytes) was 48 bytes ago --- */
	time_t                     grant_tmo;            /*   176     8 */

	/* size: 184, cachelines: 3, members: 6 */
	/* sum members: 178, holes: 2, sum holes: 6 */
	/* last cacheline: 56 bytes */
};
struct uca {
	struct unicast_client_address * lh_first;        /*     0     8 */

	/* size: 8, cachelines: 1, members: 1 */
	/* last cacheline: 8 bytes */
};
struct unicast_service_interval {
	struct uca                 clients;              /*     0     8 */
	struct {
		struct unicast_service_interval * le_next; /*     8     8 */
		struct unicast_service_interval * * le_prev; /*    16     8 */
	} list;                                          /*     8    16 */
	struct timespec            incr;                 /*    24    16 */
	struct timespec            tmo;                  /*    40    16 */
	int                        log_period;           /*    56     4 */

	/* size: 64, cachelines: 1, members: 5 */
	/* padding: 4 */
};
struct usi {
	struct unicast_service_interval * lh_first;      /*     0     8 */

	/* size: 8, cachelines: 1, members: 1 */
	/* last cacheline: 8 bytes */
};

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info
  2024-09-12 14:51       ` Christophe ROULLIER
@ 2024-09-13  3:55         ` Richard Cochran
  2024-09-20  4:05           ` Rahul Rameshbabu
  0 siblings, 1 reply; 7+ messages in thread
From: Richard Cochran @ 2024-09-13  3:55 UTC (permalink / raw)
  To: Christophe ROULLIER
  Cc: Rahul Rameshbabu, netdev, David S. Miller, Jakub Kicinski,
	Shuah Khan, Maciek Machnikowski

On Thu, Sep 12, 2024 at 04:51:51PM +0200, Christophe ROULLIER wrote:
> Hi Richard,
> 
> 
> I put in attachment result of pahole.
> 
> It is :
> 
> struct ptp_clock_caps {
>     int                        max_adj;              /*     0 4 */
>     int                        n_alarm;              /*     4 4 */
>     int                        n_ext_ts;             /*     8 4 */
>     int                        n_per_out;            /*    12 4 */
>     int                        pps;                  /*    16 4 */
>     int                        n_pins;               /*    20 4 */
>     int                        cross_timestamping;   /*    24 4 */
>     int                        adjust_phase;         /*    28 4 */
>     int                        max_phase_adj;        /*    32 4 */
>     int                        rsv[11];              /*    36 44 */
> 
>     /* size: 80, cachelines: 2, members: 10 */
>     /* last cacheline: 16 bytes */
> };

Total size is 80 bytes.

As expected.

So I can't explain the error that you are seeing.

Sorry,
Richard


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info
  2024-09-13  3:55         ` Richard Cochran
@ 2024-09-20  4:05           ` Rahul Rameshbabu
  0 siblings, 0 replies; 7+ messages in thread
From: Rahul Rameshbabu @ 2024-09-20  4:05 UTC (permalink / raw)
  To: Christophe ROULLIER
  Cc: Richard Cochran, netdev, David S. Miller, Jakub Kicinski,
	Shuah Khan, Maciek Machnikowski

On Thu, 12 Sep, 2024 20:55:22 -0700 Richard Cochran <richardcochran@gmail.com> wrote:
> On Thu, Sep 12, 2024 at 04:51:51PM +0200, Christophe ROULLIER wrote:
>> Hi Richard,
>> 
>> 
>> I put in attachment result of pahole.
>> 
>> It is :
>> 
>> struct ptp_clock_caps {
>>     int                        max_adj;              /*     0 4 */
>>     int                        n_alarm;              /*     4 4 */
>>     int                        n_ext_ts;             /*     8 4 */
>>     int                        n_per_out;            /*    12 4 */
>>     int                        pps;                  /*    16 4 */
>>     int                        n_pins;               /*    20 4 */
>>     int                        cross_timestamping;   /*    24 4 */
>>     int                        adjust_phase;         /*    28 4 */
>>     int                        max_phase_adj;        /*    32 4 */
>>     int                        rsv[11];              /*    36 44 */
>> 
>>     /* size: 80, cachelines: 2, members: 10 */
>>     /* last cacheline: 16 bytes */
>> };
>
> Total size is 80 bytes.
>
> As expected.
>
> So I can't explain the error that you are seeing.

Could you share what kind of STM32 development board you are using (like
the model), the kernel config, and toolchain you are using to build the
kernel? I would be interested in trying to reproduce. Also could you run
pahole on the ptp kernel module, "/lib/modules/$(uname -r)/kernel/drivers/ptp/ptp.ko",
and check the size of struct ptp_clock_caps there? If it is compressed,
you will need to uncompress the kernel object.

I am having a hard time believing commit
c3b60ab7a4dff6e6e608e685b70ddc3d6b2aca81 is the fundamental culprit, but
more likely it exposes some other issue seen uniquely on armhf. My
theory is if you have another commit that changes struct ptp_clock_caps
and adds an additional used field in place of a rsv element, you would
experience the same issue.

I do not work on PTP professionally anymore, but I am interested in
looking into this.

-- 
Thanks,

Rahul Rameshbabu

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-09-20  4:05 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-09 15:13 [BUG] Regression with commit: ptp: Add .getmaxphase callback to ptp_clock_info Christophe ROULLIER
2024-09-09 15:35 ` Richard Cochran
2024-09-10  6:49   ` Christophe ROULLIER
2024-09-11  4:14     ` Richard Cochran
2024-09-12 14:51       ` Christophe ROULLIER
2024-09-13  3:55         ` Richard Cochran
2024-09-20  4:05           ` Rahul Rameshbabu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).