From 0b75fd1df8eff943c73c04635b37fcc9ddd820b9 Mon Sep 17 00:00:00 2001 From: Manuel de Brito Fontes Date: Tue, 16 Jun 2026 22:35:46 -0300 Subject: [PATCH] perf(qemu): strip unused device models from the build BOOT_TIMELINE put ~37ms of cold-start in QEMU launch (binary load + QOM type registration + machine/RAM setup), and the q35-vs-pc A/B confirmed it is device-set dependent, not machine dependent: the same devices are compiled in regardless of chipset. So the lever is compiling fewer devices. spinbox only ever instantiates q35/ich9 + virtio-pci (blk/net/rng/serial), vhost-vsock and virtio-mem on KVM. Every symbol disabled here is a leaf device model we never add (-nodefaults already excludes them at runtime): non-virtio NICs, sound, display/GPU adapters, USB controllers+devices, SCSI HBAs + virtio-scsi, NVMe, SD/MMC, TPM, parallel and test devices. Compiling them out shrinks the binary (faster exec/page-in) and cuts QOM type init. Done via the existing default.mak CONFIG_X=n mechanism (same as CXL). A machine-selected symbol is silently kept by Kconfig, so =n is safe; we touch only leaves, so nothing we need loses a build dependency. Chipset/IDE/AHCI/ floppy/IOMMU are left alone (machine-coupled). Co-Authored-By: Claude Opus 4.8 (1M context) --- Dockerfile.qemu | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/Dockerfile.qemu b/Dockerfile.qemu index 83272e4..fa7cac1 100644 --- a/Dockerfile.qemu +++ b/Dockerfile.qemu @@ -88,9 +88,27 @@ RUN --mount=type=cache,sharing=locked,id=qemu-src-${QEMU_VERSION},target=/var/ca --mount=type=cache,sharing=locked,id=qemu-build-${QEMU_VERSION},target=/build/qemu-build \ cd qemu-build && \ if [ ! -f Makefile ]; then \ - echo "Disabling CXL device support (debloat)..."; \ + echo "Debloating QEMU device set (smaller binary + faster startup)..."; \ DEVMAK="/var/cache/qemu/qemu-${QEMU_VERSION}/configs/devices/x86_64-softmmu/default.mak"; \ - grep -q '^CONFIG_CXL=n' "$DEVMAK" || echo 'CONFIG_CXL=n' >> "$DEVMAK"; \ + for sym in \ + CONFIG_CXL \ + CONFIG_E1000_PCI CONFIG_E1000E_PCI CONFIG_RTL8139_PCI CONFIG_VMXNET3_PCI \ + CONFIG_PCNET_PCI CONFIG_NE2000_PCI CONFIG_NE2000_ISA CONFIG_EEPRO100_PCI \ + CONFIG_TULIP CONFIG_SUNGEM \ + CONFIG_HDA CONFIG_AC97 CONFIG_ES1370 CONFIG_CS4231A CONFIG_SB16 CONFIG_GUS CONFIG_ADLIB \ + CONFIG_VGA_CIRRUS CONFIG_VGA_PCI CONFIG_VMWARE_VGA CONFIG_QXL CONFIG_ATI_VGA \ + CONFIG_BOCHS_DISPLAY CONFIG_VIRTIO_VGA CONFIG_VIRTIO_GPU CONFIG_VIRTIO_GPU_PCI CONFIG_RAMFB \ + CONFIG_USB_UHCI CONFIG_USB_OHCI CONFIG_USB_EHCI CONFIG_USB_XHCI CONFIG_USB_XHCI_NEC \ + CONFIG_USB_STORAGE_BOT CONFIG_USB_STORAGE_UAS CONFIG_USB_AUDIO CONFIG_USB_SERIAL \ + CONFIG_USB_NETWORK CONFIG_USB_HID CONFIG_USB_SMARTCARD \ + CONFIG_MEGASAS_SCSI_PCI CONFIG_MPTSAS_SCSI_PCI CONFIG_LSI_SCSI_PCI \ + CONFIG_VMW_PVSCSI_SCSI_PCI CONFIG_ESP_PCI CONFIG_VIRTIO_SCSI \ + CONFIG_NVME_PCI CONFIG_SDHCI CONFIG_SDHCI_PCI \ + CONFIG_TPM_TIS_ISA CONFIG_TPM_CRB CONFIG_TPM_EMULATOR CONFIG_TPM_PASSTHROUGH \ + CONFIG_PARALLEL CONFIG_PARALLEL_ISA CONFIG_EDU CONFIG_PCI_TESTDEV CONFIG_IVSHMEM_DEVICE \ + ; do \ + grep -q "^${sym}=n" "$DEVMAK" || echo "${sym}=n" >> "$DEVMAK"; \ + done; \ echo "Running QEMU configure (first build)..."; \ /var/cache/qemu/qemu-${QEMU_VERSION}/configure \ --prefix=/opt/qemu \