
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>
111 lines
3.0 KiB
Diff
111 lines
3.0 KiB
Diff
From c20f9c9b992b7ecf0f5d2ac9f137b369352bbba2 Mon Sep 17 00:00:00 2001
|
|
From: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
Date: Mon, 7 Aug 2023 18:19:37 -0300
|
|
Subject: [PATCH 47/58] phc2sys without -w option.
|
|
|
|
Fix bad clock and pmc initialization when -w command argument
|
|
is not provided.
|
|
|
|
The pmc agent must be created and mapped to a clock source even
|
|
in cases the -w (wait for ptp4l) option is not used.
|
|
|
|
Test plan:
|
|
PASS: Verify phc2sys initializes without -w argument.
|
|
PASS: Verify phc2sys initializes with two ptp4l interfaces
|
|
configured.
|
|
|
|
Reviewed-by: Cole Walker <cole.walker@windriver.com>
|
|
Reviewed-by: Andre Fernando Zanella Kantek
|
|
<andrefernandozanella.kantek@windriver.com>
|
|
|
|
[commit 10fa27f5829787c15e9ae59c45703328ca4e644f upstream]
|
|
|
|
Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
---
|
|
phc2sys.c | 34 ++++++++++++++--------------------
|
|
1 file changed, 14 insertions(+), 20 deletions(-)
|
|
|
|
diff --git a/phc2sys.c b/phc2sys.c
|
|
index edc626f..065b7f0 100644
|
|
--- a/phc2sys.c
|
|
+++ b/phc2sys.c
|
|
@@ -2254,6 +2254,15 @@ int main(int argc, char *argv[])
|
|
if (priv.master == NULL) {
|
|
priv.master = src;
|
|
}
|
|
+ if (i > 0) {
|
|
+ node = pmc_agent_add(&priv, i);
|
|
+ if (!node)
|
|
+ goto end;
|
|
+ }
|
|
+ /* map clock to pmc agent node */
|
|
+ src->node = node;
|
|
+ pr_debug("pmc node index %d assigned to source interface %s",
|
|
+ node->index, src->device);
|
|
if (ha_enabled) {
|
|
src->ha_priority = config_get_int(cfg, src->device, "ha_priority");
|
|
}
|
|
@@ -2286,35 +2295,22 @@ int main(int argc, char *argv[])
|
|
r = -1;
|
|
|
|
if (wait_sync) {
|
|
- i = 0;
|
|
LIST_FOREACH(src, &priv.clocks, list) {
|
|
|
|
/* skip dst clock */
|
|
- if (src == dst) {
|
|
+ if (src->state == PS_MASTER)
|
|
continue;
|
|
- }
|
|
-
|
|
- if (i > 0) {
|
|
- node = pmc_agent_add(&priv, i);
|
|
- if (!node)
|
|
- goto end;
|
|
- }
|
|
|
|
/* uds local is formated '/var/run/phc2sys.<pid>.<source_interface>' */
|
|
snprintf(uds_local, sizeof(uds_local), "/var/run/phc2sys.%d.%s",
|
|
getpid(), src->device);
|
|
|
|
- if (init_pmc_node(cfg, node, uds_local,
|
|
+ if (init_pmc_node(cfg, src->node, uds_local,
|
|
phc2sys_recv_subscribed, &priv))
|
|
goto end;
|
|
|
|
- /* map clock to pmc agent node */
|
|
- src->node = node;
|
|
- pr_debug("pmc node index %d source clock %s initialized",
|
|
- node->index, src->device);
|
|
-
|
|
while (is_running()) {
|
|
- r = run_pmc_wait_sync(node, 1000);
|
|
+ r = run_pmc_wait_sync(src->node, 1000);
|
|
if (r < 0)
|
|
goto end;
|
|
if (r > 0)
|
|
@@ -2324,7 +2320,7 @@ int main(int argc, char *argv[])
|
|
}
|
|
|
|
if (!priv.forced_sync_offset) {
|
|
- r = pmc_agent_query_utc_offset(node, 1000);
|
|
+ r = pmc_agent_query_utc_offset(src->node, 1000);
|
|
if (r) {
|
|
pr_err("failed to get UTC offset");
|
|
goto end;
|
|
@@ -2334,10 +2330,8 @@ int main(int argc, char *argv[])
|
|
if (priv.forced_sync_offset ||
|
|
(src->clkid != CLOCK_REALTIME && dst->clkid != CLOCK_REALTIME) ||
|
|
src->clkid == CLOCK_INVALID) {
|
|
- pmc_agent_disable(node);
|
|
+ pmc_agent_disable(src->node);
|
|
}
|
|
-
|
|
- ++i;
|
|
}
|
|
|
|
if (ha_enabled && !priv.forced_source_clock) {
|
|
--
|
|
2.30.2
|
|
|