Предлагается собирать libuserspace-rcu с --enable-compiler-atomic-builtins, как это делает Fedora. == Проблема == На 32-битном x86 liburcu не поддерживает uatomic-операции над 64-битными типами: include/urcu/uatomic/x86.h определяет UATOMIC_HAS_ATOMIC_LLONG только при CAA_BITS_PER_LONG == 64. С 0.15.2 апстрим добавил на это static assert (коммиты e3985ee "Add UATOMIC_HAS_ATOMIC_INT/LLONG for x86" и d113221 "Add uatomic size static assert for 'x86'"). Раньше такой код собирался и падал уже при запуске в _uatomic_link_error() (см. https://github.com/gluster/glusterfs/issues/2979), а теперь падает при компиляции. Пример: glusterfs11 11.2 не собирается на i586 (задача #435696): ./glusterfs/gf-io.h:361:12: error: static assertion failed: "The architecture does not support atomic operations on types of sizeof(*(&gf_io.op_seq)) bytes." Те же ошибки в gf-io-legacy.c:48 и gf-io-uring.c:668. Это uatomic_add_return/uatomic_xchg над uint64_t. При этом сам процессор умеет такие операции: с -march=i586 GCC даёт __GCC_ATOMIC_LLONG_LOCK_FREE == 2 и генерирует lock cmpxchg8b без libatomic. == Как собирают другие == - Fedora (0.15.7): %configure --disable-static --enable-compiler-atomic-builtins. Включено в 0.15.0 (январь 2025), запись в changelog сделал Michael Jeanson, один из разработчиков liburcu. - Debian (0.15.7): без builtins, только --disable-compiler-tls на части архитектур. - Arch: голый ./configure. - ALT: %configure --disable-static. Апстрим liburcu не планирует 64-битные атомики в своём x86-32 asm. Опция builtins — штатный способ их получить: с ней uatomic.h подключает uatomic/builtins.h, где UATOMIC_HAS_ATOMIC_LLONG выставляется по __GCC_ATOMIC_LLONG_LOCK_FREE. == Проверка == Собрал 0.15.6 локально в обоих вариантах (x86_64): - набор экспортируемых символов всех 7 библиотек (liburcu, -bp, -cds, -common, -mb, -memb, -qsbr) совпадает, SONAME тот же (liburcu.so.8); - в установленных заголовках отличается только urcu/config.h: #define CONFIG_RCU_USE_ATOMIC_BUILTINS 1. Структуры не меняются. В README апстрима для этой опции нет предупреждения об изменении ABI, в отличие от --enable-cds-lfht-iter-debug; - тест с -m32 -march=i586: uatomic_add_return/uatomic_xchg над uint64_t со старыми заголовками дают ту же static assertion, с builtins компилируются в lock cmpxchg8b. == Нужна ли пересборка зависимых пакетов == Для совместимости — нет. ABI библиотеки не меняется, а uatomic/cmm_* — inline-макросы в заголовках. Уже собранные пакеты сохраняют встроенную старую реализацию (asm на x86, свои реализации на других архитектурах). Она работает с теми же переменными так же атомарно, как и __atomic-builtins, поэтому смешение старых бинарников с новой библиотекой корректно. С builtins заголовки требуют не менее C11/C++11 (compiler.h: #error, если __STDC_VERSION__ < 201112L). При GCC 15 по умолчанию gnu23/gnu++17, поэтому опасны только явные старые -std. Зависимые пакеты в Sisyphus (rdb, 9 штук) и их -std: - knot 3.5.3: не задаёт - glusterfs11 11.2: не задаёт - nfs-ganesha 9.9: не задаёт - partclone 0.3.47: -std=c99 только у цели partclone_exfat - xfsprogs 7.2.0: gnu11 / gnu++11 - bcachefs-tools 1.39.7: -std=gnu11 - netsniff-ng 0.6.9: в Makefile CFLAGS_DEF = -std=gnu99, но в ALT спек передаёт make CFLAGS='%optflags', и CFLAGS_DEF не используется - liblttng-ust 2.12.2: не задаёт - multipath-tools 0.14.3: create-config.mk проверяет <urcu.h> с gnu99 и при неудаче переключается на gnu11 (сделано именно под этот случай) == План == 1. libuserspace-rcu 0.15.7-alt2: добавить --enable-compiler-atomic-builtins в %configure. На e2k (свой патч userspace-rcu-e2k.patch, uatomic/gcc.h) нужно уточнить у e2k-порта, поддерживает ли lcc __atomic-builtins и C11. Если нет, оставить там прежнюю сборку (%ifnarch %e2k). 2. Отправить в girar и пересобрать с этой задачей все 9 зависимых пакетов на всех архитектурах (scripts/rdeps-rebuild.sh), чтобы убедиться, что ничего не ломается. Добавлять пересборки в задачу не обязательно, потому что ABI не меняется. 3. glusterfs11: пока отправляется с локальным патчем (uatomic над 64-битными полями заменён на __atomic_*), чтобы не ждать этой задачи. Когда изменение liburcu попадёт в Sisyphus, патч можно убрать при следующем обновлении.
libuserspace-rcu-0.15.7-alt2 -> sisyphus: Sat Oct 10 2026 Vitaly Lipatov <lav@altlinux.ru> 0.15.7-alt2 - build with --enable-compiler-atomic-builtins (except e2k): 64-bit uatomic operations on i586 (closes: #60896) - pack libraries to /usr libdir on usrmerged systems (keep /lib* otherwise) - drop unused aarch64 patch, use rm -v without -f