import Oracle_OSS linuxptp-4.4-4.el9_8.1

This commit is contained in:
AlmaLinux RelEng Bot 2026-08-05 14:45:00 -04:00
parent 7fea844fc5
commit 3901a5c88a
4 changed files with 106 additions and 84 deletions

View File

@ -1,79 +0,0 @@
commit 4e172c83520852d41e5c2ec3ae324d50c42a0416
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date: Thu Aug 28 15:14:01 2025 +0200
ts2phc: Better handle missing pulses with multiple sinks.
The ts2phc_pps_sink_poll() function waits until it has collected pulses
for all active sinks, or a timeout of 2 seconds between events is
reached.
If a sink missed a pulse (e.g. after a port state change and switching
PPS signal direction in the external PPS mode) and the next pulse of
that sink came before pulses of the other sinks, it was mixed with
events of the previous pulse and the measured offset had an error of
1/rate seconds.
To avoid mixing events corresponding to different pulses, adjust the
poll() timeout so that it waits only up to a third of the pulse period
after the first received event.
(Rebased to 4.4)
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
diff --git a/ts2phc_pps_sink.c b/ts2phc_pps_sink.c
index 9076de9..72d8ea4 100644
--- a/ts2phc_pps_sink.c
+++ b/ts2phc_pps_sink.c
@@ -381,10 +381,11 @@ void ts2phc_pps_sink_cleanup(struct ts2phc_private *priv)
int ts2phc_pps_sink_poll(struct ts2phc_private *priv)
{
struct ts2phc_sink_array *polling_array = priv->polling_array;
+ bool first_poll = true, ignore_any = false;
bool all_sinks_have_events = false;
- bool ignore_any = false;
+ struct timespec first_ts = {0}, ts;
+ int cnt, timeout;
unsigned int i;
- int cnt;
for (i = 0; i < priv->n_sinks; i++)
polling_array->collected_events[i] = 0;
@@ -395,7 +396,22 @@ int ts2phc_pps_sink_poll(struct ts2phc_private *priv)
if (!is_running())
return 0;
- cnt = poll(polling_array->pfd, priv->n_sinks, 2000);
+ /*
+ * Collect only events within a third of the pulse period to
+ * avoid mixing events corresponding to different pulses.
+ */
+ if (first_poll) {
+ timeout = 2000;
+ } else {
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ timeout = 333;
+ timeout -= (ts.tv_sec - first_ts.tv_sec) * 1000 +
+ (ts.tv_nsec - first_ts.tv_nsec) / 1000000;
+ if (timeout < 0)
+ timeout = 0;
+ }
+
+ cnt = poll(polling_array->pfd, priv->n_sinks, timeout);
if (cnt < 0) {
if (errno == EINTR) {
return 0;
@@ -408,6 +424,11 @@ int ts2phc_pps_sink_poll(struct ts2phc_private *priv)
return 0;
}
+ if (first_poll) {
+ clock_gettime(CLOCK_MONOTONIC, &first_ts);
+ first_poll = false;
+ }
+
for (i = 0; i < priv->n_sinks; i++) {
if (polling_array->pfd[i].revents & POLLERR) {
sink = polling_array->sink[i];

View File

@ -73,3 +73,36 @@ index 7f945ac..1bb407c 100644
}
}
commit 84c2d7f4ef7c0ff9353909194ae03e5a09aa0a12
Author: Miroslav Lichvar (via linuxptp-devel Mailing List) <linuxptp-devel@lists.nwtime.org>
Date: Mon May 4 15:32:46 2026 +0200
port: Don't request sde on repeated link down event.
When the link goes down, request a state decision event only when the
link status actually changed (the same status can be received multiple
times due to unrelated events or refresh).
This fixes an infinite loop when the link is down and BMCA is set to
"noop" due to bmc_state_decision() copying the FAULTY state and
causing port_dispatch() to be called with EV_FAULT_DETECTED, which
triggers an rntl_link_status() call. The netlink response (with no
change in the link status) no longer forces a new state decision event.
Fixes: a1eae149f519 ("port: Refresh link status on faults.")
Reported-by: Martin Pecka <peckama2@fel.cvut.cz>
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
diff --git a/port.c b/port.c
index 90b0860..05aabea 100644
--- a/port.c
+++ b/port.c
@@ -3042,7 +3042,7 @@ void port_link_status(void *ctx, int linkup, int ts_index)
* A port going down can affect the BMCA result.
* Force a state decision event.
*/
- if (p->link_status & LINK_DOWN)
+ if (p->link_status & LINK_STATE_CHANGED && p->link_status & LINK_DOWN)
clock_set_sde(p->clock, 1);
}

View File

@ -0,0 +1,67 @@
commit bed9f4725de56c2c8518482105a11fb40bbec5df
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date: Tue Jun 23 14:54:43 2026 +0200
phc2sys: Don't reconfigure static domain.
When phc2sys is started without the -a and -O options, it creates a
single static domain and uses the pmc agent only to get the TAI-UTC
offset and watch for leap seconds without subscribing to the port state
changes.
If ptp4l stopped responding to pmc requests for a sufficiently long
interval for the pmc agent to time out (3 missed responses - 180
seconds), phc2sys logged "Lost connection to ptp4l #1" and stopped
synchronizing the sink clocks. It was stuck in this state even after ptp4l
started responding again. This was caused by the reconfiguration of the
domain, which sets the source clock to NULL when the pmc agent is not
getting updates.
Add a new parameter to do_loop() to indicate that the domain
configuration is fully static and disable the reconfiguration to avoid
unsetting the source clock. This fixes phc2sys to keep synchronizing the
clocks even when ptp4l is not responding.
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
diff --git a/phc2sys.c b/phc2sys.c
index 1269d18..ad24db9 100644
--- a/phc2sys.c
+++ b/phc2sys.c
@@ -845,7 +845,7 @@ static int update_domain_clocks(struct domain *domain)
return 0;
}
-static int do_loop(struct domain *domains, int n_domains)
+static int do_loop(struct domain *domains, int n_domains, int static_config)
{
int i, state_changed, prev_sub;
struct timespec interval;
@@ -890,7 +890,8 @@ static int do_loop(struct domain *domains, int n_domains)
}
if (state_changed) {
- reconfigure(domains, n_domains);
+ if (!static_config)
+ reconfigure(domains, n_domains);
state_changed = 0;
}
@@ -1535,7 +1536,7 @@ int main(int argc, char *argv[])
goto end;
}
- r = do_loop(domains, n_domains);
+ r = do_loop(domains, n_domains, 0);
goto end;
}
@@ -1601,7 +1602,7 @@ int main(int argc, char *argv[])
servo_sync_interval(dst->servo, 1.0);
r = do_pps_loop(&domains[0], dst, pps_fd);
} else {
- r = do_loop(&domains[0], 1);
+ r = do_loop(&domains[0], 1, 1);
}
end:

View File

@ -4,7 +4,7 @@
Name: linuxptp
Version: 4.4
Release: 4%{?dist}
Release: 4%{?dist}.1
Summary: PTP implementation for Linux
License: GPL-2.0-or-later
@ -43,8 +43,8 @@ Patch10: linuxptp-rtnlinit.patch
Patch11: linuxptp-unirecover.patch
# check for EL-specific kernels with vclock support
Patch12: linuxptp-vclock.patch
# handle missing pulses in ts2phc
Patch13: linuxptp-ppsmiss.patch
# fix phc2sys to not get stuck in static mode
Patch15: linuxptp-staticreconf.patch
BuildRequires: gcc gcc-c++ gnutls-devel make systemd
@ -127,8 +127,9 @@ PATH=..:$PATH ./run
%{_mandir}/man8/*.8*
%changelog
* Tue Sep 23 2025 Miroslav Lichvar <mlichvar@redhat.com> 4.4-4
- handle missing pulses in ts2phc (RHEL-112193)
* Wed Jul 01 2026 Miroslav Lichvar <mlichvar@redhat.com> 4.4-4.el9_8.1
- fix high CPU usage by ptp4l when link is down (RHEL-191410)
- fix phc2sys to not get stuck in static mode (RHEL-187949)
* Wed May 28 2025 Miroslav Lichvar <mlichvar@redhat.com> 4.4-3
- fix unicast server to recover after port fault (RHEL-93496)