summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJafar Al-Gharaibeh <jafar@atcorp.com>2023-01-09 14:56:34 -0600
committerGitHub <noreply@github.com>2023-01-09 14:56:34 -0600
commiteae0855f541f0a4e8996dfe19ed3f312499375f7 (patch)
tree1108b1399bcf15e4e5786d767c9a65e2a568be81
parentc2853adde61305528383ea656852bf55a83d82f6 (diff)
parent67e465af711c3da9267de8c5870d8242b353e8ba (diff)
Merge pull request #12610 from FRRouting/mergify/bp/stable/8.4/pr-12606
*: various build fixes (backport #12606)
-rw-r--r--doc/developer/subdir.am1
-rw-r--r--doc/user/subdir.am2
-rw-r--r--lib/elf_py.c2
-rw-r--r--lib/xref.h13
-rw-r--r--zebra/zserv.c68
-rw-r--r--zebra/zserv.h15
6 files changed, 59 insertions, 42 deletions
diff --git a/doc/developer/subdir.am b/doc/developer/subdir.am
index 9cf14a1966..b4c752a473 100644
--- a/doc/developer/subdir.am
+++ b/doc/developer/subdir.am
@@ -71,6 +71,7 @@ EXTRA_DIST += \
doc/developer/draft-zebra-00.ms \
doc/developer/ldpd-basic-test-setup.md \
doc/developer/release-announcement-template.md \
+ doc/developer/_static/overrides.css \
# end
DEVBUILD = doc/developer/_build
diff --git a/doc/user/subdir.am b/doc/user/subdir.am
index 14ace2c856..2bb1d28a2f 100644
--- a/doc/user/subdir.am
+++ b/doc/user/subdir.am
@@ -56,6 +56,8 @@ user_RSTFILES = \
EXTRA_DIST += \
$(user_RSTFILES) \
doc/user/Useful_Sysctl_Settings.md \
+ doc/user/_static/overrides.css \
+ doc/user/_static/overrides.js \
# end
USERBUILD = doc/user/_build
diff --git a/lib/elf_py.c b/lib/elf_py.c
index 75d2d6007f..7c503cfb9d 100644
--- a/lib/elf_py.c
+++ b/lib/elf_py.c
@@ -293,7 +293,7 @@ static PyObject *elfreloc_getsection(PyObject *self, PyObject *args)
if (!w->es)
Py_RETURN_NONE;
- if (w->symidx == 0) {
+ if (!w->symvalid || w->symidx == 0) {
size_t idx = 0;
Elf_Scn *scn;
diff --git a/lib/xref.h b/lib/xref.h
index 0e3f00f690..37242bd79e 100644
--- a/lib/xref.h
+++ b/lib/xref.h
@@ -208,8 +208,19 @@ extern const struct xref * const __stop_xref_array[1] DSO_LOCAL;
* some build issue with it just add -DFRR_XREF_NO_NOTE to your build flags
* to disable it.
*/
-#ifdef FRR_XREF_NO_NOTE
+#if defined(FRR_XREF_NO_NOTE) || defined(__mips64)
#define XREF_NOTE ""
+
+/* mips64 note: MIPS64 (regardless of endianness, both mips64 & mips64el)
+ * does not have a 64-bit PC-relative relocation type. Unfortunately, a
+ * 64-bit PC-relative relocation is exactly what the below asm magic emits.
+ * Therefore, the xref ELF note is permanently disabled on MIPS64.
+ *
+ * For some context, refer to https://reviews.llvm.org/D80390
+ *
+ * As noted above, xref extraction still works through the section header
+ * path, so no functionality is lost.
+ */
#else
#if __SIZEOF_POINTER__ == 4
diff --git a/zebra/zserv.c b/zebra/zserv.c
index ebe246ffbc..a99dce03c0 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -222,14 +222,16 @@ static void zserv_write(struct thread *thread)
struct stream *msg;
uint32_t wcmd = 0;
struct stream_fifo *cache;
+ uint64_t time_now = monotime(NULL);
/* If we have any data pending, try to flush it first */
switch (buffer_flush_all(client->wb, client->sock)) {
case BUFFER_ERROR:
goto zwrite_fail;
case BUFFER_PENDING:
- atomic_store_explicit(&client->last_write_time, monotime(NULL),
- memory_order_relaxed);
+ frr_with_mutex (&client->stats_mtx) {
+ client->last_write_time = time_now;
+ }
zserv_client_event(client, ZSERV_CLIENT_WRITE);
return;
case BUFFER_EMPTY:
@@ -263,20 +265,19 @@ static void zserv_write(struct thread *thread)
case BUFFER_ERROR:
goto zwrite_fail;
case BUFFER_PENDING:
- atomic_store_explicit(&client->last_write_time, monotime(NULL),
- memory_order_relaxed);
+ frr_with_mutex (&client->stats_mtx) {
+ client->last_write_time = time_now;
+ }
zserv_client_event(client, ZSERV_CLIENT_WRITE);
return;
case BUFFER_EMPTY:
break;
}
- atomic_store_explicit(&client->last_write_cmd, wcmd,
- memory_order_relaxed);
-
- atomic_store_explicit(&client->last_write_time, monotime(NULL),
- memory_order_relaxed);
-
+ frr_with_mutex (&client->stats_mtx) {
+ client->last_write_cmd = wcmd;
+ client->last_write_time = time_now;
+ }
return;
zwrite_fail:
@@ -423,11 +424,13 @@ static void zserv_read(struct thread *thread)
}
if (p2p < p2p_orig) {
+ uint64_t time_now = monotime(NULL);
+
/* update session statistics */
- atomic_store_explicit(&client->last_read_time, monotime(NULL),
- memory_order_relaxed);
- atomic_store_explicit(&client->last_read_cmd, hdr.command,
- memory_order_relaxed);
+ frr_with_mutex (&client->stats_mtx) {
+ client->last_read_time = time_now;
+ client->last_read_cmd = hdr.command;
+ }
/* publish read packets on client's input queue */
frr_with_mutex (&client->ibuf_mtx) {
@@ -621,6 +624,7 @@ static void zserv_client_free(struct zserv *client)
buffer_free(client->wb);
/* Free buffer mutexes */
+ pthread_mutex_destroy(&client->stats_mtx);
pthread_mutex_destroy(&client->obuf_mtx);
pthread_mutex_destroy(&client->ibuf_mtx);
@@ -741,14 +745,13 @@ static struct zserv *zserv_client_create(int sock)
client->obuf_fifo = stream_fifo_new();
client->ibuf_work = stream_new(stream_size);
client->obuf_work = stream_new(stream_size);
+ client->connect_time = monotime(NULL);
pthread_mutex_init(&client->ibuf_mtx, NULL);
pthread_mutex_init(&client->obuf_mtx, NULL);
+ pthread_mutex_init(&client->stats_mtx, NULL);
client->wb = buffer_new(0);
TAILQ_INIT(&(client->gr_info_queue));
- atomic_store_explicit(&client->connect_time, monotime(NULL),
- memory_order_relaxed);
-
/* Initialize flags */
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
@@ -1009,8 +1012,14 @@ static void zebra_show_client_detail(struct vty *vty, struct zserv *client)
vty_out(vty, "------------------------ \n");
vty_out(vty, "FD: %d \n", client->sock);
- connect_time = (time_t) atomic_load_explicit(&client->connect_time,
- memory_order_relaxed);
+ frr_with_mutex (&client->stats_mtx) {
+ connect_time = client->connect_time;
+ last_read_time = client->last_read_time;
+ last_write_time = client->last_write_time;
+
+ last_read_cmd = client->last_read_cmd;
+ last_write_cmd = client->last_write_cmd;
+ }
vty_out(vty, "Connect Time: %s \n",
zserv_time_buf(&connect_time, cbuf, ZEBRA_TIME_BUF));
@@ -1030,16 +1039,6 @@ static void zebra_show_client_detail(struct vty *vty, struct zserv *client)
vty_out(vty, "Client will %sbe notified about it's routes status\n",
client->notify_owner ? "" : "Not ");
- last_read_time = (time_t)atomic_load_explicit(&client->last_read_time,
- memory_order_relaxed);
- last_write_time = (time_t)atomic_load_explicit(&client->last_write_time,
- memory_order_relaxed);
-
- last_read_cmd = atomic_load_explicit(&client->last_read_cmd,
- memory_order_relaxed);
- last_write_cmd = atomic_load_explicit(&client->last_write_cmd,
- memory_order_relaxed);
-
vty_out(vty, "Last Msg Rx Time: %s \n",
zserv_time_buf(&last_read_time, rbuf, ZEBRA_TIME_BUF));
vty_out(vty, "Last Msg Tx Time: %s \n",
@@ -1173,12 +1172,11 @@ static void zebra_show_client_brief(struct vty *vty, struct zserv *client)
char wbuf[ZEBRA_TIME_BUF];
time_t connect_time, last_read_time, last_write_time;
- connect_time = (time_t)atomic_load_explicit(&client->connect_time,
- memory_order_relaxed);
- last_read_time = (time_t)atomic_load_explicit(&client->last_read_time,
- memory_order_relaxed);
- last_write_time = (time_t)atomic_load_explicit(&client->last_write_time,
- memory_order_relaxed);
+ frr_with_mutex (&client->stats_mtx) {
+ connect_time = client->connect_time;
+ last_read_time = client->last_read_time;
+ last_write_time = client->last_write_time;
+ }
if (client->instance || client->session_id)
snprintfrr(client_string, sizeof(client_string), "%s[%u:%u]",
diff --git a/zebra/zserv.h b/zebra/zserv.h
index db7b70d7c4..36030d9a9a 100644
--- a/zebra/zserv.h
+++ b/zebra/zserv.h
@@ -215,16 +215,21 @@ struct zserv {
* relative to last_read_time.
*/
+ pthread_mutex_t stats_mtx;
+ /* BEGIN covered by stats_mtx */
+
/* monotime of client creation */
- _Atomic uint64_t connect_time;
+ uint64_t connect_time;
/* monotime of last message received */
- _Atomic uint64_t last_read_time;
+ uint64_t last_read_time;
/* monotime of last message sent */
- _Atomic uint64_t last_write_time;
+ uint64_t last_write_time;
/* command code of last message read */
- _Atomic uint64_t last_read_cmd;
+ uint64_t last_read_cmd;
/* command code of last message written */
- _Atomic uint64_t last_write_cmd;
+ uint64_t last_write_cmd;
+
+ /* END covered by stats_mtx */
/*
* Number of instances configured with