Files
takana/docs/evidencia/tasas-kernel-2026-08-29/linux-generic-btf.toml
T
SergioandClaude Opus 5 56e59b821a SDD 25 H7: BTF cuesta +14,97% de bzImage — medido construyendo, no estimado
Era el ultimo hueco medible de SDD 25 en esta maquina: H7 tenia el precio en cuatro partes
pero no el numero en bytes, que es como se pago H1.

Se construyo una copia derivada de linux-generic con UNA sola diferencia en el .config
(DEBUG_INFO_DWARF5 + DEBUG_INFO_BTF) y todo lo demas byte a byte igual:

  bzImage sin BTF : 16 937 984 B
  bzImage con BTF : 19 473 408 B   (+2 535 424 B = +2,42 MiB = +14,97%)
  seccion .BTF    :  7 888 166 B sin comprimir, entran comprimidos 3,11x

Contra la unica vara comparable: H1 (MEMCG+PSI) costo +80 KiB / +0,49% del mismo bzImage
=> BTF cuesta 31 veces eso. No lo decide, pero lo saca de "un re-hasheo y ya".

Sobre linux-generic y no sobre linux, que es mas barato: BTF tiene depends on BPF_SYSCALL y
el .config sellado de linux lo trae APAGADO, asi que medir ahi habria mezclado dos precios.

TRES cosas que salieron construyendo y no leyendo:

1. Una QUINTA parte del precio que nadie habia nombrado: hace falta python3. BTF hace que
   kbuild descienda a tools/bpf/resolve_btfids, que compila un libbpf vendorizado cuyo
   Makefile genera bpf_helper_defs.h con un script de Python (Error 127).

2. El numero de Artix fallaba en la direccion CONTRARIA a la esperable. El doc decia que sus
   6,4 MB "no dicen nada de uno monolitico y pelado"; el nuestro sale MAS GRANDE, 7,5 MiB.
   Artix es modular y su .BTF cubre solo el core built-in; el nuestro es monolitico y los
   tipos de i915+nouveau+radeon+iwlwifi entran todos.

3. Una trampa de kconfig que es CLAUDE.md §3 dentro de make: scripts/pahole-version.sh
   imprime 0 si pahole no esta en el PATH, el depends on PAHOLE_VERSION >= 122 deja de
   cumplirse, y olddefconfig BORRA la linea en silencio. El build sale OK y sella un kernel
   SIN BTF diciendo que todo fue bien. Por eso la receta comprueba el .config PRODUCIDO y
   sale 1 si no esta. Salio OK, lo que ademas paga la parte (3) del precio: el pahole
   estatico de ayer se encuentra y se ejecuta DENTRO del sandbox.

El artefacto de medicion se borro a proposito: `hammer kernel contract --sealed` lo listaba
como SIN COMPROBAR (no declara [[target]], que es lo que exige H8), o sea un aviso permanente
en un fichero que el cron commitea cada 30 min. Un aviso fijo que no corresponde a ningun
problema es como se deja de leer un vigia. La receta derivada queda en la evidencia.

Nada del corpus se re-hasheo: la derivada vive fuera de recipes/ y el catalogo se le presta
por symlinks.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-08-31 20:55:26 +00:00

102 lines
6.6 KiB
TOML

# ── RECETA DE MEDICIÓN, NO DE CATÁLOGO ────────────────────────────────────────────────────────
# Copia de `recipes/linux-generic.toml` cuyo ÚNICO propósito es ponerle número a SDD 25 §7-H7: qué
# cuesta en bytes de bzImage encender `DEBUG_INFO_BTF`. Vive en `work/` —fuera de `recipes/`— para
# no entrar al grafo compartido como deuda, y el catálogo se le presta por symlinks en el mismo
# directorio (`hammer build` no tiene `--base-dir`; sólo el fallback al catálogo padre).
#
# POR QUÉ SOBRE linux-generic Y NO SOBRE linux (que es más barato de construir): BTF tiene
# `depends on BPF_SYSCALL`, y el `.config` sellado de `linux` lo trae APAGADO. Medir ahí obligaría a
# encender BPF_SYSCALL a la vez, y el delta mezclaría dos cosas. `linux-generic` ya lo trae ⇒ la
# única diferencia con el artefacto sellado son las líneas de DWARF/BTF, y el delta es limpio.
#
# BASELINE contra el que se compara: el bzImage del `linux-generic` VIGENTE, 16 937 984 bytes
# (store/23f1cc43…-linux-generic/boot/bzImage), que es el mismo número que cita §7-H1.
#
# `-j2` en vez de `$(nproc)`: con `-g` cada gcc pesa más y momento tiene ~4 G disponibles. El
# paralelismo NO cambia los bytes del bzImage, que es lo único que se mide acá; capar `-j` en una
# receta de catálogo sería otra cosa (re-hashea), pero esta receta no es de catálogo.
name = "linux-generic-btf"
version = "7.1.2"
license = "GPL-2.0-only WITH Linux-syscall-note"
[source]
tarball = "https://mirrors.edge.kernel.org/pub/linux/kernel/v7.x/linux-7.1.2.tar.gz"
sha256 = "b43e0a2db2a89fc5a88f54417ea13a3f05fbb17fdaf53015ce16525750a2db83"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
[deps]
# `python3`: DESCUBIERTO construyendo (2026-08-31). Encender BTF hace que kbuild descienda a
# `tools/bpf/resolve_btfids`, que compila un libbpf VENDORIZADO, y su Makefile genera
# `bpf_helper_defs.h` con un script de Python ⇒ `env: 'python3': No such file or directory`,
# Error 127. No sale en ninguna documentación de BTF: sale construyendo.
build = ["flex", "bison", "m4", "openssl", "elfutils", "make", "dwarves", "python3"]
# SDD 25 §7-H1: `-e MEMCG -e PSI`. Sin MEMCG el fichero `memory.max` NO EXISTE y
# `arje-incarnate::cgroup` sólo emite un `warn!` ⇒ la Card corre SIN tope de memoria. Va en la
# fase configure porque el .config ES la identidad del artefacto (SDD 22 §1): esto re-hashea el
# kernel a propósito. Comprobable con `hammer kernel contract` sobre el config YA PRODUCIDO.
[build.phases]
configure = """
make ARCH=x86_64 defconfig && \
scripts/config -d MODULE_SIG -d MODULE_SIG_ALL -d MODULES \
-e DEBUG_KERNEL -e DEBUG_INFO_DWARF5 -d DEBUG_INFO_REDUCED -d DEBUG_INFO_SPLIT \
-e DEBUG_INFO_BTF \
-d UNWINDER_ORC -e UNWINDER_FRAME_POINTER \
-e BLK_DEV_INITRD -e DEVTMPFS -e DEVTMPFS_MOUNT -e TMPFS \
-e OVERLAY_FS -e USER_NS -e NAMESPACES \
-e FANOTIFY -e FANOTIFY_ACCESS_PERMISSIONS \
-e OVERLAY_FS_REDIRECT_DIR -e OVERLAY_FS_INDEX -e OVERLAY_FS_XINO_AUTO -e OVERLAY_FS_METACOPY \
-e SECURITY -e SECURITY_LANDLOCK -e AUDIT -e IO_URING -e BPF_SYSCALL \
-e MEMCG -e PSI -d PSI_DEFAULT_DISABLED \
-e VIRTIO -e VIRTIO_PCI -e VIRTIO_BLK -e VIRTIO_NET -e DRM_VIRTIO_GPU \
-e PCI -e PCIEPORTBUS -e ACPI -e FW_LOADER \
-e EXT4_FS -e SQUASHFS -e SQUASHFS_XZ -e SQUASHFS_ZSTD -e SQUASHFS_LZ4 \
-e SATA_AHCI -e ATA -e ATA_PIIX -e SCSI -e BLK_DEV_SD -e BLK_DEV_SR -e BLK_DEV_LOOP \
-e NVME_CORE -e BLK_DEV_NVME \
-e MMC -e MMC_BLOCK -e MMC_SDHCI -e MMC_SDHCI_PCI -e MMC_SDHCI_ACPI \
-e USB_SUPPORT -e USB -e USB_PCI -e USB_XHCI_HCD -e USB_XHCI_PCI \
-e USB_EHCI_HCD -e USB_EHCI_PCI -e USB_OHCI_HCD -e USB_UHCI_HCD -e USB_STORAGE \
-e HID -e HID_GENERIC -e USB_HID -e HID_MULTITOUCH -e INPUT_EVDEV \
-e INPUT_KEYBOARD -e KEYBOARD_ATKBD -e INPUT_MOUSE -e MOUSE_PS2 -e INPUT_TOUCHPAD \
-e SERIO -e SERIO_I8042 -e VT -e VT_CONSOLE \
-e DRM -e DRM_SIMPLEDRM -e SYSFB_SIMPLEFB -e FB -e FB_EFI -e FB_VESA \
-e DRM_I915 -e DRM_RADEON -e DRM_NOUVEAU -d DRM_AMDGPU -d DRM_AMD_DC -d HSA_AMD \
-e DRM_FBDEV_EMULATION -e FRAMEBUFFER_CONSOLE -e FRAMEBUFFER_CONSOLE_DETECT_PRIMARY \
-e EFI -e EFI_STUB -e EFI_PARTITION -e EFIVAR_FS -e CMDLINE_BOOL \
-e VFAT_FS -e FAT_FS -e MSDOS_FS -e NLS_CODEPAGE_437 -e NLS_ISO8859_1 -e NLS_UTF8 \
-e ISO9660_FS -e JOLIET -e DEVTMPFS \
-e WLAN -e WIRELESS -e CFG80211 -e MAC80211 -e RFKILL \
-e WLAN_VENDOR_INTEL -e IWLWIFI -e IWLMVM -e IWLDVM \
-e ETHERNET -e NET_VENDOR_INTEL -e E1000 -e E1000E -e IGB -e IGC \
-e NET_VENDOR_REALTEK -e R8169 -e NET_VENDOR_BROADCOM -e TG3 \
-e USB_NET_DRIVERS -e USB_USBNET -e USB_NET_CDCETHER -e USB_NET_CDC_NCM -e USB_NET_RNDIS_HOST \
-d SOUND -d SND -d MEDIA_SUPPORT -d INFINIBAND -d BT -d NFC -d CAN \
-d WATCHDOG -d USB4 -d FIREWIRE -d DEBUG_WX \
-d XFS_FS -d BTRFS_FS -d F2FS_FS -d JFS_FS -d GFS2_FS -d NTFS3_FS && \
scripts/config --set-str CMDLINE "console=tty0 console=ttyS0,115200 ignore_loglevel" && \
make ARCH=x86_64 olddefconfig && \
pahole --version && \
{ grep -q '^CONFIG_DEBUG_INFO_BTF=y' .config || { echo "FATAL: DEBUG_INFO_BTF no quedo en el .config PRODUCIDO pahole ausente durante configure?"; grep -E 'BTF|PAHOLE|DEBUG_INFO' .config; exit 1; }; } && \
echo "OK: CONFIG_DEBUG_INFO_BTF=y en el .config producido"
"""
# amdgpu (AMD moderno) NO compila en 7.1 con el gcc del gueto (ICE sin mensaje en amdgpu_userq_fence.c)
# y syncconfig lo re-activaba pese a -d en kconfig (default-y de DRM_AMD_DC + un select que no aparece).
# SLEDGEHAMMER GARANTIZADO: borro las líneas `obj-$(CONFIG_DRM_AMDGPU)+= amd/...` del Makefile del drm
# ⇒ amd/{amdgpu,amdxcp,display} nunca se descienden, sin importar kconfig. amdgpu es self-contained
# (nada del core lo referencia) ⇒ excluirlo es seguro. radeon (AMD viejo) + i915 + nouveau quedan.
compile = "sed -i '/CONFIG_DRM_AMDGPU)+= amd/d' drivers/gpu/drm/Makefile && make ARCH=x86_64 CC=gcc HOSTCC=gcc -j2 bzImage"
install = """
mkdir -p /out/boot /out/medicion && \
cp arch/x86/boot/bzImage /out/boot/bzImage && \
cp .config /out/boot/config-7.1.2-generic-btf && \
stat -c 'vmlinux %s bytes' vmlinux > /out/medicion/tamanos.txt && \
stat -c 'bzImage %s bytes' arch/x86/boot/bzImage >> /out/medicion/tamanos.txt && \
{ readelf -SW vmlinux | grep -E 'BTF|debug_info' >> /out/medicion/tamanos.txt || echo '(readelf no disponible)' >> /out/medicion/tamanos.txt; } && \
{ objcopy --dump-section .BTF=/out/medicion/vmlinux.BTF vmlinux && stat -c '.BTF %s bytes' /out/medicion/vmlinux.BTF >> /out/medicion/tamanos.txt; } || echo '(objcopy fallo)' >> /out/medicion/tamanos.txt
"""