Skip to content

Heads-up: riscv64 build fails at ink_queue.h "unsupported processor" (no RISC-V freelist case) #13555

Description

@randomizedcoder

G'day ATS team,

First off — thank you for Traffic Server. We're big fans of the project, and we've been working on packaging ATS 10 for Nixpkgs (the package set behind NixOS). Work-in-progress PR here: NixOS/nixpkgs#474177

While testing that package across a few architectures, we stumbled onto a small issue we thought was worth flagging — not urgent at all, purely a friendly heads-up for if/when RISC-V is on your radar.

What we saw

x86_64 and aarch64 build and run great (we tested aarch64 natively on real hardware). On riscv64 the build stops at:

include/tscore/ink_queue.h:177:2: error: #error "unsupported processor"

This reproduces both cross-compiling to riscv64 and building natively on a riscv64 board (SpacemiT K1). It's present on master as well as the 10.2.0-rc1 tag.

Why it happens

The lock-free freelist head in include/tscore/ink_queue.h chooses one of two strategies:

  1. a generic path when the toolchain has a lock-free 128-bit CAS — #elif TS_HAS_128BIT_CAS (line ~127), or
  2. an architecture-specific pointer-tagging layout, hand-coded only for x86_64 (line ~133) and aarch64 (line ~157); everything else hits the #else#error (line ~177).

TS_HAS_128BIT_CAS is decided by cmake/Check128BitCas.cmake, which compiles:

int main(void) {
    __int128_t x = 0;
    return __sync_bool_compare_and_swap(&x, 0, 10);
}

On riscv64 there's no inline lock-free 128-bit CAS, so this lowers to a libatomic call and the probe fails to compile/link; the fallback retry uses -mcx16, which is x86-only. So TS_HAS_128BIT_CAS ends up off, and with no riscv64 branch in FREELIST_POINTER, the build falls through to the #error.

Possible directions (just ideas — you know the code far better than we do)

  • Add a riscv64 case to the FREELIST_POINTER / FREELIST_VERSION / SET_FREELIST_POINTER_VERSION macros, analogous to the existing aarch64 block. One thing to watch: riscv64 Linux virtual-address width isn't fixed (Sv39 / Sv48 / Sv57), so the number of spare high bits available for the version counter varies — the aarch64 block assumes a 52-bit VA, whereas a conservative riscv64 layout might need fewer version bits.
  • Or allow the generic TS_HAS_128BIT_CAS path on riscv64 (e.g. via libatomic), accepting that 128-bit CAS there may not be lock-free without the Zacas extension.

Either way, we didn't want to presume the right approach — mostly just wanted to put this on your radar.

Offer to help

We have a riscv64 board (SpacemiT K1) and a cross-compile setup, so we're very happy to test any patch on real RISC-V hardware if that's useful.

Thanks again for all the work on Traffic Server!

Environment

  • ATS: 10.2.0-rc1 tag and master
  • Arch: riscv64 (reproduced cross-compiling on x86_64 and natively on a SpacemiT K1)
  • Toolchain: GCC (via Nixpkgs)

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions