
This change allows ts2phc to be configured to ignore timing updates that have a large offset spike in order to mitigate the resulting timing skew. In some circumstances on realtime systems with high CPU load, the timestamp consumed by ts2phc can be delayed in reaching ts2phc and results in the offset calculation attempting to speed the clock up by a large margin. This change causes ts2phc to ignore updates that would greatly skew the clock when ts2phc is already in a synchronized state. The global configuration option "max_phc_update_skip_cnt" is provided to allow users to specify how many consecutive offset spike incidents will be ignored before adjusting the clock. The default value is 120. The behaviour can be disabled by setting max_phc_update_skip_cnt to 0. This code is ported from a proposed upstream patch found here: https://sourceforge.net/p/linuxptp/mailman/message/44114092/ Test-plan: Pass: Verify linuxptp package build Pass: Deploy ts2phc binary and verify system time sync Pass: Manually trigger offset spike and verify that ts2phc maintains stable time sync Closes-bug: https://bugs.launchpad.net/starlingx/+bug/2059955 Change-Id: I13cd5c3440682ec9256e11449fe62d5fe28f66fa Signed-off-by: Cole Walker <cole.walker@windriver.com>
213 lines
6.9 KiB
Diff
213 lines
6.9 KiB
Diff
From 77a246c6d6a865f11fe2fac14cdc9fa2746a06a2 Mon Sep 17 00:00:00 2001
|
|
From: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
Date: Mon, 12 Jun 2023 14:47:36 -0300
|
|
Subject: [PATCH 15/58] pmc_agent: Rename pmc_node to something more
|
|
descriptive.
|
|
|
|
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
|
|
|
|
[commit bb6865cdf59572fcb09c11d549828269281c6841 upstream]
|
|
Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
---
|
|
phc2sys.c | 4 ++--
|
|
pmc_agent.c | 26 +++++++++++++-------------
|
|
pmc_agent.h | 26 +++++++++++++-------------
|
|
3 files changed, 28 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/phc2sys.c b/phc2sys.c
|
|
index 648ba61..74ee9d1 100644
|
|
--- a/phc2sys.c
|
|
+++ b/phc2sys.c
|
|
@@ -103,7 +103,7 @@ struct phc2sys_private {
|
|
int forced_sync_offset;
|
|
int kernel_leap;
|
|
int state_changed;
|
|
- struct pmc_node node;
|
|
+ struct pmc_agent node;
|
|
LIST_HEAD(port_head, port) ports;
|
|
LIST_HEAD(clock_head, clock) clocks;
|
|
LIST_HEAD(dst_clock_head, clock) dst_clocks;
|
|
@@ -813,7 +813,7 @@ static int clock_compute_state(struct phc2sys_private *priv,
|
|
#define node_to_phc2sys(node) \
|
|
container_of(node, struct phc2sys_private, node)
|
|
|
|
-static int phc2sys_recv_subscribed(struct pmc_node *node,
|
|
+static int phc2sys_recv_subscribed(struct pmc_agent *node,
|
|
struct ptp_message *msg, int excluded)
|
|
{
|
|
struct phc2sys_private *priv = node_to_phc2sys(node);
|
|
diff --git a/pmc_agent.c b/pmc_agent.c
|
|
index 774e94d..e83895c 100644
|
|
--- a/pmc_agent.c
|
|
+++ b/pmc_agent.c
|
|
@@ -32,7 +32,7 @@
|
|
* renewed.
|
|
*/
|
|
|
|
-static void send_subscription(struct pmc_node *node)
|
|
+static void send_subscription(struct pmc_agent *node)
|
|
{
|
|
struct subscribe_events_np sen;
|
|
|
|
@@ -42,7 +42,7 @@ static void send_subscription(struct pmc_node *node)
|
|
pmc_send_set_action(node->pmc, TLV_SUBSCRIBE_EVENTS_NP, &sen, sizeof(sen));
|
|
}
|
|
|
|
-static int check_clock_identity(struct pmc_node *node, struct ptp_message *msg)
|
|
+static int check_clock_identity(struct pmc_agent *node, struct ptp_message *msg)
|
|
{
|
|
if (!node->clock_identity_set)
|
|
return 1;
|
|
@@ -98,7 +98,7 @@ static int get_mgt_err_id(struct ptp_message *msg)
|
|
* -1: error reported by the other side
|
|
* -2: local error, fatal
|
|
*/
|
|
-static int run_pmc(struct pmc_node *node, int timeout, int ds_id,
|
|
+static int run_pmc(struct pmc_agent *node, int timeout, int ds_id,
|
|
struct ptp_message **msg)
|
|
{
|
|
#define N_FD 1
|
|
@@ -166,7 +166,7 @@ static int run_pmc(struct pmc_node *node, int timeout, int ds_id,
|
|
}
|
|
}
|
|
|
|
-int run_pmc_wait_sync(struct pmc_node *node, int timeout)
|
|
+int run_pmc_wait_sync(struct pmc_agent *node, int timeout)
|
|
{
|
|
struct ptp_message *msg;
|
|
Enumeration8 portState;
|
|
@@ -192,7 +192,7 @@ int run_pmc_wait_sync(struct pmc_node *node, int timeout)
|
|
}
|
|
}
|
|
|
|
-int run_pmc_get_utc_offset(struct pmc_node *node, int timeout)
|
|
+int run_pmc_get_utc_offset(struct pmc_agent *node, int timeout)
|
|
{
|
|
struct ptp_message *msg;
|
|
int res;
|
|
@@ -222,7 +222,7 @@ int run_pmc_get_utc_offset(struct pmc_node *node, int timeout)
|
|
return 1;
|
|
}
|
|
|
|
-int run_pmc_get_number_ports(struct pmc_node *node, int timeout)
|
|
+int run_pmc_get_number_ports(struct pmc_agent *node, int timeout)
|
|
{
|
|
struct ptp_message *msg;
|
|
int res;
|
|
@@ -238,7 +238,7 @@ int run_pmc_get_number_ports(struct pmc_node *node, int timeout)
|
|
return res;
|
|
}
|
|
|
|
-int run_pmc_subscribe(struct pmc_node *node, int timeout)
|
|
+int run_pmc_subscribe(struct pmc_agent *node, int timeout)
|
|
{
|
|
struct ptp_message *msg;
|
|
int res;
|
|
@@ -250,14 +250,14 @@ int run_pmc_subscribe(struct pmc_node *node, int timeout)
|
|
return 1;
|
|
}
|
|
|
|
-void run_pmc_events(struct pmc_node *node)
|
|
+void run_pmc_events(struct pmc_agent *node)
|
|
{
|
|
struct ptp_message *msg;
|
|
|
|
run_pmc(node, 0, -1, &msg);
|
|
}
|
|
|
|
-int run_pmc_port_properties(struct pmc_node *node, int timeout,
|
|
+int run_pmc_port_properties(struct pmc_agent *node, int timeout,
|
|
unsigned int port, int *state,
|
|
int *tstamping, char *iface)
|
|
{
|
|
@@ -294,7 +294,7 @@ out:
|
|
return res;
|
|
}
|
|
|
|
-int run_pmc_clock_identity(struct pmc_node *node, int timeout)
|
|
+int run_pmc_clock_identity(struct pmc_agent *node, int timeout)
|
|
{
|
|
struct ptp_message *msg;
|
|
struct defaultDS *dds;
|
|
@@ -313,7 +313,7 @@ int run_pmc_clock_identity(struct pmc_node *node, int timeout)
|
|
}
|
|
|
|
/* Returns: -1 in case of error, 0 otherwise */
|
|
-int update_pmc_node(struct pmc_node *node, int subscribe)
|
|
+int update_pmc_node(struct pmc_agent *node, int subscribe)
|
|
{
|
|
struct timespec tp;
|
|
uint64_t ts;
|
|
@@ -336,7 +336,7 @@ int update_pmc_node(struct pmc_node *node, int subscribe)
|
|
return 0;
|
|
}
|
|
|
|
-int init_pmc_node(struct config *cfg, struct pmc_node *node, const char *uds,
|
|
+int init_pmc_node(struct config *cfg, struct pmc_agent *node, const char *uds,
|
|
pmc_node_recv_subscribed_t *recv_subscribed)
|
|
{
|
|
node->pmc = pmc_create(cfg, TRANS_UDS, uds, 0,
|
|
@@ -351,7 +351,7 @@ int init_pmc_node(struct config *cfg, struct pmc_node *node, const char *uds,
|
|
return 0;
|
|
}
|
|
|
|
-void close_pmc_node(struct pmc_node *node)
|
|
+void close_pmc_node(struct pmc_agent *node)
|
|
{
|
|
if (!node->pmc)
|
|
return;
|
|
diff --git a/pmc_agent.h b/pmc_agent.h
|
|
index 90245b1..10ef4b5 100644
|
|
--- a/pmc_agent.h
|
|
+++ b/pmc_agent.h
|
|
@@ -24,13 +24,13 @@
|
|
|
|
#include "pmc_common.h"
|
|
|
|
-struct pmc_node;
|
|
+struct pmc_agent;
|
|
|
|
-typedef int pmc_node_recv_subscribed_t(struct pmc_node *node,
|
|
+typedef int pmc_node_recv_subscribed_t(struct pmc_agent *agent,
|
|
struct ptp_message *msg,
|
|
int excluded);
|
|
|
|
-struct pmc_node {
|
|
+struct pmc_agent {
|
|
struct pmc *pmc;
|
|
int pmc_ds_requested;
|
|
uint64_t pmc_last_update;
|
|
@@ -42,19 +42,19 @@ struct pmc_node {
|
|
pmc_node_recv_subscribed_t *recv_subscribed;
|
|
};
|
|
|
|
-int init_pmc_node(struct config *cfg, struct pmc_node *node, const char *uds,
|
|
+int init_pmc_node(struct config *cfg, struct pmc_agent *agent, const char *uds,
|
|
pmc_node_recv_subscribed_t *recv_subscribed);
|
|
-void close_pmc_node(struct pmc_node *node);
|
|
-int update_pmc_node(struct pmc_node *node, int subscribe);
|
|
-int run_pmc_subscribe(struct pmc_node *node, int timeout);
|
|
-int run_pmc_clock_identity(struct pmc_node *node, int timeout);
|
|
-int run_pmc_wait_sync(struct pmc_node *node, int timeout);
|
|
-int run_pmc_get_number_ports(struct pmc_node *node, int timeout);
|
|
-void run_pmc_events(struct pmc_node *node);
|
|
-int run_pmc_port_properties(struct pmc_node *node, int timeout,
|
|
+void close_pmc_node(struct pmc_agent *agent);
|
|
+int update_pmc_node(struct pmc_agent *agent, int subscribe);
|
|
+int run_pmc_subscribe(struct pmc_agent *agent, int timeout);
|
|
+int run_pmc_clock_identity(struct pmc_agent *agent, int timeout);
|
|
+int run_pmc_wait_sync(struct pmc_agent *agent, int timeout);
|
|
+int run_pmc_get_number_ports(struct pmc_agent *agent, int timeout);
|
|
+void run_pmc_events(struct pmc_agent *agent);
|
|
+int run_pmc_port_properties(struct pmc_agent *agent, int timeout,
|
|
unsigned int port, int *state,
|
|
int *tstamping, char *iface);
|
|
-int run_pmc_get_utc_offset(struct pmc_node *node, int timeout);
|
|
+int run_pmc_get_utc_offset(struct pmc_agent *agent, int timeout);
|
|
int get_mgt_id(struct ptp_message *msg);
|
|
void *get_mgt_data(struct ptp_message *msg);
|
|
|
|
--
|
|
2.30.2
|
|
|