tpd and pds Depending upon system load, the read pmc call can timeout. When it happens the corresponding data set is reset, allowing the HA algorithm to switch over the current source. Although the read timeout is undesirable, the error message is misleading because the failure is mitigated. Downgrade the error message to notice to disable it in the default log level. Test Plan: PASS: Deploy T-BC with single PTP4L instance - Load system (stress -c 64 -m 5 -t 60) check user.log, phc2sys not showing the error message phc2sys: notice [1200995.017] phc-inst2 pmc agent index 0, timeout reading pmc tpd PASS: Deploy T-BC with single PTP4L instance - Adjust the log to debug level system ptp-instance-parameter-add phc-inst2 logging_level=7 - Load system (stress -c 64 -m 5 -t 60) check user.log, phc2sys eventually shows the error message phc2sys: notice [1215208.628] phc-inst2 pmc agent index 0, timeout reading pmc tpd PASS: Build linuxptp package Closes-Bug: 2132273 Change-Id: I3e05de4006c0e35b725178d9e56eaf8c72d52747 Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
88 lines
2.6 KiB
Diff
88 lines
2.6 KiB
Diff
From: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
Date: Mon, 12 Jun 2023 15:37:46 -0300
|
|
Subject: [PATCH 26/67] phc2sys: Fix null pointer de-reference in manual mode.
|
|
|
|
If both the -w and -O command line options are specified (or when
|
|
using -w when both source and destination clocks are PHCs), then
|
|
pointer to the PMC agent will be incorrectly freed.
|
|
|
|
Fix the segfault by introducing a method to "disable" the agent as was
|
|
done before the PMC agent code was introduced.
|
|
|
|
Unfortunately the resulting PMC agent API now has both create/destroy
|
|
and init/disable methods. This clunky arrangement can be cleaned up
|
|
later on, but it entails re-factoring the phc2sys program even more.
|
|
|
|
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
|
|
Fixes: 8266987 ("pmc_agent: Hide the implementation.")
|
|
|
|
[commit 68fd0b010e9761e3dc580026eb6f2366c7c8e82d upstream]
|
|
Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
---
|
|
phc2sys.c | 7 ++-----
|
|
pmc_agent.c | 8 ++++++++
|
|
pmc_agent.h | 6 ++++++
|
|
3 files changed, 16 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/phc2sys.c b/phc2sys.c
|
|
index cbe80f2..3cafbb2 100644
|
|
--- a/phc2sys.c
|
|
+++ b/phc2sys.c
|
|
@@ -1340,8 +1340,7 @@ 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_destroy(priv.node);
|
|
- priv.node = NULL;
|
|
+ pmc_agent_disable(priv.node);
|
|
}
|
|
}
|
|
|
|
@@ -1355,9 +1354,7 @@ int main(int argc, char *argv[])
|
|
}
|
|
|
|
end:
|
|
- if (priv.node) {
|
|
- pmc_agent_destroy(priv.node);
|
|
- }
|
|
+ pmc_agent_destroy(priv.node);
|
|
clock_cleanup(&priv);
|
|
port_cleanup(&priv);
|
|
config_destroy(cfg);
|
|
diff --git a/pmc_agent.c b/pmc_agent.c
|
|
index 22af306..833d1c1 100644
|
|
--- a/pmc_agent.c
|
|
+++ b/pmc_agent.c
|
|
@@ -366,6 +366,14 @@ void pmc_agent_destroy(struct pmc_agent *agent)
|
|
free(agent);
|
|
}
|
|
|
|
+void pmc_agent_disable(struct pmc_agent *agent)
|
|
+{
|
|
+ if (agent->pmc) {
|
|
+ pmc_destroy(agent->pmc);
|
|
+ }
|
|
+ agent->pmc = NULL;
|
|
+}
|
|
+
|
|
int pmc_agent_get_leap(struct pmc_agent *agent)
|
|
{
|
|
return agent->leap;
|
|
diff --git a/pmc_agent.h b/pmc_agent.h
|
|
index 483a21b..0ed10f8 100644
|
|
--- a/pmc_agent.h
|
|
+++ b/pmc_agent.h
|
|
@@ -55,6 +55,12 @@ struct pmc_agent *pmc_agent_create(void);
|
|
*/
|
|
void pmc_agent_destroy(struct pmc_agent *agent);
|
|
|
|
+/**
|
|
+ * Disconnects the PMC agent from the ptp4l service.
|
|
+ * @param agent Pointer to a PMC instance obtained via @ref pmc_agent_create().
|
|
+ */
|
|
+void pmc_agent_disable(struct pmc_agent *agent);
|
|
+
|
|
/**
|
|
* Gets the current leap adjustment.
|
|
* @param agent Pointer to a PMC instance obtained via @ref pmc_agent_create().
|