* [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).