git: db6d744b6034 - main - net/ucx: Fix mm signal socket binding on FreeBSD
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 08 Apr 2026 22:42:41 UTC
The branch main has been updated by vvd:
URL: https://cgit.FreeBSD.org/ports/commit/?id=db6d744b60348636c7a87c3c7fc181afd9b71994
commit db6d744b60348636c7a87c3c7fc181afd9b71994
Author: Generic Rikka <rikka.goering@outlook.de>
AuthorDate: 2026-04-08 22:37:32 +0000
Commit: Vladimir Druzenko <vvd@FreeBSD.org>
CommitDate: 2026-04-08 22:42:19 +0000
net/ucx: Fix mm signal socket binding on FreeBSD
Replace Linux-style UNIX domain socket autobind logic in the mm
signaling path with explicit pathname-based binding on FreeBSD and
remove the socket path during cleanup.
This fixes FreeBSD runtime failures in the mm shared-memory signaling
path.
PR: 293867
Sponsored by: UNIS Labs
MFH: 2026Q2
: Update =>
Changelog:
PR:
Sponsored by: UNIS Labs
---
net/ucx/Makefile | 1 +
net/ucx/files/patch-src_uct_sm_mm_base_mm__iface.c | 87 ++++++++++++++++++++++
2 files changed, 88 insertions(+)
diff --git a/net/ucx/Makefile b/net/ucx/Makefile
index f7cdf5e1385b..0df5bef86db1 100644
--- a/net/ucx/Makefile
+++ b/net/ucx/Makefile
@@ -1,5 +1,6 @@
PORTNAME= ucx
DISTVERSION= 1.20.0
+PORTREVISION= 1
CATEGORIES= net
MASTER_SITES= https://github.com/openucx/ucx/releases/download/v${DISTVERSION}/
diff --git a/net/ucx/files/patch-src_uct_sm_mm_base_mm__iface.c b/net/ucx/files/patch-src_uct_sm_mm_base_mm__iface.c
new file mode 100644
index 000000000000..000376248199
--- /dev/null
+++ b/net/ucx/files/patch-src_uct_sm_mm_base_mm__iface.c
@@ -0,0 +1,87 @@
+--- src/uct/sm/mm/base/mm_iface.c.orig 2026-03-14 22:02:10 UTC
++++ src/uct/sm/mm/base/mm_iface.c
+@@ -19,6 +19,9 @@
+ #include <ucs/async/async.h>
+ #include <ucs/sys/string.h>
+ #include <sys/poll.h>
++#include <sys/un.h>
++#include <stddef.h>
++#include <unistd.h>
+
+
+ /* Maximal number of events to clear from the signaling pipe in single call */
+@@ -681,6 +684,10 @@ static ucs_status_t uct_mm_iface_create_signal_fd(uct_
+ ucs_status_t status;
+ socklen_t addrlen;
+ struct sockaddr_un bind_addr;
++#if defined(__FreeBSD__)
++ const char *tmpdir;
++ int path_len;
++#endif
+ int ret;
+
+ /* Create a UNIX domain socket to send and receive wakeup signal from remote processes */
+@@ -700,10 +707,33 @@ static ucs_status_t uct_mm_iface_create_signal_fd(uct_
+ /* Bind the signal socket to automatic address */
+ bind_addr.sun_family = AF_UNIX;
+ memset(bind_addr.sun_path, 0, sizeof(bind_addr.sun_path));
++#if defined(__FreeBSD__)
++ tmpdir = ucs_get_tmpdir();
++ path_len = snprintf(bind_addr.sun_path, sizeof(bind_addr.sun_path),
++ "%s/ucx_mm.%ld.%p",
++ tmpdir, (long)getpid(), (void*)iface);
++ if ((path_len < 0) || ((size_t)path_len >= sizeof(bind_addr.sun_path))) {
++ ucs_error("Failed to generate unix domain socket path");
++ status = UCS_ERR_IO_ERROR;
++ goto err_close;
++ }
++
++ unlink(bind_addr.sun_path);
++
++ addrlen = offsetof(struct sockaddr_un, sun_path) + path_len + 1;
++ ret = bind(iface->signal_fd, (struct sockaddr*)&bind_addr, addrlen);
++#else
++ /* Linux autobind behavior */
+ ret = bind(iface->signal_fd, (struct sockaddr*)&bind_addr, sizeof(sa_family_t));
++#endif
+ if (ret < 0) {
+ ucs_error("Failed to auto-bind unix domain socket: %m");
+ status = UCS_ERR_IO_ERROR;
++#if defined(__FreeBSD__)
++ if (bind_addr.sun_path[0] != '\0') {
++ unlink(bind_addr.sun_path);
++ }
++#endif
+ goto err_close;
+ }
+
+@@ -718,6 +748,11 @@ static ucs_status_t uct_mm_iface_create_signal_fd(uct_
+ if (ret < 0) {
+ ucs_error("Failed to retrieve unix domain socket address: %m");
+ status = UCS_ERR_IO_ERROR;
++#if defined(__FreeBSD__)
++ if (bind_addr.sun_path[0] != '\0') {
++ unlink(bind_addr.sun_path);
++ }
++#endif
+ goto err_close;
+ }
+
+@@ -904,6 +939,17 @@ static UCS_CLASS_CLEANUP_FUNC(uct_mm_iface_t)
+
+ ucs_mpool_put(self->last_recv_desc);
+ ucs_mpool_cleanup(&self->recv_desc_mp, 1);
++
++#if defined(__FreeBSD__)
++ {
++ const struct sockaddr_un *sun =
++ (const struct sockaddr_un *)ucs_unaligned_ptr(&self->recv_fifo_ctl->signal_sockaddr);
++ if ((self->recv_fifo_ctl->signal_addrlen > offsetof(struct sockaddr_un, sun_path)) &&
++ (sun->sun_path[0] != '\0')) {
++ unlink(sun->sun_path);
++ }
++ }
++#endif
+ close(self->signal_fd);
+ uct_iface_mem_free(&self->recv_fifo_mem);
+ ucs_arbiter_cleanup(&self->arbiter);