From 54623c4798deca35f0a1714b68788eee5f82353d Mon Sep 17 00:00:00 2001 From: "raphael.gavache" Date: Thu, 6 Nov 2025 17:45:05 -0500 Subject: [PATCH 1/3] move to syscall --- .../servicediscovery/MemFDUnixWriter.java | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java index 480c8fbd79c..5f8db58efc6 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java @@ -13,7 +13,7 @@ public class MemFDUnixWriter implements ForeignMemoryWriter { private static final Logger log = LoggerFactory.getLogger(MemFDUnixWriter.class); private interface LibC extends Library { - int memfd_create(String name, int flags); + int syscall(int number, Object... args); NativeLong write(int fd, Pointer buf, NativeLong count); @@ -36,7 +36,13 @@ private interface LibC extends Library { public void write(String fileName, byte[] payload) { final LibC libc = Native.load("c", LibC.class); - int memFd = libc.memfd_create(fileName, MFD_CLOEXEC | MFD_ALLOW_SEALING); + String arch = System.getProperty("os.arch"); + int memfdSyscall = getMemfdSyscall(arch); + if (memfdSyscall <= 0) { + log.debug("service discovery not supported for arch={}", arch); + return; + } + int memFd = libc.syscall(memfdSyscall, fileName, MFD_CLOEXEC | MFD_ALLOW_SEALING); if (memFd < 0) { log.warn("{} memfd create failed, errno={}", fileName, Native.getLastError()); return; @@ -60,4 +66,36 @@ public void write(String fileName, byte[] payload) { } // memfd is not closed to keep it readable for the lifetime of the process. } + + private static int getMemfdSyscall(String arch) { + switch (arch.toLowerCase()) { + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/x86_64/bits/syscall.h.in#L320 + case "x86_64": + return 319; + case "x64": + return 319; + case "amd64": + return 319; + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/i386/bits/syscall.h.in#L356 + case "x386": + return 356; + case "86": + return 356; + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/aarch64/bits/syscall.h.in#L264 + case "aarch64": + return 279; + case "arm64": + return 279; + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/arm/bits/syscall.h.in#L343 + case "arm": + return 385; + case "arm32": + return 385; + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/powerpc64/bits/syscall.h.in#L350 + case "ppc64": + return 360; + default: + return -1; + } + } } From 353ebe0348c625f9988d2ae3054654b9a9b23296 Mon Sep 17 00:00:00 2001 From: "raphael.gavache" Date: Fri, 7 Nov 2025 14:20:59 -0500 Subject: [PATCH 2/3] update after review --- .../servicediscovery/MemFDUnixWriter.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java index 5f8db58efc6..2afbb9d0cc1 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java @@ -1,5 +1,7 @@ package datadog.trace.agent.tooling.servicediscovery; +import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; + import com.sun.jna.Library; import com.sun.jna.Memory; import com.sun.jna.Native; @@ -39,7 +41,7 @@ public void write(String fileName, byte[] payload) { String arch = System.getProperty("os.arch"); int memfdSyscall = getMemfdSyscall(arch); if (memfdSyscall <= 0) { - log.debug("service discovery not supported for arch={}", arch); + log.debug(SEND_TELEMETRY, "service discovery not supported for arch={}", arch); return; } int memFd = libc.syscall(memfdSyscall, fileName, MFD_CLOEXEC | MFD_ALLOW_SEALING); @@ -69,30 +71,24 @@ public void write(String fileName, byte[] payload) { private static int getMemfdSyscall(String arch) { switch (arch.toLowerCase()) { - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/x86_64/bits/syscall.h.in#L320 case "x86_64": - return 319; case "x64": - return 319; case "amd64": + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/x86_64/bits/syscall.h.in#L320 return 319; - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/i386/bits/syscall.h.in#L356 case "x386": + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/i386/bits/syscall.h.in#L356 return 356; - case "86": - return 356; - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/aarch64/bits/syscall.h.in#L264 case "aarch64": - return 279; case "arm64": + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/aarch64/bits/syscall.h.in#L264 return 279; - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/arm/bits/syscall.h.in#L343 case "arm": - return 385; case "arm32": + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/arm/bits/syscall.h.in#L343 return 385; - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/powerpc64/bits/syscall.h.in#L350 case "ppc64": + // https://elixir.bootlin.com/musl/v1.2.5/source/arch/powerpc64/bits/syscall.h.in#L350 return 360; default: return -1; From d763cd0265a62cf2f4689bfc56d623fa7c9c088e Mon Sep 17 00:00:00 2001 From: "raphael.gavache" Date: Fri, 14 Nov 2025 14:50:47 -0500 Subject: [PATCH 3/3] update after review --- .../servicediscovery/MemFDUnixWriter.java | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java index 2afbb9d0cc1..6a080aafd35 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java @@ -7,6 +7,7 @@ import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; +import datadog.environment.OperatingSystem; import datadog.trace.core.servicediscovery.ForeignMemoryWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,7 +39,7 @@ private interface LibC extends Library { public void write(String fileName, byte[] payload) { final LibC libc = Native.load("c", LibC.class); - String arch = System.getProperty("os.arch"); + OperatingSystem.Architecture arch = OperatingSystem.architecture(); int memfdSyscall = getMemfdSyscall(arch); if (memfdSyscall <= 0) { log.debug(SEND_TELEMETRY, "service discovery not supported for arch={}", arch); @@ -69,27 +70,20 @@ public void write(String fileName, byte[] payload) { // memfd is not closed to keep it readable for the lifetime of the process. } - private static int getMemfdSyscall(String arch) { - switch (arch.toLowerCase()) { - case "x86_64": - case "x64": - case "amd64": - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/x86_64/bits/syscall.h.in#L320 + private static int getMemfdSyscall(OperatingSystem.Architecture arch) { + switch (arch) { + case X64: + // https://github.com/torvalds/linux/blob/v6.17/arch/x86/entry/syscalls/syscall_64.tbl#L331 return 319; - case "x386": - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/i386/bits/syscall.h.in#L356 + case X86: + // https://github.com/torvalds/linux/blob/v6.17/arch/x86/entry/syscalls/syscall_32.tbl#L371 return 356; - case "aarch64": - case "arm64": - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/aarch64/bits/syscall.h.in#L264 + case ARM64: + // https://github.com/torvalds/linux/blob/v6.17/scripts/syscall.tbl#L329 return 279; - case "arm": - case "arm32": - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/arm/bits/syscall.h.in#L343 + case ARM: + // https://github.com/torvalds/linux/blob/v6.17/arch/arm64/tools/syscall_32.tbl#L400 return 385; - case "ppc64": - // https://elixir.bootlin.com/musl/v1.2.5/source/arch/powerpc64/bits/syscall.h.in#L350 - return 360; default: return -1; }