diff --git a/.gitignore b/.gitignore index 57b8c5b..616d143 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/synce4l-1.0.0.tar.gz +SOURCES/synce4l-1.1.0.tar.gz diff --git a/.synce4l.metadata b/.synce4l.metadata index e2f93cb..6d5fb29 100644 --- a/.synce4l.metadata +++ b/.synce4l.metadata @@ -1 +1 @@ -657eba71a2d740660aa32a03c8d1a160ea70d8e8 SOURCES/synce4l-1.0.0.tar.gz +b140fb69715e4d8d20fbd7ae763510b2a3986eec SOURCES/synce4l-1.1.0.tar.gz diff --git a/SOURCES/synce4l-32bit.patch b/SOURCES/synce4l-32bit.patch deleted file mode 100644 index 8c1ff6e..0000000 --- a/SOURCES/synce4l-32bit.patch +++ /dev/null @@ -1,50 +0,0 @@ -commit 11cc3508d4b7594e2a429000d162b3582d242c20 -Author: Miroslav Lichvar -Date: Mon Nov 6 14:10:42 2023 +0100 - - Fix printf formats for 32-bit archs - - Signed-off-by: Miroslav Lichvar - -diff --git a/config.c b/config.c -index 56fcbbd..723ff84 100644 ---- a/config.c -+++ b/config.c -@@ -21,6 +21,7 @@ - */ - #include - #include -+#include - #include - #include - #include -@@ -767,7 +768,7 @@ config_get_u64(struct config *cfg, const char *section, const char *option) - pr_err("bug: config option %s type mismatch!", option); - exit(-1); - } -- pr_debug("config item %s.%s is %lu (0x%lx)", section, option, -+ pr_debug("config item %s.%s is %"PRIu64" (0x%"PRIx64")", section, option, - ci->val.u64, ci->val.u64); - return ci->val.u64; - } -diff --git a/nl_dpll.c b/nl_dpll.c -index f343de6..4dee01b 100644 ---- a/nl_dpll.c -+++ b/nl_dpll.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include "nl_dpll.h" - #include "print.h" -@@ -118,7 +119,7 @@ int nl_dpll_device_id_get(struct nl_sock *sk, struct sk_arg *arg, - pr_err("%s: failed to send request", __func__); - goto msg_free; - } -- pr_debug("DEVICE_ID_GET request sent dpll id: %lu %s, ret:%d", -+ pr_debug("DEVICE_ID_GET request sent dpll id: %"PRIu64" %s, ret:%d", - clock_id, module_name, ret); - - arg->err = 0; diff --git a/SOURCES/synce4l-ccwarns.patch b/SOURCES/synce4l-ccwarns.patch new file mode 100644 index 0000000..0b6ac2b --- /dev/null +++ b/SOURCES/synce4l-ccwarns.patch @@ -0,0 +1,90 @@ +commit b8089eabc28d665cba462c29aabdb159f0f153a6 +Author: Miroslav Lichvar +Date: Tue May 28 13:38:13 2024 +0200 + + Fix more compiler warnings + + Fix the following warnings observed when -O2 and -D_FORTIFY_SOURCE=2 are + added to CFLAGS. + + synce_dev.c: In function ‘rebuild_inputs_prio’: + synce_dev.c:610:28: warning: ‘best_c_idx’ may be used uninitialized [-Wmaybe-uninitialized] + 610 | all[best_c_idx] = NULL; + | ^ + synce_dev.c:582:39: note: ‘best_c_idx’ was declared here + 582 | int i = 0, prio_count = 0, j, best_c_idx, ret; + | ^~~~~~~~~~ + + synce_manager.c: In function ‘synce_manager_server_thread’: + synce_manager.c:260:9: warning: ‘strncpy’ specified bound 108 equals destination size [-Wstringop-truncation] + 260 | strncpy(server.sun_path, synce_clock_get_socket_path(clk), + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 261 | sizeof(server.sun_path)); + | ~~~~~~~~~~~~~~~~~~~~~~~~ + + synce_manager.c:343:20: warning: ‘ret’ may be used uninitialized [-Wmaybe-uninitialized] + 343 | if (!ret) + | ^ + synce_manager.c:241:26: note: ‘ret’ was declared here + 241 | int tlv_num = 0, ret, i, resp_len, bytes_read; + | ^~~ + + synce_manager.c: In function ‘synce_manager_server_thread’: + synce_manager.c:346:25: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] + 346 | write(new_socket, response, resp_len); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Signed-off-by: Miroslav Lichvar + +diff --git a/synce_dev.c b/synce_dev.c +index fc784ed..5e2bbb9 100644 +--- a/synce_dev.c ++++ b/synce_dev.c +@@ -579,7 +579,7 @@ static bool source_invalid(struct synce_clock_source *c) + int rebuild_inputs_prio(struct synce_dev *dev) + { + struct synce_clock_source *c, *best_c, **all, **prioritized; +- int i = 0, prio_count = 0, j, best_c_idx, ret; ++ int i = 0, prio_count = 0, j, best_c_idx = 0, ret; + uint32_t prio; + + all = calloc(dev->num_clock_sources, sizeof(*all)); +diff --git a/synce_manager.c b/synce_manager.c +index b9ba08d..598ef7e 100644 +--- a/synce_manager.c ++++ b/synce_manager.c +@@ -257,8 +257,8 @@ static void *synce_manager_server_thread(void *arg) + } + + server.sun_family = AF_UNIX; +- strncpy(server.sun_path, synce_clock_get_socket_path(clk), +- sizeof(server.sun_path)); ++ snprintf(server.sun_path, sizeof(server.sun_path), "%s", ++ synce_clock_get_socket_path(clk)); + + if (bind(server_fd, (struct sockaddr *)&server, sizeof(server)) < 0) { + pr_err("%s Bind failed", __func__); +@@ -289,10 +289,12 @@ static void *synce_manager_server_thread(void *arg) + bytes_read = recv(new_socket, command, MAX_COMMAND_SIZE, 0); + if (bytes_read <= 0) { + synce_manager_generate_err_tlv(&err_tlv, "NULL command"); ++ ret = -1; + goto return_response; + } else if (bytes_read > MAX_COMMAND_SIZE) { + synce_manager_generate_err_tlv(&err_tlv, + "Command size exceeds MAX_COMMAND_SIZE"); ++ ret = -1; + goto return_response; + } + ret = synce_manager_parse_input(command, bytes_read, &tlv_array, +@@ -340,8 +342,8 @@ return_response: + if (tlv_array) + free((void *)tlv_array); + +- if (!ret) +- write(new_socket, response, resp_len); ++ if (!ret && write(new_socket, response, resp_len) != resp_len) ++ ret = -1; + close(new_socket); + } + diff --git a/SOURCES/synce4l-initpinid.patch b/SOURCES/synce4l-initpinid.patch new file mode 100644 index 0000000..ed50ea0 --- /dev/null +++ b/SOURCES/synce4l-initpinid.patch @@ -0,0 +1,24 @@ +commit b61dd54c1015692785a1766b15f7f5914f68df70 +Author: Miroslav Lichvar +Date: Wed Aug 7 14:14:32 2024 +0200 + + Initialize pin ID to -1 + + When creating the pin structure, initialize the pin ID to -1 to avoid + matching an existing pin with ID 0 (e.g. CVL-SDP22 on E810) when a + nonexistent pin is specified in the config. + + Signed-off-by: Miroslav Lichvar + +diff --git a/dpll_mon.c b/dpll_mon.c +index 39659fe..36aa559 100644 +--- a/dpll_mon.c ++++ b/dpll_mon.c +@@ -240,6 +240,7 @@ static struct dpll_mon_pin *pin_create(void) + } + pr_debug("%s %p", __func__, pin); + pin->parent_used_by = PARENT_NOT_USED; ++ pin->id = -1; + STAILQ_INIT(&pin->parents); + + return pin; diff --git a/SOURCES/synce4l-noduppin.patch b/SOURCES/synce4l-noduppin.patch new file mode 100644 index 0000000..5d2254d --- /dev/null +++ b/SOURCES/synce4l-noduppin.patch @@ -0,0 +1,43 @@ +commit 11319e050cde0657395d2656e2be4a629b53fb3b +Author: Miroslav Lichvar +Date: Mon Aug 5 16:20:49 2024 +0200 + + Fix crash in dpll_rt_recv() + + A crash was observed with E810 firmware 4.50 and kernel 6.11-rc1 in + dpll_rt_recv() trying to assign pin id to the pin which was removed by + remove_no_ifname_pin(). The pin is not a duplicate. + + Add a third parameter to remove_no_ifname_pin() to avoid removing the + incorrect pin. + + Signed-off-by: Miroslav Lichvar + +diff --git a/dpll_mon.c b/dpll_mon.c +index 06b4bce..39659fe 100644 +--- a/dpll_mon.c ++++ b/dpll_mon.c +@@ -256,12 +256,12 @@ static void pin_destroy(struct dpll_mon_pin *pin) + free(pin); + } + +-void remove_no_ifname_pin(struct dpll_mon *dm, uint32_t pin_id) ++void remove_no_ifname_pin(struct dpll_mon *dm, uint32_t pin_id, struct dpll_mon_pin *except) + { + struct dpll_mon_pin *pin; + + STAILQ_FOREACH(pin, &dm->pins, list) +- if (pin && pin_id == pin->id && pin->ifname == NULL) { ++ if (pin && pin != except && pin_id == pin->id && pin->ifname == NULL) { + pr_debug_pin("removed duplicated pin", pin); + STAILQ_REMOVE(&dm->pins, pin, dpll_mon_pin, list); + pin_destroy(pin); +@@ -589,7 +589,7 @@ static int dpll_rt_recv(struct nl_msg *msg, void *arg) + goto unlock; + pin_id = nla_get_u32(an[DPLL_A_PIN_ID]); + if (pin) { +- remove_no_ifname_pin(dm, pin_id); ++ remove_no_ifname_pin(dm, pin_id, pin); + pin->id = pin_id; + pr_debug_pin("pin assigned id", pin); + } else { diff --git a/SOURCES/synce4l-ql.patch b/SOURCES/synce4l-ql.patch deleted file mode 100644 index c9b0b6c..0000000 --- a/SOURCES/synce4l-ql.patch +++ /dev/null @@ -1,297 +0,0 @@ -commit a59358afe10326096c0e4330d705457a65176bb8 -Author: Yochai Hagvi -Date: Thu Nov 30 13:06:01 2023 +0200 - - synce4l: fix flows moving from best port to SMA - - When synce4l best source is changed from port and SMA, due to SMA QL - update, some flows found broken. - - on choose_best_source, when best source is changed, ibest_source should - be NULL since dev_update_ql uses the best_port for configuring - - on dev_step_line_input, when rebuild_prio is set, this case should be - hit - - (ML: backported to 1.0.0) - - Signed-off-by: Yochai Hagvi - -diff --git a/synce_dev.c b/synce_dev.c -index cd5c787..70936a6 100644 ---- a/synce_dev.c -+++ b/synce_dev.c -@@ -525,6 +525,7 @@ static void choose_best_source(struct synce_dev *dev) - dev->name); - } else { - dev->ext_src_is_best = ext_src_is_best; -+ dev->best_source = NULL; - /* if input source is changing - * current input is invalid, send DNU and wait - * for EEC being locked in further dev_step -@@ -555,14 +556,17 @@ static int dev_step_line_input(struct synce_dev *dev) - - if (rx_ql_changed(dev)) { - choose_best_source(dev); -- } else if (dev->best_source && dev->best_source->type == PORT) { -- if (synce_port_rx_ql_failed(dev->best_source->port)) { -- synce_port_invalidate_rx_ql(dev->best_source->port); -- force_all_eecs_detach(dev); -- dev_update_ql(dev); -- dev->best_source = NULL; -- choose_best_source(dev); -- } -+ } else if (dev->best_source && dev->best_source->type == PORT && -+ synce_port_rx_ql_failed(dev->best_source->port)) { -+ synce_port_invalidate_rx_ql(dev->best_source->port); -+ force_all_eecs_detach(dev); -+ dev_update_ql(dev); -+ dev->best_source = NULL; -+ choose_best_source(dev); -+ } else if (dev->rebuild_prio) { -+ choose_best_source(dev); -+ dev_update_ql(dev); -+ dev->rebuild_prio = 0; - } - - return ret; -@@ -697,6 +701,7 @@ int synce_dev_init(struct synce_dev *dev, struct config *cfg) - dev->recover_time = config_get_int(cfg, dev->name, "recover_time"); - dev->best_source = NULL; - dev->ext_src_is_best = false; -+ dev->rebuild_prio = 0; - eec_get_state_cmd = config_get_string(cfg, dev->name, "eec_get_state_cmd"); - ess.holdover = config_get_string(cfg, dev->name, "eec_holdover_value"); - ess.locked_ho = config_get_string(cfg, dev->name, "eec_locked_ho_value"); - -commit 08914289b154ef4467929a84f1b2bf72591e8857 -Author: Miroslav Lichvar -Date: Mon Jan 8 16:56:38 2024 +0100 - - Update port TX QL when external source locks - - With multiple external sources, the transmitted QL was wrong if the best - source was not selected. When an external source locks, update the - forced QL of all ports to transmit the correct QL. - - Signed-off-by: Miroslav Lichvar - -diff --git a/synce_dev.c b/synce_dev.c -index 70936a6..b8bfd0f 100644 ---- a/synce_dev.c -+++ b/synce_dev.c -@@ -664,6 +664,10 @@ static int dev_step_dpll(struct synce_dev *dev) - dev->best_source = active; - pr_info("EEC_LOCKED/EEC_LOCKED_HO_ACQ on %s of %s", - dev->best_source->ext_src->name, dev->name); -+ LIST_FOREACH(c, &dev->clock_sources, list) { -+ if (c->type == PORT) -+ set_port_ql_from_ext_src(dev, c->port, active->ext_src); -+ } - dev_update_ql(dev); - } else if (active->type == PORT) { - dev->ext_src_is_best = 0; - -commit 0d6452efc885ec30547124b4c5570f4e6039ad69 -Author: Miroslav Lichvar -Date: Wed Jan 17 14:15:16 2024 +0100 - - Add functions for clearing priority of individual pins - - Signed-off-by: Miroslav Lichvar - -diff --git a/dpll_mon.c b/dpll_mon.c -index 0f0648c..14e5354 100644 ---- a/dpll_mon.c -+++ b/dpll_mon.c -@@ -972,7 +972,7 @@ int set_prio(struct dpll_mon *dm, uint32_t pin_id, uint32_t prio) - dm->dpll_id, prio); - } - --static int dpll_mon_pin_prio_clear(struct dpll_mon *dm, struct dpll_mon_pin *pin) -+int dpll_mon_pin_prio_clear(struct dpll_mon *dm, struct dpll_mon_pin *pin) - { - struct dpll_mon_pin *parent; - struct parent_pin *pp; -diff --git a/dpll_mon.h b/dpll_mon.h -index ec6e8b4..481b5e3 100644 ---- a/dpll_mon.h -+++ b/dpll_mon.h -@@ -119,6 +119,15 @@ int dpll_mon_pin_is_active(struct dpll_mon *dm, struct dpll_mon_pin *pin); - int dpll_mon_pin_prio_set(struct dpll_mon *dm, struct dpll_mon_pin *pin, - uint32_t prio); - -+/** -+ * Request to reset the priority of a pin to dnu_prio. -+ * -+ * @param dm Instance of dpll mon which owns the pin. -+ * @param pin Valid pointer to a pin. -+ * @return 0 - success, negative - failed to send request -+ */ -+int dpll_mon_pin_prio_clear(struct dpll_mon *dm, struct dpll_mon_pin *pin); -+ - /** - * Request to set Do Not Use priority on all valid pins for all the pins - * controlled by the dpll_mon's dpll. -diff --git a/synce_clock_source.c b/synce_clock_source.c -index 16ba091..50b21b8 100644 ---- a/synce_clock_source.c -+++ b/synce_clock_source.c -@@ -220,3 +220,18 @@ int synce_clock_source_prio_set(struct dpll_mon *dpll_mon, - prio); - return synce_ext_src_prio_set(dpll_mon, clk_src->ext_src, prio); - } -+ -+int synce_clock_source_prio_clear(struct dpll_mon *dpll_mon, -+ struct synce_clock_source *clk_src) -+{ -+ if (!clk_src) { -+ pr_err("%s clock_source is NULL", __func__); -+ return -ENODEV; -+ } -+ pr_debug("%s: clear prio on %s", __func__, -+ clk_src->type == PORT ? clk_src->port->name : -+ clk_src->ext_src->name); -+ if (clk_src->type == PORT) -+ return synce_port_prio_clear(dpll_mon, clk_src->port); -+ return synce_ext_src_prio_clear(dpll_mon, clk_src->ext_src); -+} -diff --git a/synce_clock_source.h b/synce_clock_source.h -index 80c1327..96e6d26 100644 ---- a/synce_clock_source.h -+++ b/synce_clock_source.h -@@ -132,4 +132,14 @@ int synce_clock_source_prio_set(struct dpll_mon *dpll_mon, - struct synce_clock_source *clk_src, - uint32_t prio); - -+/** -+ * request to set priority of a clock source pin on a dpll to dnu_prio -+ * -+ * @param dpll_mon Pointer to dpll_mon class -+ * @param clk_src Configured instance -+ * @return 0 - success, error code - failure -+ */ -+int synce_clock_source_prio_clear(struct dpll_mon *dpll_mon, -+ struct synce_clock_source *clk_src); -+ - #endif /* HAVE_SYNCE_CLOCK_SOURCE_H */ -diff --git a/synce_ext_src.c b/synce_ext_src.c -index 7d0debd..d5c94f5 100644 ---- a/synce_ext_src.c -+++ b/synce_ext_src.c -@@ -204,3 +204,9 @@ int synce_ext_src_prio_set(struct dpll_mon *dpll_mon, - { - return dpll_mon_pin_prio_set(dpll_mon, ext_src->pin, prio); - } -+ -+int synce_ext_src_prio_clear(struct dpll_mon *dpll_mon, -+ struct synce_ext_src *ext_src) -+{ -+ return dpll_mon_pin_prio_clear(dpll_mon, ext_src->pin); -+} -diff --git a/synce_ext_src.h b/synce_ext_src.h -index 79e6773..972c254 100644 ---- a/synce_ext_src.h -+++ b/synce_ext_src.h -@@ -128,4 +128,14 @@ int synce_ext_src_is_active(struct dpll_mon *dpll_mon, - int synce_ext_src_prio_set(struct dpll_mon *dpll_mon, - struct synce_ext_src *ext_src, uint32_t prio); - -+/** -+ * request to set priority of a external source associated pin to dnu_prio -+ * -+ * @param dpll_mon Pointer to dpll_mon class -+ * @param ext_src Configured instance -+ * @return 0 - success, error code - failure -+ */ -+int synce_ext_src_prio_clear(struct dpll_mon *dpll_mon, -+ struct synce_ext_src *ext_src); -+ - #endif /* HAVE_SYNCE_EXT_SRC_H */ -diff --git a/synce_port.c b/synce_port.c -index 93bcee0..93a9f9f 100644 ---- a/synce_port.c -+++ b/synce_port.c -@@ -473,3 +473,8 @@ int synce_port_prio_set(struct dpll_mon *dpll_mon, struct synce_port *port, - { - return dpll_mon_pin_prio_set(dpll_mon, port->pin, prio); - } -+ -+int synce_port_prio_clear(struct dpll_mon *dpll_mon, struct synce_port *port) -+{ -+ return dpll_mon_pin_prio_clear(dpll_mon, port->pin); -+} -diff --git a/synce_port.h b/synce_port.h -index 6f08976..ce07101 100644 ---- a/synce_port.h -+++ b/synce_port.h -@@ -192,4 +192,13 @@ int synce_port_is_active(struct dpll_mon *dpll_mon, struct synce_port *port); - int synce_port_prio_set(struct dpll_mon *dpll_mon, struct synce_port *port, - uint32_t prio); - -+/** -+ * request to set priority of a port pin on a dpll to dnu_prio -+ * -+ * @param dpll_mon Pointer to dpll_mon class -+ * @param port Configured instance -+ * @return 0 - success, error code - failure -+ */ -+int synce_port_prio_clear(struct dpll_mon *dpll_mon, struct synce_port *port); -+ - #endif /* HAVE_SYNCE_PORT_H */ - -commit 977f85ac74720996733c9ecce3cd2cd545a357de -Author: Miroslav Lichvar -Date: Wed Jan 17 14:16:07 2024 +0100 - - Avoid disconnecting input when rebuilding priority - - When rebuilding the input priority (e.g. after a change in the received - QL), avoid temporarily clearing the priority (setting to DNU) of inputs - that will still be usable for synchronization. - - This avoids an unnecessary disconnect of the currently locked input - causing a change in the transmitted QL and possibly an infinite loop in - the selection of inputs if the downstream SyncE clock is selecting this - clock as its input. - - Signed-off-by: Miroslav Lichvar - -diff --git a/synce_dev.c b/synce_dev.c -index b8bfd0f..7800508 100644 ---- a/synce_dev.c -+++ b/synce_dev.c -@@ -577,13 +577,14 @@ int rebuild_inputs_prio(struct synce_dev *dev) - struct synce_clock_source *tmp, *tmp_best, **arr, *best, *prev_tmp = NULL; - int i = 0, prio_count; - -- if (dpll_mon_pins_prio_dnu_set(dev->dpll_mon)) { -- pr_err("failed to set DNU priorities on %s", dev->name); -- return -EIO; -- } - best = find_dev_best_clock_source(dev); -- if (!best) -+ if (!best) { -+ if (dpll_mon_pins_prio_dnu_set(dev->dpll_mon)) { -+ pr_err("failed to set DNU priorities on %s", dev->name); -+ return -EIO; -+ } - return 0; -+ } - arr = calloc(dev->num_clock_sources, sizeof(*arr)); - if (!arr) - return -ENOMEM; -@@ -620,6 +621,13 @@ int rebuild_inputs_prio(struct synce_dev *dev) - } - prio_count = i; - pr_debug("considered valid clock sources num: %d on %s", i, dev->name); -+ LIST_FOREACH(tmp, &dev->clock_sources, list) { -+ for (i = 0; i < prio_count; i++) -+ if (tmp == arr[i]) -+ break; -+ if (i == prio_count) -+ synce_clock_source_prio_clear(dev->dpll_mon, tmp); -+ } - for (i = 0; i < prio_count; i++) - synce_clock_source_prio_set(dev->dpll_mon, arr[i], i); - free(arr); diff --git a/SOURCES/synce4l-smc.patch b/SOURCES/synce4l-smc.patch new file mode 100644 index 0000000..1857241 --- /dev/null +++ b/SOURCES/synce4l-smc.patch @@ -0,0 +1,133 @@ +commit 6edb7f5a974c8a80f68c7b82b1bde1c1b37b75bb +Author: Miroslav Lichvar +Date: Wed Jun 5 12:55:29 2024 +0200 + + Change default smc_socket_path to /run/synce4l_socket + + System services should use /run for sockets and other runtime files. + + Signed-off-by: Miroslav Lichvar + +diff --git a/README.md b/README.md +index 87623a9..c1c1d73 100644 +--- a/README.md ++++ b/README.md +@@ -125,7 +125,7 @@ related to a running synce4l instance. + | `logging_level` | `6` | `0-7` | Minimum log level required to appear in a log. | + | `message_tag` | None | string | Tag reported in a log. | + | `poll_interval_msec` | 20 | 0-500 | Sleep time between subsequent SyncE clock polls | +-| `smc_socket_path` | `/tmp/synce4l_socket` | string | Full path to socket file for external application communication | ++| `smc_socket_path` | `/run/synce4l_socket` | string | Full path to socket file for external application communication | + | `use_syslog` | `1` | `0`, `1` | Set to 1 if `syslog` should be used. | + | `verbose` | `0` | `0`, `1` | Set to 1 to log extra information. | + +@@ -200,7 +200,7 @@ logging_level 7 + use_syslog 0 + verbose 1 + message_tag [synce4l] +-smc_socket_path /tmp/synce4l_socket ++smc_socket_path /run/synce4l_socket + + [] + network_option 1 +@@ -239,7 +239,7 @@ logging_level 7 + use_syslog 0 + verbose 1 + message_tag [synce4l] +-smc_socket_path /tmp/synce4l_socket ++smc_socket_path /run/synce4l_socket + + [] + network_option 1 +diff --git a/config.c b/config.c +index bb438a6..274c2d3 100644 +--- a/config.c ++++ b/config.c +@@ -180,7 +180,7 @@ struct config_item config_tab_synce[] = { + GLOB_ITEM_STR("message_tag", NULL), + GLOB_ITEM_INT("poll_interval_msec", 20, CLOCK_POLL_INTERVAL_MIN, + CLOCK_POLL_INTERVAL_MAX), +- GLOB_ITEM_STR("smc_socket_path", "/tmp/synce4l_socket"), ++ GLOB_ITEM_STR("smc_socket_path", "/run/synce4l_socket"), + GLOB_ITEM_INT("use_syslog", 1, 0, 1), + GLOB_ITEM_STR("userDescription", ""), + GLOB_ITEM_INT("verbose", 0, 0, 1), +diff --git a/configs/synce4l.cfg b/configs/synce4l.cfg +index ca12e9f..de92bd1 100644 +--- a/configs/synce4l.cfg ++++ b/configs/synce4l.cfg +@@ -7,7 +7,7 @@ logging_level 7 + use_syslog 0 + verbose 1 + message_tag [synce4l] +-smc_socket_path /tmp/synce4l_socket ++smc_socket_path /run/synce4l_socket + + + # +diff --git a/configs/synce4l_dpll.cfg b/configs/synce4l_dpll.cfg +index b814266..db4bd88 100644 +--- a/configs/synce4l_dpll.cfg ++++ b/configs/synce4l_dpll.cfg +@@ -7,7 +7,7 @@ logging_level 6 + use_syslog 0 + verbose 1 + message_tag [synce4l] +-smc_socket_path /tmp/synce4l_socket ++smc_socket_path /run/synce4l_socket + + + # + +commit 2f50c7a8b98d99220108abb0163696dcfed77635 +Author: Miroslav Lichvar +Date: Wed Jun 5 13:05:18 2024 +0200 + + Check smc_socket_path length + + Exit with an error message if the configured socket path is too long to + be bound as a Unix domain socket. + + Signed-off-by: Miroslav Lichvar + +diff --git a/synce_manager.c b/synce_manager.c +index 598ef7e..a42b823 100644 +--- a/synce_manager.c ++++ b/synce_manager.c +@@ -256,6 +256,10 @@ static void *synce_manager_server_thread(void *arg) + exit(EXIT_FAILURE); + } + ++ if (strlen(synce_clock_get_socket_path(clk)) >= sizeof(server.sun_path)) { ++ pr_err("%s smc_socket_path is too long", __func__); ++ exit(EXIT_FAILURE); ++ } + server.sun_family = AF_UNIX; + snprintf(server.sun_path, sizeof(server.sun_path), "%s", + synce_clock_get_socket_path(clk)); + +commit b5a9ad4f0aa1fb98e4ac060c91a08d82fe66e7d2 +Author: Miroslav Lichvar +Date: Wed Jun 5 13:07:04 2024 +0200 + + Unlink smc_socket_path before binding + + Remove the Unix domain socket if it already exists (e.g. previous + synce4l instance didn't exit cleanly) to avoid failing in the bind() + call. + + Signed-off-by: Miroslav Lichvar + +diff --git a/synce_manager.c b/synce_manager.c +index a42b823..6baf18c 100644 +--- a/synce_manager.c ++++ b/synce_manager.c +@@ -264,6 +264,8 @@ static void *synce_manager_server_thread(void *arg) + snprintf(server.sun_path, sizeof(server.sun_path), "%s", + synce_clock_get_socket_path(clk)); + ++ unlink(server.sun_path); ++ + if (bind(server_fd, (struct sockaddr *)&server, sizeof(server)) < 0) { + pr_err("%s Bind failed", __func__); + exit(EXIT_FAILURE); diff --git a/SOURCES/synce4l-stacksize.patch b/SOURCES/synce4l-stacksize.patch new file mode 100644 index 0000000..bdadc15 --- /dev/null +++ b/SOURCES/synce4l-stacksize.patch @@ -0,0 +1,26 @@ +commit f134a38219fc390405f488d5eaaa64e7957b29f3 +Author: Miroslav Lichvar +Date: Tue Aug 13 12:19:24 2024 +0200 + + Fix requested thread stack size + + The pthread_attr_setstacksize() call requesting size of 0xffff fails on + systems with 64k pages. Request the maximum of 0xffff and + PTHREAD_STACK_MIN instead. + + Signed-off-by: Miroslav Lichvar + +diff --git a/synce_thread_common.h b/synce_thread_common.h +index cf607ac..8db11d7 100644 +--- a/synce_thread_common.h ++++ b/synce_thread_common.h +@@ -13,7 +13,8 @@ + #define MSEC_TO_USEC(X) (X * 1000) + #define THREAD_STOP_SLEEP_USEC MSEC_TO_USEC(50) + #define THREAD_START_SLEEP_USEC MSEC_TO_USEC(20) +-#define SYNCE_THREAD_STACK_SIZE 0xffff ++#define SYNCE_THREAD_STACK_SIZE (0xffff > PTHREAD_STACK_MIN ? \ ++ 0xffff : PTHREAD_STACK_MIN) + #define TASK_COMM_LEN 16 + + #endif /* HAVE_SYNCE_THREAD_COMMON_H */ diff --git a/SOURCES/synce4l-uninit-warning.patch b/SOURCES/synce4l-uninit-warning.patch deleted file mode 100644 index cf0d4b6..0000000 --- a/SOURCES/synce4l-uninit-warning.patch +++ /dev/null @@ -1,37 +0,0 @@ -commit 2ae971b87f05c03bd07d0ce41db59cc522625482 -Author: Miroslav Lichvar -Date: Wed Nov 8 15:15:28 2023 +0100 - - Avoid -Wmaybe-uninitialized warning - - This fixes false positives reported by an older gcc: - - In file included from dpll_mon.c:17: - dpll_mon.c: In function 'dpll_mon_pin_update': - print.h:54:17: error: 'pin_state' may be used uninitialized in this function [-Werror=maybe-uninitialized] - 54 | print(l, x); \ - | ^~~~~ - dpll_mon.c:334:33: note: 'pin_state' was declared here - 334 | uint32_t parent_pin_id, pin_state; - | ^~~~~~~~~ - print.h:54:17: error: 'parent_pin_id' may be used uninitialized in this - function [-Werror=maybe-uninitialized] - 54 | print(l, x); \ - | ^~~~~ - dpll_mon.c:334:18: note: 'parent_pin_id' was declared here - 334 | uint32_t parent_pin_id, pin_state; - | ^~~~~~~~~~~~~ - -diff --git a/dpll_mon.c b/dpll_mon.c -index 3cc26cc..0f0648c 100644 ---- a/dpll_mon.c -+++ b/dpll_mon.c -@@ -331,7 +331,7 @@ static void update_muxed_pin(struct dpll_mon *dm, uint32_t pin_id, - struct nlattr *a, int exist, int notify) - { - int parent_pin_id_valid = 0, pin_state_valid = 0, rem; -- uint32_t parent_pin_id, pin_state; -+ uint32_t parent_pin_id = 0, pin_state = 0; - struct dpll_mon_pin *pin, *parent; - struct nlattr *an; - diff --git a/SPECS/synce4l.spec b/SPECS/synce4l.spec index 3eadeee..a20f902 100644 --- a/SPECS/synce4l.spec +++ b/SPECS/synce4l.spec @@ -1,6 +1,6 @@ Name: synce4l -Version: 1.0.0 -Release: 1%{?dist} +Version: 1.1.0 +Release: 2%{?dist} Summary: SyncE implementation for Linux License: GPL-2.0-or-later @@ -8,12 +8,16 @@ URL: https://github.com/intel/synce4l Source0: https://github.com/intel/synce4l/archive/%{version}/synce4l-%{version}.tar.gz Source1: synce4l.service -# Fix building on 32-bit archs -Patch1: synce4l-32bit.patch -# Fix false compiler warning -Patch2: synce4l-uninit-warning.patch -# Fix various issues in handling of changes in received/transmitted QL -Patch3: synce4l-ql.patch +# Fix compiler warnings to avoid build failures with -Werror +Patch1: synce4l-ccwarns.patch +# Change default smc socket path and remove existing socket on start +Patch2: synce4l-smc.patch +# Fix crash observed with newer E810 firmware +Patch3: synce4l-noduppin.patch +# Fix initial pin ID to not match an existing pin +Patch4: synce4l-initpinid.patch +# Fix requested thread stack size on aarch64 +Patch5: synce4l-stacksize.patch BuildRequires: gcc make systemd BuildRequires: libnl3-devel @@ -28,7 +32,7 @@ supported hardware by processing Ethernet Synchronization Messaging Channel (NIC). %prep -%autosetup +%autosetup -p1 sed \ -e 's|^\(logging_level *\)[0-7]|\16|' \ @@ -74,6 +78,12 @@ echo '.so man8/synce4l.8' > $RPM_BUILD_ROOT%{_mandir}/man5/synce4l.conf.5 %{_mandir}/man8/*.8* %changelog +* Tue Aug 13 2024 Miroslav Lichvar 1.1.0-2 +- fix requested thread stack size on aarch64 (RHEL-54121) + +* Wed Aug 07 2024 Miroslav Lichvar 1.1.0-1 +- update to 1.1.0 (RHEL-52089 RHEL-52090 RHEL-52091 RHEL-52197) + * Mon Feb 19 2024 Miroslav Lichvar 1.0.0-1 - update to 1.0.0 (RHEL-10089 RHEL-1645 RHEL-17948 RHEL-17949)