# git rev-parse -q --verify 1d0c32ec3b860a32df593a22bad0d1dbc5546a59^{commit} 1d0c32ec3b860a32df593a22bad0d1dbc5546a59 already have revision, skipping fetch # git checkout -q -f -B kisskb 1d0c32ec3b860a32df593a22bad0d1dbc5546a59 # git clean -qxdf # < git log -1 # commit 1d0c32ec3b860a32df593a22bad0d1dbc5546a59 # Author: Greg Kurz # Date: Wed Mar 18 18:43:30 2020 +0100 # # KVM: PPC: Fix kernel crash with PR KVM # # With PR KVM, shutting down a VM causes the host kernel to crash: # # [ 314.219284] BUG: Unable to handle kernel data access on read at 0xc00800000176c638 # [ 314.219299] Faulting instruction address: 0xc008000000d4ddb0 # cpu 0x0: Vector: 300 (Data Access) at [c00000036da077a0] # pc: c008000000d4ddb0: kvmppc_mmu_pte_flush_all+0x68/0xd0 [kvm_pr] # lr: c008000000d4dd94: kvmppc_mmu_pte_flush_all+0x4c/0xd0 [kvm_pr] # sp: c00000036da07a30 # msr: 900000010280b033 # dar: c00800000176c638 # dsisr: 40000000 # current = 0xc00000036d4c0000 # paca = 0xc000000001a00000 irqmask: 0x03 irq_happened: 0x01 # pid = 1992, comm = qemu-system-ppc # Linux version 5.6.0-master-gku+ (greg@palmb) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #17 SMP Wed Mar 18 13:49:29 CET 2020 # enter ? for help # [c00000036da07ab0] c008000000d4fbe0 kvmppc_mmu_destroy_pr+0x28/0x60 [kvm_pr] # [c00000036da07ae0] c0080000009eab8c kvmppc_mmu_destroy+0x34/0x50 [kvm] # [c00000036da07b00] c0080000009e50c0 kvm_arch_vcpu_destroy+0x108/0x140 [kvm] # [c00000036da07b30] c0080000009d1b50 kvm_vcpu_destroy+0x28/0x80 [kvm] # [c00000036da07b60] c0080000009e4434 kvm_arch_destroy_vm+0xbc/0x190 [kvm] # [c00000036da07ba0] c0080000009d9c2c kvm_put_kvm+0x1d4/0x3f0 [kvm] # [c00000036da07c00] c0080000009da760 kvm_vm_release+0x38/0x60 [kvm] # [c00000036da07c30] c000000000420be0 __fput+0xe0/0x310 # [c00000036da07c90] c0000000001747a0 task_work_run+0x150/0x1c0 # [c00000036da07cf0] c00000000014896c do_exit+0x44c/0xd00 # [c00000036da07dc0] c0000000001492f4 do_group_exit+0x64/0xd0 # [c00000036da07e00] c000000000149384 sys_exit_group+0x24/0x30 # [c00000036da07e20] c00000000000b9d0 system_call+0x5c/0x68 # # This is caused by a use-after-free in kvmppc_mmu_pte_flush_all() # which dereferences vcpu->arch.book3s which was previously freed by # kvmppc_core_vcpu_free_pr(). This happens because kvmppc_mmu_destroy() # is called after kvmppc_core_vcpu_free() since commit ff030fdf5573 # ("KVM: PPC: Move kvm_vcpu_init() invocation to common code"). # # The kvmppc_mmu_destroy() helper calls one of the following depending # on the KVM backend: # # - kvmppc_mmu_destroy_hv() which does nothing (Book3s HV) # # - kvmppc_mmu_destroy_pr() which undoes the effects of # kvmppc_mmu_init() (Book3s PR 32-bit) # # - kvmppc_mmu_destroy_pr() which undoes the effects of # kvmppc_mmu_init() (Book3s PR 64-bit) # # - kvmppc_mmu_destroy_e500() which does nothing (BookE e500/e500mc) # # It turns out that this is only relevant to PR KVM actually. And both # 32 and 64 backends need vcpu->arch.book3s to be valid when calling # kvmppc_mmu_destroy_pr(). So instead of calling kvmppc_mmu_destroy() # from kvm_arch_vcpu_destroy(), call kvmppc_mmu_destroy_pr() at the # beginning of kvmppc_core_vcpu_free_pr(). This is consistent with # kvmppc_mmu_init() being the last call in kvmppc_core_vcpu_create_pr(). # # For the same reason, if kvmppc_core_vcpu_create_pr() returns an # error then this means that kvmppc_mmu_init() was either not called # or failed, in which case kvmppc_mmu_destroy() should not be called. # Drop the line in the error path of kvm_arch_vcpu_create(). # # Fixes: ff030fdf5573 ("KVM: PPC: Move kvm_vcpu_init() invocation to common code") # Signed-off-by: Greg Kurz # Reviewed-by: Sean Christopherson # Signed-off-by: Michael Ellerman # Link: https://lore.kernel.org/r/158455341029.178873.15248663726399374882.stgit@bahia.lan # < /opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux-gcc --version # < /opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux-ld --version # < git log --format=%s --max-count=1 1d0c32ec3b860a32df593a22bad0d1dbc5546a59 # < make -s -j 32 ARCH=powerpc O=/kisskb/build/powerpc-fixes_mpc85xx_defconfig_powerpc-gcc4.6 CROSS_COMPILE=/opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux- mpc85xx_defconfig # < make -s -j 32 ARCH=powerpc O=/kisskb/build/powerpc-fixes_mpc85xx_defconfig_powerpc-gcc4.6 CROSS_COMPILE=/opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux- help # make -s -j 32 ARCH=powerpc O=/kisskb/build/powerpc-fixes_mpc85xx_defconfig_powerpc-gcc4.6 CROSS_COMPILE=/opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux- olddefconfig # make -s -j 32 ARCH=powerpc O=/kisskb/build/powerpc-fixes_mpc85xx_defconfig_powerpc-gcc4.6 CROSS_COMPILE=/opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux- /kisskb/src/kernel/printk/printk.c: In function 'devkmsg_sysctl_set_loglvl': /kisskb/src/kernel/printk/printk.c:204:16: warning: 'old' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/proc/inode.c: In function 'proc_reg_open': /kisskb/src/include/linux/list.h:72:12: warning: 'pdeo' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/proc/inode.c:338:21: note: 'pdeo' was declared here /kisskb/src/sound/soc/codecs/wm8960.c: In function 'wm8960_configure_clocking': /kisskb/src/sound/soc/codecs/wm8960.c:800:70: warning: 'j' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/sound/soc/codecs/wm8960.c:797:68: warning: 'i' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/mm/hugetlb.c: In function 'alloc_pool_huge_page': /kisskb/src/mm/hugetlb.c:1426:5: warning: 'page' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/kernel/trace/trace_events.c: In function 'event_create_dir': /kisskb/src/kernel/trace/trace_events.c:2040:6: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/ext4/extents.c: In function 'ext4_convert_unwritten_io_end_vec': /kisskb/src/fs/ext4/extents.c:5009:23: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/tty/serial/8250/8250_core.c: In function 'univ8250_release_irq': /kisskb/src/drivers/tty/serial/8250/8250_core.c:248:18: warning: 'i' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/tty/serial/8250/8250_core.c:228:19: note: 'i' was declared here /kisskb/src/drivers/base/regmap/regmap.c: In function 'regmap_raw_read': /kisskb/src/drivers/base/regmap/regmap.c:2598:6: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/base/regmap/regmap.c: In function '_regmap_raw_write': /kisskb/src/drivers/base/regmap/regmap.c:1859:6: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/net/ethernet/freescale/fs_enet/mac-scc.c: In function 'allocate_bd': /kisskb/src/drivers/net/ethernet/freescale/fs_enet/mac-scc.c:139:6: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] /kisskb/src/drivers/usb/core/devio.c: In function 'async_completed': /kisskb/src/drivers/usb/core/devio.c:625:23: warning: 'errno' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/udf/unicode.c: In function 'udf_name_conv_char': /kisskb/src/fs/udf/unicode.c:132:8: warning: 'c' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/io_uring.c: In function '__io_sqe_files_update': /kisskb/src/fs/io_uring.c:5824:13: warning: 'err' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/arch/powerpc/boot/dts/fsl/mpc8541cds.dts:330.3-21: Warning (pci_device_bus_num): /pci@e0008000/i8259@19000:bus-range: PCI bus number 1 out of range, expected (0 - 0) /kisskb/src/arch/powerpc/boot/dts/fsl/mpc8555cds.dts:330.3-21: Warning (pci_device_bus_num): /pci@e0008000/i8259@19000:bus-range: PCI bus number 1 out of range, expected (0 - 0) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc9270c) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) INFO: Uncompressed kernel (size 0xc81f74) overlaps the address of the wrapper(0x400000) INFO: Fixing the link_address of wrapper to (0xd00000) Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6066813 Bytes = 5924.62 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6065001 Bytes = 5922.85 KiB = 5.78 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6066916 Bytes = 5924.72 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6066163 Bytes = 5923.99 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6064811 Bytes = 5922.67 KiB = 5.78 MiB Load Address: 00d00000 Entry Point: 00d002e8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6067391 Bytes = 5925.19 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6064809 Bytes = 5922.67 KiB = 5.78 MiB Load Address: 00d00000 Entry Point: 00d002e8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6066903 Bytes = 5924.71 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002e8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6068001 Bytes = 5925.78 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6066890 Bytes = 5924.70 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002e8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6068721 Bytes = 5926.49 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6066160 Bytes = 5923.98 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6064805 Bytes = 5922.66 KiB = 5.78 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6068629 Bytes = 5926.40 KiB = 5.79 MiB Load Address: 00d00000 Entry Point: 00d002a8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6065003 Bytes = 5922.85 KiB = 5.78 MiB Load Address: 00d00000 Entry Point: 00d002e8 Image Name: Linux-5.6.0-rc2-g1d0c32ec3b86 Created: Fri Mar 20 14:54:25 2020 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 6035276 Bytes = 5893.82 KiB = 5.76 MiB Load Address: 00000000 Entry Point: 00000000 Completed OK # rm -rf /kisskb/build/powerpc-fixes_mpc85xx_defconfig_powerpc-gcc4.6 # Build took: 0:02:09.403613