Skip to content

Loading builds...

Changes

#2401 (Jul 31, 2026, 6:55:59 PM)

linuxlist: drop no-op prefetch() calls

prefetch() has always been a no-op stub in this header so calling
it buys nothing at runtime.  Drop all call sites and remove the
now-dead stub itself.

The macro was copied over from the Linux kernel, where prefetch()
is a real, arch-specific cache prefetch hint; here it never was
anything but an empty inline function.

Change-Id: Id84973330df44b4efdd1bd85e4b7c3cb88642f92
Related: OS#7036, OS#6858
Vadim Yanitskiy at

#2400 (Jul 31, 2026, 6:55:59 PM)

linuxlist: fix false-positive UBSan misaligned-access reports

llist_for_each_entry() and its variants terminate by comparing
&pos->member against head.  Once a full traversal reaches the end of a
non-empty list (or the list is empty to begin with), pos becomes a pure
container_of()-computed sentinel address that was never a real object
of typeof(*pos), only ever the plain 'struct llist_head *' passed in as
head.  Forming 'pos->member' on that address requires pos to satisfy
the alignment of typeof(*pos), which the sentinel does not necessarily
provide (e.g. embedded struct osmo_timer_list/gprs_nsvc on 32-bit ARM
with a 64-bit time_t need 8-byte alignment, while head itself is only
pointer-aligned) - tripping -fsanitize=alignment even though no real
object is ever misaligned or dereferenced.

Add __llist_member(), computing the same address via 'char *'
pointer arithmetic and an explicit cast to 'struct llist_head *', which
carries no alignment requirement of its own.  Use it for the loop
termination check, the "next" pointer computation, and the prefetch()
calls (dereferencing the returned struct llist_head * still only
requires pointer alignment, so prefetch() keeps working exactly
as before without reintroducing the false positive).

Change-Id: I0424e76e76d8aa9402bd1a5aefe789de16e72fae
Related: OS#7036, OS#6858
Vadim Yanitskiy at

#2399 (Jul 31, 2026, 6:40:54 PM)

linuxlist: fix false-positive UBSan misaligned-access reports

llist_for_each_entry() and its variants terminate by comparing
&pos->member against head.  Once a full traversal reaches the end of a
non-empty list (or the list is empty to begin with), pos becomes a pure
container_of()-computed sentinel address that was never a real object
of typeof(*pos), only ever the plain 'struct llist_head *' passed in as
head.  Forming 'pos->member' on that address requires pos to satisfy
the alignment of typeof(*pos), which the sentinel does not necessarily
provide (e.g. embedded struct osmo_timer_list/gprs_nsvc on 32-bit ARM
with a 64-bit time_t need 8-byte alignment, while head itself is only
pointer-aligned) - tripping -fsanitize=alignment even though no real
object is ever misaligned or dereferenced.

Add __llist_member(), computing the same address via 'char *'
pointer arithmetic and an explicit cast to 'struct llist_head *', which
carries no alignment requirement of its own.  Use it for the loop
termination check, the "next" pointer computation, and the prefetch()
calls (dereferencing the returned struct llist_head * still only
requires pointer alignment, so prefetch() keeps working exactly
as before without reintroducing the false positive).

Change-Id: I0424e76e76d8aa9402bd1a5aefe789de16e72fae
Related: OS#7036, OS#6858
Vadim Yanitskiy at

#2398 (Jul 31, 2026, 6:40:54 PM)

linuxlist: drop no-op prefetch() calls

prefetch() has always been a no-op stub in this header so calling
it buys nothing at runtime.  Drop all call sites and remove the
now-dead stub itself.

The macro was copied over from the Linux kernel, where prefetch()
is a real, arch-specific cache prefetch hint; here it never was
anything but an empty inline function.

Change-Id: Id84973330df44b4efdd1bd85e4b7c3cb88642f92
Related: OS#7036, OS#6858
Vadim Yanitskiy at

#2397 (Jul 28, 2026, 9:37:50 AM)

osmo_io: add osmo_iofd_flush() to transmit the pending Tx queue

osmo_iofd_write_msgb() and friends only enqueue the given message;
the actual transmission happens asynchronously from within
osmo_select_main().  An application that needs to say 'goodbye'
right before calling osmo_iofd_free() (think of a connection
teardown datagram, like TRXC "CMD POWEROFF") currently has no way
to do so reliably: osmo_iofd_free() discards the Tx queue, so a
message enqueued in the same event loop iteration never reaches
the socket.

Add osmo_iofd_flush(), which synchronously transmits the pending
Tx queue, stopping on -EAGAIN or other errors.  Only the poll
backend implements it for now;  the io_uring backend returns
-ENOTSUP, since in-flight SQE submissions make a synchronous
flush non-trivial there.

Change-Id: I4e09e91e472a4441977a2c199c07c2cb8005632f
Vadim Yanitskiy at

#2396 (Jul 27, 2026, 1:29:34 PM)

tests/osmo_io: Remove unused variable

gcc 16.1.1 warns about it.

Change-Id: I0bdfe5ed6803042277ed8d21171b5f9c11495ca3
Pau Espin Pedrol at

#2395 (Jul 22, 2026, 9:32:18 AM)

Bump version: 1.14.0.6-ac289-dirty → 1.14.1

Change-Id: I671d21db38d915370e7191ada34ff640ee3a49dd
Oliver Smith at

#2394 (Jul 21, 2026, 6:20:39 PM)

gsm/Makefile.am: add missing kdf/crypto.h

Change-Id: I55fb391d61969357bb55f0834b389f9c701554aa
lynxis at