# git rev-parse -q --verify 8acecf9eda1846b9be8114d9cd665fbc38af223e^{commit} 8acecf9eda1846b9be8114d9cd665fbc38af223e already have revision, skipping fetch # git checkout -q -f -B kisskb 8acecf9eda1846b9be8114d9cd665fbc38af223e # git clean -qxdf # < git log -1 # commit 8acecf9eda1846b9be8114d9cd665fbc38af223e # Author: Russell Currey # Date: Wed Mar 22 14:53:22 2023 +1100 # # powerpc/iommu: Fix notifiers being shared by PCI and VIO buses # # fail_iommu_setup() registers the fail_iommu_bus_notifier struct to both # PCI and VIO buses. struct notifier_block is a linked list node, so this # causes any notifiers later registered to either bus type to also be # registered to the other since they share the same node. # # This causes issues in (at least) the vgaarb code, which registers a # notifier for PCI buses. pci_notify() ends up being called on a vio # device, converted with to_pci_dev() even though it's not a PCI device, # and finally makes a bad access in vga_arbiter_add_pci_device() as # discovered with KASAN: # # BUG: KASAN: slab-out-of-bounds in vga_arbiter_add_pci_device+0x60/0xe00 # Read of size 4 at addr c000000264c26fdc by task swapper/0/1 # # Call Trace: # dump_stack_lvl+0x1bc/0x2b8 (unreliable) # print_report+0x3f4/0xc60 # kasan_report+0x244/0x698 # __asan_load4+0xe8/0x250 # vga_arbiter_add_pci_device+0x60/0xe00 # pci_notify+0x88/0x444 # notifier_call_chain+0x104/0x320 # blocking_notifier_call_chain+0xa0/0x140 # device_add+0xac8/0x1d30 # device_register+0x58/0x80 # vio_register_device_node+0x9ac/0xce0 # vio_bus_scan_register_devices+0xc4/0x13c # __machine_initcall_pseries_vio_device_init+0x94/0xf0 # do_one_initcall+0x12c/0xaa8 # kernel_init_freeable+0xa48/0xba8 # kernel_init+0x64/0x400 # ret_from_kernel_thread+0x5c/0x64 # # Fix this by creating separate notifier_block structs for each bus type. # # Fixes: d6b9a81b2a45 ("powerpc: IOMMU fault injection") # Reported-by: Nageswara R Sastry # Signed-off-by: Russell Currey # Tested-by: Nageswara R Sastry # Reviewed-by: Andrew Donnellan # Signed-off-by: Michael Ellerman # Link: https://msgid.link/20230322035322.328709-1-ruscur@russell.cc # < /opt/cross/kisskb/korg/gcc-5.5.0-nolibc/powerpc64-linux/bin/powerpc64-linux-gcc --version # < /opt/cross/kisskb/korg/gcc-5.5.0-nolibc/powerpc64-linux/bin/powerpc64-linux-ld --version # < git log --format=%s --max-count=1 8acecf9eda1846b9be8114d9cd665fbc38af223e # make -s -j 160 ARCH=powerpc O=/kisskb/build/powerpc-next_pseries_defconfig+NO_SPLPAR_powerpc-gcc5 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-5.5.0-nolibc/powerpc64-linux/bin/powerpc64-linux- pseries_defconfig Using /kisskb/src/arch/powerpc/configs/ppc64_defconfig as base Merging /kisskb/src/arch/powerpc/configs/le.config Merging /kisskb/src/arch/powerpc/configs/guest.config Value of CONFIG_VIRTIO_BLK is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_VIRTIO_BLK=m New value: CONFIG_VIRTIO_BLK=y Value of CONFIG_SCSI_VIRTIO is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_SCSI_VIRTIO=m New value: CONFIG_SCSI_VIRTIO=y Value of CONFIG_VIRTIO_NET is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_VIRTIO_NET=m New value: CONFIG_VIRTIO_NET=y Value of CONFIG_VIRTIO_CONSOLE is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_VIRTIO_CONSOLE=m New value: CONFIG_VIRTIO_CONSOLE=y Value of CONFIG_VIRTIO_PCI is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_VIRTIO_PCI=m New value: CONFIG_VIRTIO_PCI=y Value of CONFIG_VIRTIO_BALLOON is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_VIRTIO_BALLOON=m New value: CONFIG_VIRTIO_BALLOON=y Value of CONFIG_VHOST_NET is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_VHOST_NET=m New value: CONFIG_VHOST_NET=y Value of CONFIG_IBMVETH is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_IBMVETH=m New value: CONFIG_IBMVETH=y Value of CONFIG_IBMVNIC is redefined by fragment /kisskb/src/arch/powerpc/configs/guest.config: Previous value: CONFIG_IBMVNIC=m New value: CONFIG_IBMVNIC=y Merging /kisskb/src/arch/powerpc/configs/kvm_guest.config # # merged configuration written to .config (needs make) # # Added to kconfig CONFIG_PPC_SPLPAR=n # < make -s -j 160 ARCH=powerpc O=/kisskb/build/powerpc-next_pseries_defconfig+NO_SPLPAR_powerpc-gcc5 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-5.5.0-nolibc/powerpc64-linux/bin/powerpc64-linux- help # make -s -j 160 ARCH=powerpc O=/kisskb/build/powerpc-next_pseries_defconfig+NO_SPLPAR_powerpc-gcc5 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-5.5.0-nolibc/powerpc64-linux/bin/powerpc64-linux- olddefconfig # make -s -j 160 ARCH=powerpc O=/kisskb/build/powerpc-next_pseries_defconfig+NO_SPLPAR_powerpc-gcc5 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-5.5.0-nolibc/powerpc64-linux/bin/powerpc64-linux- Completed OK # rm -rf /kisskb/build/powerpc-next_pseries_defconfig+NO_SPLPAR_powerpc-gcc5 # Build took: 0:03:07.547316